第十五讲 GridView数据绑定控件(二)

本文详细讲解了GridView控件在ASP.NET中的使用,包括如何在GridView中将True/FALSE转换为男/女,添加新列如HyperLinkField和CommandField,以及编辑、取消和更新操作的实现。重点介绍了RowDataBound事件的应用,以及在编辑模式下处理性别转换和数据绑定的问题。还探讨了需要两次点击编辑按钮的原因和解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主要内容
    续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().
        原来,系统在执行是竟然先进行了重加载数据,再将子控件中的数据获取到并赋值给我的对象变量。卧槽,这个问题搞的我昨晚三点才睡觉,也没有想明白。看了钻牛角尖真是自做自受,停下来,搞点其它的事情做做,再回头来看,可能思路就变幻过来了。



        
        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值