【新手踩坑】GridView事件之RowUpdating事件

项目简介及描述

使用VS2019通过SqlDataSource、GridView控件,连接MySQL获取memberInfo表中的所有数据显示在GridView中,同时可以通过GridView自带的“编辑”中修改表格数据的功能,将修改的数据回传给MySQL。


问题描述及解决思路

1. 简单地在GridView编辑中添加了CommandField属性下的"编辑、更新、取消",结果弹出错误——“除非指定了 UpdateCommand,否则数据源“SqlDataSource1”不支持更新操作”。

配置SqlDataSource1控件的事件UpdateCommand,获取修改后的数据表GridView上的所有数据,在后端CS文件里自己写Update语句更新MySQL。
由于是MySQL数据库在VS2019不太兼容SqlDataSource1配置,只能后台获取GridView的行、列、字段名,配置SqlDataSource1.UpdateCommand的属性。

2.简单地使用GridView.Rows[i].Cells[j]获取的是空值。 按网上所说((TextBox)(GridView.Row[e.RowIndex].Cells[1].Controls[0])).Text.ToString().Trim()提示越界,均不可取出GridView中的值。
GridView.RowUpdating(GridViewUpdateEventArgs e) 方法下获取e.NewKey[列号].ToString(),就能获取除了主键第一列以外的一列数据,所以只需要遍历剩下列就能取出他们的数据了。


解决方案

这个事件类下有四个可以用的属性。
GridViewUpdateEventArgs.Keys        
	返回:IOrderedDictionary  主键列上的某行的值    
	使用:GridViewUpdateEventArgs.Keys[行号]
GridViewUpdateEventArgs.NewValues   
	返回:IOrderedDictionary  非主键列的刚修改GridView行某列上新修改后的值  
	使用:GridViewUpdateEventArgs.NewValues[列号]
GridViewUpdateEventArgs.OldValues   
	返回:IOrderedDictionary  非主键列的刚修改GridView行某列上未修改前的值  
	使用:GridViewUpdateEventArgs.OldValues[列号]
GridViewUpdateEventArgs.RowIndex    
	返回:int32 用户刚修改GridView的行的行号

后端
采取了很笨的方法见笑。下面是先配置GridView控件中RowUpdating事件方法,用户在前端页点击“编辑”,然后填入了想要改的数据后,点击“更新”,会触发此方法。
这个事件绑定在GridView控件的RowUpdating事件上!

   protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        //获取当前条件字段值(主关键字值)
        string conditionValue = GridView1.DataKeys[e.RowIndex].Value.ToString();
        //获取条件字段名
        string conditionColumnName = "memberID";
        //初始SQL语句
        string sql = "Update `memberInfo` SET ";
        for (int i = 0; i < GridView1.HeaderRow.Cells.Count-2; i++)
        {
            string UpdateColumnName="";
            //懒得继续研究怎么从GridView1.HeaderRow里如何取出值了,我放弃只能写个笨方法了
            switch (i)
            {
                case 0: UpdateColumnName = "userID";break;
                case 1: UpdateColumnName = "memberName"; break;
                case 2: UpdateColumnName = "comsumptionTimes"; break;
                case 3: UpdateColumnName = "consumptionAmount"; break;
                case 4: UpdateColumnName = "discount"; break;
                default:  break;
            }

            //第i个当前行的字段值
            string UpdateValue = e.NewValues[i].ToString();
            //增加SQL语句段
            sql += string.Format(" {0} = '{1}' ", UpdateColumnName, UpdateValue);
            if (i != GridView1.HeaderRow.Cells.Count - 3)
                sql += ",";
        }
        //把最后WHERE语句填进去
        sql+= string.Format(" where {0}='{1}'", conditionColumnName, conditionValue);
        //把SQL语句给SqlDataSource的UpdateCommand
        SqlDataSource1.UpdateCommand = sql;
        GridView1.DataBind();
    }

前端
编辑之前未修改数据时的情况
点击编辑后的情况

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:OrderManageConnectionString_NewsInfo %>" ProviderName="<%$ ConnectionStrings:OrderManageConnectionString_NewsInfo.ProviderName %>" SelectCommand="SELECT memberID, userID, memberName, comsumptionTimes, consumptionAmount, discount FROM memberInfo"></asp:SqlDataSource>
<div class="content-sqlDataSourceOther" >
    <asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1" AutoGenerateColumns="False" DataKeyNames="memberID" OnRowUpdating="GridView1_RowUpdating" CssClass="table table-bordered table-hover"  >
        <Columns>
            <asp:BoundField DataField="memberID" HeaderText="memberID" InsertVisible="False" ReadOnly="True" SortExpression="memberID" />
            <asp:BoundField DataField="userID" HeaderText="userID" SortExpression="userID" />
            <asp:BoundField DataField="memberName" HeaderText="memberName" SortExpression="memberName" />
            <asp:BoundField DataField="comsumptionTimes" HeaderText="comsumptionTimes" SortExpression="comsumptionTimes" />
            <asp:BoundField DataField="consumptionAmount" HeaderText="consumptionAmount" SortExpression="consumptionAmount" />
            <asp:BoundField DataField="discount" HeaderText="discount" SortExpression="discount" />
            <asp:CommandField ShowEditButton="True" />
        </Columns>
    </asp:GridView>
</div>

官方关于GridViewUpdateEventArgs.NewValues 属性
https://docs.microsoft.com/zh-cn/dotnet/api/system.web.ui.webcontrols.gridviewupdateeventargs.newvalues?view=netframework-4.8&viewFallbackFrom=netframework-1.1
在GridViewUpdateEventArgs(C#/ ASP.NET)中获取列名的问答
https://www.orcode.com/question/1298421_kd6698.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值