首页 > 代码库 > 关于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#!!!!