You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}
解决方案

问题根源

  1. 单向绑定导致值丢失:EditItemTemplate中的TextBox用了Eval()绑定,这是单向绑定,仅在首次加载时赋值,回发时不会保留用户输入的新值,点击Update时文本框会被重置为空。
  2. 回发时可能触发重复绑定:CheckBox_Selected_Values()方法如果在回发时重新绑定了GridView,会覆盖用户输入的内容。

修复步骤

  1. 改用双向绑定:将所有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>
  1. 检查回发时的数据绑定逻辑:确认CheckBox_Selected_Values()方法没有在回发时调用Show_Data()或其他GridView绑定方法,如果有,将相关逻辑移到!IsPostBack判断内,或者避免在编辑状态下触发数据绑定。

  2. 完善更新事件:更新完成后,退出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 17:40:55