主要内容
续GridView控件使用讲解
1. 类似于在性别列中的True/false,如何在GridView控件中,将True/fase改成男/女呢?
这里又用到一个GridView中非常重要的事件:RowDataBound---在对行进行了数据绑定后激发的。即,如果被绑定的数据有10条,那个此事件将会被触12次,为什么呢?
这是因为GridView控件有个列头和列脚,在进行数据绑定时也同样会触发这个RowDataBound事件。
注意:这个时候就要对性别字段进行数据处理了,那么,按照上节所讲,GridView控件的编辑列中,前六个字段功能单一,如BoundField,它只能用于显示数据,不能对数据进行处理操作,如果需要对数据进行特殊处理时,需要将其字段类型(BoundField),转换成模板字段(TemplateField)才行。
如实例代码:
/// <summary>
/// 控件中的数据转换操作
/// </summary>
/// <param name="sender">事件源对象</param>
/// <param name="e">事件源参数对象</param>
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
//因为此事件,会把GridView控件的列头列脚作为触发事件的源,所以在这里
//需要进行判断以便过滤这两个不必要的行
if (e.Row.RowType == DataControlRowType.DataRow)
{
//DataControlRowType是个枚举,它包含列头(Header)列脚(Footer)
//DataRow就是内容中的行数据类型
//注意,因为GridView控件编辑列选项中的前六个字段功能单一,如:BoundField
//它的功能只是在列头显示信息,如果需要其它的数据处理操作,需要将其先转换成
//TemplateField字段。进入编辑模板就可以看到被转换后的字段了,在Item Template项
//模板中默认使用了Label控件,只是这个Label控件有了一定的智能。但它必竟还是一个
//Label控件,由于修改了Label控件的ID属性,所以有了下面的操作
string sex = (e.Row.FindControl("lblSex") as Label).Text;
if (sex == "True")//注意这里的True是个字符串哦
(e.Row.FindControl("lblSex") as Label).Text = "男";
else
(e.Row.FindControl("lblSex") as Label).Text = "女";
}
}
2. GridView控件智能提示中的,添加新列,这里实例操作的背景是,当用户想要看到备注信息的详细信息时,可以通过一个超连接进行查看。
1. 选择字段类型HyperLinkField,这里选择是超连接文本就有了下面几个选项
2. 页眉文本,显示在列标题位置的文本信息
3. 超连接文本,用户需要点击的文本超连接
4. 超连接URL,连接的地址,这里选择是从数据字段获取URL
这一项下面有两个需要填充地方:
1. 是参数值(这里可以使用学生的ID,stuID)
2. 是URL格式的超连接字符串,如使用某页面来显示这个详细信息,StudentDetails.aspx?id={0} ,那字符串中的{0} 就是指向上面的参数stuID。只是这里没有创建StuDetails.aspx这个页面,来接收这个变量并进行查寻操作。
3. GridView控件智能提示中的,添加新列,这一次操作的一个按钮CommandField字段类型的。
1. 选择字段类型CommandField,它有下面几个选项
2. 页眉文本,同上(你懂的)
3. 按钮类型(Link超连接样式,或普通按钮样式)
4. 命令按钮,删除,编辑,选择,显示取消按钮等,节省了手动从工具栏里拖放按钮的麻烦。
注意:每个命令按钮都有一个对应的事件哦。
在这个实例中,添加了两个按钮,编辑和删除 以Link的样式显示
在页面中就会生成两个超连接,那这两个超连接就会触发GridView的两个事件,RowEditing,RowDeleting两个事件,这个两个事件就需要我们人为的手动去进行处理。
1. 在RowEditing事件中,如何实例点击那一行的编辑按钮就是将该行内容转换为编辑状态呢?
这里老师给的思路是前一节中提到的编辑模板中的EditItem Template,这个编辑模板,当单击这个编辑按钮时,GridView就会将Item Template这个项模板转换成EditItem Template编辑项模板。
那如问题所问,如何实例单击那一行就转换那一行呢?
这里是通过事件中的源参数对象携带的NewEditIndex属性来指定的。
即,GridView预转换为编辑状态的行索引= 参数对象携带的行索引
this.GridView1.EditIndex=e.NewEditIndex;
2. 为什么需要单击两次编辑按钮呢?
当单击编辑按钮是,GridView只是将项模板转换成编辑项模板,而数据绑定只是将数据加载到了项目模板中,当转换成编辑项模板时,并没有将数据加载到编辑项模板。
经测试证明,如果当将项模板转换到编辑模板时再次加载数据绑定到编辑项模板,此类现象即消除了。
3. 点击编辑按钮时,性别列的数据转换会报错?
这个应该不难理解,那是因,数据转换操作只在项模板中进行了转换,RowDataBound事件中也只是对Label标签进转换操作,当转换到编辑项模板时RowDataBound事件并没有对其标签进行获取并做转换操作,故有此报错现象。
在此,RowDataBound事件只是老师说的,演示一下此事件的用法,必竟它是非常重要的。
对于性别的转换,最好的方法是在编辑模板中的性别的Text属性的自定义代码进行三目运算符操作:
Eval("stuSex").ToString()=="True"?"男":"女"
注意:当进行数据类型转换时,使用Eval方法。
4. GridView控件的修改操作
需要考虑某些列的特殊情况,如,学号是不能修改的,性别如何修改呢?因为它的值是True/false,不如男,女来的简单。
将所有的字段都转换成模板字段:
1. 将学号的编辑项模板中的文本框控件替换成Label控件就可以了。
2. 改变编辑模板中的控件显示的尺寸,可以像WinForm中一样,点击该控件,修改它的width属性即可
3. 同样,在编辑模板中的性别这项,它的编辑项模板中的控件也可以替换成下拉式菜单DropDwonList控件,编辑控件的项,男和女,同时设置项对应的Value值。然后再在性别的DataBindings中的SelectedValues的代码表达式中Bind("stuSex").这样,当SelectedValues的值为True时,就显示男,否则就显示女了。
5. GridView控件的取消操作
取消按钮关联的GridView控件的RowCancelingEdit事件
它就是将编辑项模板再转换成项模板。
即:this.GridView1.EditIndex=-1;即可
记得还要再进一次数据绑定
6. GridView控件的更新操作
更新按钮关联的是GridView控件的RowUpDating事件
1. 找出GridView中子控件的ID,获取其文本值
从GridView控件的行集合中索引到行,找到对应的控件ID,转控件类型,通过转换后的控件类型的属性来获取其携带的值
如:int id =Convert.ToInt32((this.GridView1.Rows[e.RowIndex].FindControl("lblStuID") as Label).Text);
2. 将值传递给数据库进行更新
7. 注意:这里补充一点,我仿照老师的实例做,但是更新过程总是无法获取修改后的数据,GridView控件中子控件的值,但是在公司操作就没有问题,寻根究根,终于明白了是什么原因?
更新操作后要再加载一次数据,这时就发现,原来,我在页面加载事件中没有进行首次加载的判断,即IsPostBack().
原来,系统在执行是竟然先进行了重加载数据,再将子控件中的数据获取到并赋值给我的对象变量。卧槽,这个问题搞的我昨晚三点才睡觉,也没有想明白。看了钻牛角尖真是自做自受,停下来,搞点其它的事情做做,再回头来看,可能思路就变幻过来了。
续GridView控件使用讲解
1. 类似于在性别列中的True/false,如何在GridView控件中,将True/fase改成男/女呢?
这里又用到一个GridView中非常重要的事件:RowDataBound---在对行进行了数据绑定后激发的。即,如果被绑定的数据有10条,那个此事件将会被触12次,为什么呢?
这是因为GridView控件有个列头和列脚,在进行数据绑定时也同样会触发这个RowDataBound事件。
注意:这个时候就要对性别字段进行数据处理了,那么,按照上节所讲,GridView控件的编辑列中,前六个字段功能单一,如BoundField,它只能用于显示数据,不能对数据进行处理操作,如果需要对数据进行特殊处理时,需要将其字段类型(BoundField),转换成模板字段(TemplateField)才行。
如实例代码:
/// <summary>
/// 控件中的数据转换操作
/// </summary>
/// <param name="sender">事件源对象</param>
/// <param name="e">事件源参数对象</param>
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
//因为此事件,会把GridView控件的列头列脚作为触发事件的源,所以在这里
//需要进行判断以便过滤这两个不必要的行
if (e.Row.RowType == DataControlRowType.DataRow)
{
//DataControlRowType是个枚举,它包含列头(Header)列脚(Footer)
//DataRow就是内容中的行数据类型
//注意,因为GridView控件编辑列选项中的前六个字段功能单一,如:BoundField
//它的功能只是在列头显示信息,如果需要其它的数据处理操作,需要将其先转换成
//TemplateField字段。进入编辑模板就可以看到被转换后的字段了,在Item Template项
//模板中默认使用了Label控件,只是这个Label控件有了一定的智能。但它必竟还是一个
//Label控件,由于修改了Label控件的ID属性,所以有了下面的操作
string sex = (e.Row.FindControl("lblSex") as Label).Text;
if (sex == "True")//注意这里的True是个字符串哦
(e.Row.FindControl("lblSex") as Label).Text = "男";
else
(e.Row.FindControl("lblSex") as Label).Text = "女";
}
}
2. GridView控件智能提示中的,添加新列,这里实例操作的背景是,当用户想要看到备注信息的详细信息时,可以通过一个超连接进行查看。
1. 选择字段类型HyperLinkField,这里选择是超连接文本就有了下面几个选项
2. 页眉文本,显示在列标题位置的文本信息
3. 超连接文本,用户需要点击的文本超连接
4. 超连接URL,连接的地址,这里选择是从数据字段获取URL
这一项下面有两个需要填充地方:
1. 是参数值(这里可以使用学生的ID,stuID)
2. 是URL格式的超连接字符串,如使用某页面来显示这个详细信息,StudentDetails.aspx?id={0} ,那字符串中的{0} 就是指向上面的参数stuID。只是这里没有创建StuDetails.aspx这个页面,来接收这个变量并进行查寻操作。
3. GridView控件智能提示中的,添加新列,这一次操作的一个按钮CommandField字段类型的。
1. 选择字段类型CommandField,它有下面几个选项
2. 页眉文本,同上(你懂的)
3. 按钮类型(Link超连接样式,或普通按钮样式)
4. 命令按钮,删除,编辑,选择,显示取消按钮等,节省了手动从工具栏里拖放按钮的麻烦。
注意:每个命令按钮都有一个对应的事件哦。
在这个实例中,添加了两个按钮,编辑和删除 以Link的样式显示
在页面中就会生成两个超连接,那这两个超连接就会触发GridView的两个事件,RowEditing,RowDeleting两个事件,这个两个事件就需要我们人为的手动去进行处理。
1. 在RowEditing事件中,如何实例点击那一行的编辑按钮就是将该行内容转换为编辑状态呢?
这里老师给的思路是前一节中提到的编辑模板中的EditItem Template,这个编辑模板,当单击这个编辑按钮时,GridView就会将Item Template这个项模板转换成EditItem Template编辑项模板。
那如问题所问,如何实例单击那一行就转换那一行呢?
这里是通过事件中的源参数对象携带的NewEditIndex属性来指定的。
即,GridView预转换为编辑状态的行索引= 参数对象携带的行索引
this.GridView1.EditIndex=e.NewEditIndex;
2. 为什么需要单击两次编辑按钮呢?
当单击编辑按钮是,GridView只是将项模板转换成编辑项模板,而数据绑定只是将数据加载到了项目模板中,当转换成编辑项模板时,并没有将数据加载到编辑项模板。
经测试证明,如果当将项模板转换到编辑模板时再次加载数据绑定到编辑项模板,此类现象即消除了。
3. 点击编辑按钮时,性别列的数据转换会报错?
这个应该不难理解,那是因,数据转换操作只在项模板中进行了转换,RowDataBound事件中也只是对Label标签进转换操作,当转换到编辑项模板时RowDataBound事件并没有对其标签进行获取并做转换操作,故有此报错现象。
在此,RowDataBound事件只是老师说的,演示一下此事件的用法,必竟它是非常重要的。
对于性别的转换,最好的方法是在编辑模板中的性别的Text属性的自定义代码进行三目运算符操作:
Eval("stuSex").ToString()=="True"?"男":"女"
注意:当进行数据类型转换时,使用Eval方法。
4. GridView控件的修改操作
需要考虑某些列的特殊情况,如,学号是不能修改的,性别如何修改呢?因为它的值是True/false,不如男,女来的简单。
将所有的字段都转换成模板字段:
1. 将学号的编辑项模板中的文本框控件替换成Label控件就可以了。
2. 改变编辑模板中的控件显示的尺寸,可以像WinForm中一样,点击该控件,修改它的width属性即可
3. 同样,在编辑模板中的性别这项,它的编辑项模板中的控件也可以替换成下拉式菜单DropDwonList控件,编辑控件的项,男和女,同时设置项对应的Value值。然后再在性别的DataBindings中的SelectedValues的代码表达式中Bind("stuSex").这样,当SelectedValues的值为True时,就显示男,否则就显示女了。
5. GridView控件的取消操作
取消按钮关联的GridView控件的RowCancelingEdit事件
它就是将编辑项模板再转换成项模板。
即:this.GridView1.EditIndex=-1;即可
记得还要再进一次数据绑定
6. GridView控件的更新操作
更新按钮关联的是GridView控件的RowUpDating事件
1. 找出GridView中子控件的ID,获取其文本值
从GridView控件的行集合中索引到行,找到对应的控件ID,转控件类型,通过转换后的控件类型的属性来获取其携带的值
如:int id =Convert.ToInt32((this.GridView1.Rows[e.RowIndex].FindControl("lblStuID") as Label).Text);
2. 将值传递给数据库进行更新
7. 注意:这里补充一点,我仿照老师的实例做,但是更新过程总是无法获取修改后的数据,GridView控件中子控件的值,但是在公司操作就没有问题,寻根究根,终于明白了是什么原因?
更新操作后要再加载一次数据,这时就发现,原来,我在页面加载事件中没有进行首次加载的判断,即IsPostBack().
原来,系统在执行是竟然先进行了重加载数据,再将子控件中的数据获取到并赋值给我的对象变量。卧槽,这个问题搞的我昨晚三点才睡觉,也没有想明白。看了钻牛角尖真是自做自受,停下来,搞点其它的事情做做,再回头来看,可能思路就变幻过来了。