ASP Web Forms:如何将OnRowDataBound的DropDownList数据传递到OnRowUpdating
解决GridView编辑行替换DropDownList后OnRowUpdating取不到值的问题
你的问题根源在于只是添加了DropDownList到单元格的Controls集合,并没有替换掉原来的TextBox,所以在OnRowUpdating中取Controls[0]时仍然是原来的TextBox,自然拿不到DropDownList的选中值。以下是具体的解决步骤:
1. 修改OnRowDataBound事件:替换控件而非隐藏
在编辑行绑定事件中,移除原有的TextBox,添加并配置DropDownList,同时设置ID方便后续查找,还要同步原TextBox的内容作为初始选中值:
protected void gv_OnRowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowState == DataControlRowState.Edit) { // 获取目标单元格中原有的TextBox TextBox tbox = e.Row.Cells[5].Controls[0] as TextBox; if (tbox != null) { DropDownList ddlEdit = new DropDownList(); ddlEdit.ID = "ddlEditColumn5"; // 设置唯一ID,用于后续查找 // 添加下拉选项 ddlEdit.Items.Add(new ListItem("Test1", "Test1")); ddlEdit.Items.Add(new ListItem("Test2", "Test2")); // 将原TextBox的值设为下拉框的初始选中值,保持编辑状态的一致性 ddlEdit.SelectedValue = tbox.Text.Trim(); // 移除原TextBox,将DropDownList添加到单元格控件集合 e.Row.Cells[5].Controls.Remove(tbox); e.Row.Cells[5].Controls.Add(ddlEdit); } } }
2. 修改OnRowUpdating事件:针对性获取DropDownList的值
在更新事件中,判断当前列是否是替换了DropDownList的列,通过ID查找控件并获取选中值:
protected void gvResults_OnRowUpdating(object sender, GridViewUpdateEventArgs e) { GridViewRow gvr = gvResults.Rows[e.RowIndex]; DataRow drNew = dt.NewRow(); for(int i = 0; i < gvr.Cells.Count; i++) { if (i == 5) // 处理替换了DropDownList的第6列(索引从0开始) { DropDownList ddl = gvr.Cells[i].FindControl("ddlEditColumn5") as DropDownList; if (ddl != null) { drNew[i] = ddl.SelectedValue.Trim(); } else { // 容错处理:如果没找到下拉框, fallback到TextBox取值 TextBox tbox = gvr.Cells[i].Controls[0] as TextBox; drNew[i] = tbox?.Text.Trim() ?? string.Empty; } } else { // 其他列保持原有的TextBox取值逻辑 TextBox tbox = gvr.Cells[i].Controls[0] as TextBox; drNew[i] = tbox?.Text.Trim() ?? string.Empty; } } // 此处添加你的数据更新逻辑,比如将drNew更新到数据源 // ... // 退出编辑状态并重新绑定GridView gvResults.EditIndex = -1; BindGridView(); // 假设你有绑定GridView的方法 }
关键说明
- 替换控件而非隐藏:直接移除原TextBox,确保单元格的Controls集合中只有DropDownList(或者将DropDownList放在第一位),避免后续混淆。
- 设置控件ID:通过
FindControl按ID查找是最可靠的方式,比依赖Controls索引更稳定。 - 同步初始选中值:编辑时保持下拉框的选中状态与原数据一致,提升用户体验。
内容的提问来源于stack exchange,提问作者newbieForAngular
相关产品推荐
相关产品推荐

