首页 > 代码库 > 关于GridView自定义绑定过程的行状态e.Row.RowState一点解析
关于GridView自定义绑定过程的行状态e.Row.RowState一点解析
GridView相信这个控件大家已经家喻户晓,而且用的也非常多了,本文针对GridView的行状态进行一点浅析,高手请留步,就此打住!
现在我们看个例子,现在要使用gridview输出一张订单表,订单有个状态字段取值为:0(未完成交易)1(已完成交易),现在重点是,我们绑定数据到gridview,显然绑定输出时候只能输出0和1,那么怎么实现将0输出为未完成交易,而1输出为已完成交易呢。这里我们就需要用到gridview为我们准备的数据行绑定事件了,如下图所示,我们订阅该事件,在gridview属性的闪电图标下面的选项中:
该事件是什么作用呢:打个比方整个输出表格的过程类似一群人去坐一个位置,位置1坐领导,位置2坐学生,现在我们要做的是,要位置2的学生,坐上三好学生,girdview绑定后,现在坐的就是学生,而该事件就是发生在这个学生坐上这个位置之后,因此,我们在这个事件响应函数里面做的就是将三号学生取代掉该学生!
然后在订阅该事件后的响应函数中输入以下代码:
/// <summary> /// 3.修改状态显示为:已完成-1/未完成-0 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow)//绑定数据行 { if (e.Row.RowState == DataControlRowState.Normal||e.Row.RowState==DataControlRowState.Alternate)//正常状态,I don‘t set other state,so it is not neccessary. { Label label1 = new Label(); label1.Text += e.Row.Cells[8].Text; Page.Controls.Add(label1); if (e.Row.Cells[8].Text =="0")//说明有未完成的订单,按钮可使用 { e.Row.Cells[8].Text = "未完成"; has_nopay = true; } else { e.Row.Cells[8].Text = "已完成"; } } } }
这段代码出现在gridview的行绑定事件中,首先我截取数据,如果该单元格显示的是0,那么我将其修改为未完成,反之 ,则修改为完成。
相信这段代码很多人见怪不怪了,但是那上面的几个判断条件是什么意思呢?现在我就一一分析。
一. 变量e
这是在建造行对象时产生的事件描述数据,它里面包含正在建造的当前行对象的信息,通过它我们可以取得正在建造的行对象和行对象中的单元格对象,并可以取得或设置这些对象相应的属性,这个变量的重要程度,直接决定了gridview在自定义操作中的霸主地位。
二、e.Row.RowType属性
它描述的是正在建造的行对象的类型(页眉、页脚、数据行、分页行、分隔符)
取值为:DataControlRowType枚举类型
(1)DataRow:数据行,也就是我们判断经常使用到,他表示我们操作的对象只是绑定的数据部分,而不是页脚、页眉之类的部分
(2)EmptyDataRow:空数据行,也就是当前表示的是数据记录为空的行,这个必须在我们设置了空模板时候有效
(3)Footer:当前行是脚注行
(4)Hearder:当前行是标题行
(5)Separator:当前行是分隔符
(6)Pager:当前行是分页行
有了这些,我们就可以判断当前行是什么了,然后就可以执行响应的操作,比如上面这个例子,我就先判断是不是数据行,从而进行下一步的操作!
if (e.Row.RowType == DataControlRowType.DataRow)//绑定数据行
下一步的问题来了,我们怎么去判断数据行是处于什么状态呢(有点基础的同学应该知道,数据行可能会处于多种状态,比如编辑状态、选中状态、正常态等),这时候我需要的是正常状态下的所有数据行,怎么判断呢?见三.
三、e.Row.RowState属性
它表示正在建造的行对象的状态(普通状态、交替状态、编辑状态、选中状态等)
(1)Alternate:交替态行
(2)Normal:正常态行
(3)Edit:编辑态行
(4)Insert:插入态行
(5)Selected:选中态。
它代表我们的操作只对数据行起作用,不对页眉和页脚起作用(因为页眉页脚的文本中并不包含我们需要的数据)。并且仅当数据行处理普通状态和交替状态时起作用,在编辑和选中状态不是不起作用的(编辑状态下,数据不是显示在单元格的Text中,而是显示在单元格的控件中的)。因此,对于如何取得表中相应位置处的值,判断数据行的状态十分重要,现在我们的例子只是修改绑定数据行的某个单元格的值,所以只需判断当前行的状态为Normal或者Alternate即可,记住,不要少任何一项,少了会遗漏行数据,我之前不写Alternate这一状态,那么就无法取得第二条记录的数据,如下图,此时的第二行数据无法扑捉,原因是该行数据在判断行状态的时候被跳转了:
姑且可以认为Normal取的是偶数行数据,Alternate取的是奇数行(交替航)数据,他们的共同使用可以保证我们取得所有的绑定行数据。如此,我们也就完完全全的掌控了自定选择行的过程,这时候我们就可以轻轻松松的完成自定义绑定的过程了。
找出绑定数据行对应的单元格数据,执行修改!
if (e.Row.RowState == DataControlRowState.Normal||e.Row.RowState==DataControlRowState.Alternate)//正常状态,I don‘t set other state,so it is not neccessary. { Label label1 = new Label(); label1.Text += e.Row.Cells[8].Text; Page.Controls.Add(label1); if (e.Row.Cells[8].Text =="0")//说明有未完成的订单,按钮可使用 { e.Row.Cells[8].Text = "未完成"; has_nopay = true; } else { e.Row.Cells[8].Text = "已完成"; } }
完成效果如下:
好了,我的讲解到此为止。
第一次写博!有什么不好的地方大家见谅
------------------------------------------------------------------------------------------------------------------------------------------------------------热爱ASP.NET,热爱C#!!!!