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
相关产品推荐
相关产品推荐

