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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 04:18:23