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

ASP.NET C#中数据绑定GridView编辑文本框输入值无法获取的问题

GridView编辑模式无法获取用户输入值的解决方法

问题背景

已实现ASP.NET GridView的编辑功能(点击编辑按钮后单元格转为带初始值的文本框,按钮切换为更新/取消),但点击更新时无法获取用户输入的新值:

  • 调用FindControl、Request.Form均返回null
  • 硬编码控件索引((TextBox)(row.Cells[5].Controls[0])).Text只能拿到原始值,用户输入的新内容不生效

相关代码

GridView前端定义

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server" >
   <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" BackColor="White" HeaderStyle-VerticalAlign="Bottom"
       RowStyle-Wrap="true" HeaderStyle-Wrap="true" OnDataBound ="OnDataBound" AllowSorting="True" HeaderStyle-Height="50px"
       OnSorting="GridView1_SelectedIndexChanged" CssClass="reportData" BorderColor="#DEDFDE" BorderStyle="None" BorderWidth="1px" 
       CellPadding="4" ForeColor="Black" GridLines="Vertical" AutoGenerateEditButton="true" OnRowEditing ="GridView_RowEditing" 
       OnRowCancelingEdit="GridView_RowCancellingEdit" OnRowUpdating="GridView_RowUpdating" DataKeyNames ="PropID,Project Type" >
       
       <AlternatingRowStyle BackColor="White" />
       <FooterStyle BackColor="#CCCC99" />
<HeaderStyle Wrap="True" Height="50px" BackColor="#6B696B" Font-Bold="True" ForeColor="White"></HeaderStyle>

       <PagerStyle BackColor="#F7F7DE" ForeColor="Black" HorizontalAlign="Right" />

<RowStyle Wrap="True" BackColor="#F7F7DE"></RowStyle>
       <SelectedRowStyle BackColor="#CE5D5A" Font-Bold="True" ForeColor="White" />
       <SortedAscendingCellStyle BackColor="#FBFBF2" />
       <SortedAscendingHeaderStyle BackColor="#848384" />
       <SortedDescendingCellStyle BackColor="#EAEAD3" />
       <SortedDescendingHeaderStyle BackColor="#575357" />
   </asp:GridView>
</asp:Content>

后台绑定GridView代码

SqlConnection con = new SqlConnection(constr);
con.Open();
SqlCommand com = new SqlCommand(sqlString, con);
SqlDataAdapter da = new SqlDataAdapter(com);
DataSet ds = new DataSet();
da.Fill(ds);

BoundField bf = new BoundField
{
    HeaderText = "State",
    DataField = "State"
};
GridView1.Columns.Add(bf);

bf = new BoundField
{
    HeaderText = "Status",
    DataField = "Status"
};

bf.ItemStyle.CssClass = "statusField";
bf.HeaderStyle.CssClass = "statusHead";

GridView1.Columns.Add(bf);

// 其余字段略

GridView1.AutoGenerateColumns = false;
GridView1.DataBind();
con.Close();

RowUpdating事件代码

GridViewRow row = GridView1.Rows[e.RowIndex];

for (int i = 0; i < GridView1.Rows.Count; i++)
{
    string text = ((TextBox)(row.Cells[5].Controls[0])).Text;
}

核心原因

页面回发时,GridView被重新绑定了原始数据库数据,覆盖了用户在文本框中输入的新值。ASP.NET WebForms通过ViewState维护控件状态,如果在Page_Load等回发触发的事件中未做判断就重新绑定,会导致用户输入丢失。

解决步骤

1. 仅在首次加载时绑定GridView

将绑定逻辑放到!IsPostBack判断中,避免回发时覆盖用户输入:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        BindGridView();
    }
}

// 封装绑定逻辑为单独方法
private void BindGridView()
{
    SqlConnection con = new SqlConnection(constr);
    con.Open();
    SqlCommand com = new SqlCommand(sqlString, con);
    SqlDataAdapter da = new SqlDataAdapter(com);
    DataSet ds = new DataSet();
    da.Fill(ds);

    BoundField bf = new BoundField
    {
        HeaderText = "State",
        DataField = "State"
    };
    GridView1.Columns.Add(bf);

    bf = new BoundField
    {
        HeaderText = "Status",
        DataField = "Status"
    };

    bf.ItemStyle.CssClass = "statusField";
    bf.HeaderStyle.CssClass = "statusHead";

    GridView1.Columns.Add(bf);

    // 其余字段略

    GridView1.AutoGenerateColumns = false;
    GridView1.DataBind();
    con.Close();
}

2. 正确获取用户输入值

在RowUpdating事件中,优先使用e.NewValues获取新值(这是GridView提供的专门用于编辑场景的属性),或者通过遍历控件找到文本框:

protected void GridView_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    // 方法1:使用e.NewValues(推荐)
    string state = e.NewValues["State"].ToString();
    string status = e.NewValues["Status"].ToString();

    // 方法2:通过遍历控件定位文本框
    GridViewRow row = GridView1.Rows[e.RowIndex];
    TextBox statusTextBox = null;
    foreach (Control ctrl in row.Cells[对应列索引].Controls)
    {
        if (ctrl is TextBox tb)
        {
            statusTextBox = tb;
            break;
        }
    }
    if (statusTextBox != null)
    {
        string newStatus = statusTextBox.Text;
        // 处理逻辑
    }

    // 生成XML字符串并调用API
    // ...

    // 退出编辑模式并重新绑定数据
    GridView1.EditIndex = -1;
    BindGridView();
}

注意事项

  • 确保GridView的ViewState未被禁用(默认启用),否则无法维护控件状态
  • 如果使用BoundField,编辑模式下的TextBox ID是自动生成的,无法直接通过ID查找,因此e.NewValues是更可靠的方式
  • 若需要更新数据源后重新绑定,调用封装好的BindGridView()方法即可

内容的提问来源于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.18 05:30:42