ASP.NET GridView点击Update按钮首次清空单元格,需二次点击生效求助
问题描述
我配置了绑定数据的GridView,添加了Edit按钮,点击后所有字段变为填充数据库数据的文本框,Edit按钮替换为Update和Cancel按钮,这部分功能正常。但修改文本框值后点击Update按钮,所有单元格文本框内容会被清空;重新输入内容后第二次点击Update,输入值才会传入更新事件,这不符合预期。之前见过Edit按钮需两次点击的问题,但对应的解决方案不适用我的场景。
Page_Load 代码
{ if (!this.IsPostBack) { Build_DDL(); Build_Turn_Checkbox_List(); Show_Data(); } CheckBox_Selected_Values(); }
GridView 声明
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" HeaderStyle-CssClass="headerClass" HeaderStyle-VerticalAlign="Bottom" RowStyle-Wrap="true" HeaderStyle-Wrap="true" OnDataBound ="OnDataBound" AllowSorting="True" HeaderStyle-Height="50px" OnSorting="GridView1_SelectedIndexChanged" CssClass="reportData" OnRowDataBound="GridView_OnRowDataBound" OnRowCancelingEdit="GridView1_RowCancelEdit" OnRowEditing="GridView1_RowEditing" OnRowUpdating="GridView1_RowUpdating"> <HeaderStyle VerticalAlign="Bottom" Wrap="True" Height="50px" /> <RowStyle Wrap="True" CssClass="oddRow" /> <AlternatingRowStyle CssClass="evenRow" /> <Columns> <asp:TemplateField> <ItemTemplate> <asp:Button ID ="btn_Edit" runat="server" Text="Edit" CommandName="Edit" /> </ItemTemplate> <EditItemTemplate> <asp:Button ID="btn_Update" runat="server" Text="Update" CommandName="Update"/> <asp:Button ID="btn_Cancel" runat="server" Text="Cancel" CommandName="Cancel" /> </EditItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="State" Visible="false"> <ItemTemplate> <asp:Label ID="lbl_state" runat="server" Text='<%#Eval("STATE") %>'></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="txt_state" runat="server" Text='<%#Eval("STATE") %>'></asp:TextBox> </EditItemTemplate>
其余字段均采用相同的构建方式。
更新事件代码
{ //declare variables string stateVal; //set up textboxes GridViewRow row = GridView1.Rows[e.RowIndex]; TextBox txt_State = (TextBox)row.FindControl("txt_state"); stateVal = txt_State.Text; }
解决方案
问题根源
- 单向绑定导致值丢失:EditItemTemplate中的TextBox用了
Eval()绑定,这是单向绑定,仅在首次加载时赋值,回发时不会保留用户输入的新值,点击Update时文本框会被重置为空。 - 回发时可能触发重复绑定:
CheckBox_Selected_Values()方法如果在回发时重新绑定了GridView,会覆盖用户输入的内容。
修复步骤
- 改用双向绑定:将所有EditItemTemplate中TextBox的
Text='<%#Eval("字段名") %>'改成Text='<%#Bind("字段名") %>',Bind()支持双向绑定,既能显示初始值,也能在回发时保留用户输入。示例:
<asp:TemplateField HeaderText="State" Visible="false"> <ItemTemplate> <asp:Label ID="lbl_state" runat="server" Text='<%#Eval("STATE") %>'></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="txt_state" runat="server" Text='<%#Bind("STATE") %>'></asp:TextBox> </EditItemTemplate> </asp:TemplateField>
检查回发时的数据绑定逻辑:确认
CheckBox_Selected_Values()方法没有在回发时调用Show_Data()或其他GridView绑定方法,如果有,将相关逻辑移到!IsPostBack判断内,或者避免在编辑状态下触发数据绑定。完善更新事件:更新完成后,退出GridView的编辑状态并重新绑定数据,确保界面同步更新。示例:
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) { // 获取用户输入值 GridViewRow row = GridView1.Rows[e.RowIndex]; string stateVal = ((TextBox)row.FindControl("txt_state")).Text; // 补充你的数据库更新逻辑 // 退出编辑状态并重新绑定数据 GridView1.EditIndex = -1; Show_Data(); }
内容的提问来源于stack exchange,提问作者Troy Mulkey
相关产品推荐
相关产品推荐

