Ascx中GridView行内编辑时DropDownList空引用错误解决求助
解决GridView行内编辑中EditItemTemplate下拉列表绑定的空引用错误
问题根源
- 控件未初始化:在
OnRowEditing事件中设置EditIndex后,未重新绑定GridView,此时目标行仍处于ItemTemplate状态,EditItemTemplate内的ChannelColumnDropDownList1还未被实例化,FindControl返回null,触发空引用异常。 - 数据源类型错误:直接将
cachedData.Rows[0](单个DataRow)作为DropDownList的数据源,DropDownList需要集合类型(如DataTable、List等)而非单个数据行。 - 缺少空值校验:未对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
相关产品推荐
相关产品推荐

