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

Ascx中GridView行内编辑时DropDownList空引用错误解决求助

解决GridView行内编辑中EditItemTemplate下拉列表绑定的空引用错误

问题根源

  1. 控件未初始化:在OnRowEditing事件中设置EditIndex后,未重新绑定GridView,此时目标行仍处于ItemTemplate状态,EditItemTemplate内的ChannelColumnDropDownList1还未被实例化,FindControl返回null,触发空引用异常。
  2. 数据源类型错误:直接将cachedData.Rows[0](单个DataRow)作为DropDownList的数据源,DropDownList需要集合类型(如DataTable、List等)而非单个数据行。
  3. 缺少空值校验:未对Session中存储的cachedData做null判断,若Session数据丢失会直接引发转换或空引用错误。

修正方案

1. 调整OnRowEditing事件逻辑

设置编辑索引后立即重新绑定GridView,触发RowDataBound事件处理下拉列表绑定:

protected void OnRowEditing(object sender, GridViewEditEventArgs e)
{
    GridView1.EditIndex = e.NewEditIndex;
    BindGridView(); // 调用GridView基础数据绑定方法
}

2. 在RowDataBound事件中绑定下拉列表

利用GridView生命周期事件,在编辑行渲染完成后绑定下拉列表:

protected void gv_RowDataBound(object sender, GridViewRowEventArgs e)
{
    // 仅处理编辑状态的行
    if ((e.Row.RowState & DataControlRowState.Edit) != 0)
    {
        DropDownList ddlChannel = e.Row.FindControl("ChannelColumnDropDownList1") as DropDownList;
        if (ddlChannel != null)
        {
            DataTable cachedData = this.Session[c_SessionKey] as DataTable;
            // 校验缓存数据有效性
            if (cachedData != null && cachedData.Rows.Count > 0)
            {
                // 使用完整DataTable作为数据源
                ddlChannel.DataSource = cachedData;
                ddlChannel.DataTextField = "CHANNEL_COL_NAME";
                ddlChannel.DataValueField = "CHANNEL_COL_NAME";
                ddlChannel.DataBind();

                // 可选:设置默认选中值,匹配当前行原始数据
                DataRowView rowData = e.Row.DataItem as DataRowView;
                if (rowData != null)
                {
                    string currentValue = rowData["CHANNEL_COL_NAME"].ToString();
                    ListItem targetItem = ddlChannel.Items.FindByValue(currentValue);
                    if (targetItem != null) targetItem.Selected = true;
                }
            }
        }
    }
}

3. 补充GridView基础绑定方法

确保GridView能正确加载基础数据(示例):

private void BindGridView()
{
    // 替换为你实际的GridView数据源获取逻辑
    DataTable gridSource = // 从数据库/Session等获取数据
    GridView1.DataSource = gridSource;
    GridView1.DataBind();
}

说明

  • 借助RowDataBound事件处理编辑行控件绑定,符合GridView的生命周期规则,避免控件未初始化的问题。
  • 增加多层空值校验,提升代码健壮性,防止Session数据丢失引发的异常。
  • 使用完整DataTable作为数据源,符合DropDownList对数据源类型的要求。

内容的提问来源于stack exchange,提问作者hotflix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 13:45:27