Telerik RadGrid重新绑定时GridDataItem隐藏列UniqueName变更报错咨询
问题根因
该报错由RadGrid自动生成列的默认机制触发:当重复绑定不同结构的数据源时,RadGrid默认不会清空已生成的旧列,遇到重名列时会自动给新列的UniqueName加数字后缀。第一次绑定生成IsMatch列,第二次绑定时旧列未被清理,新的隐藏列就会被命名为IsMatch1,硬编码取item["IsMatch"]时无法找到对应列,因此抛出异常。
解决方案
方案1:绑定前清空列集合(改动最小)
每次生成新的DataTable、执行数据绑定操作前,先手动清空RadGrid的列集合,强制其重新生成所有列,避免重名加后缀的问题:
// 放在调用rdg.DataBind()的逻辑之前 rdg.MasterTableView.Columns.Clear(); rdg.MasterTableView.AutoGenerateColumns = true; // 绑定新生成的DataTable rdg.DataSource = yourNewDataTable; rdg.DataBind();
该方案无需修改现有列隐藏、行背景色设置逻辑,适配性最强。
方案2:关闭自动生成列,手动管理列结构
如果两种CSV格式固定,可关闭自动生成列,提前定义所有需要的列与固定UniqueName,切换CSV格式时仅修改列的可见性即可,从根源避免列名冲突:
- 在RadGrid属性中设置
AutoGenerateColumns="false" - 提前定义两种CSV格式需要的所有业务列、以及
IsMatch隐藏列,给每个列设置固定的UniqueName - 用户选择CSV格式后,仅调整对应业务列的Display属性即可,无需修改DataSource结构
方案3:直接从数据源取值,不依赖Grid列
如果不想调整绑定逻辑,可修改ItemDataBound的取值逻辑,直接从绑定的数据源对象取IsMatch字段,不受Grid列名变化影响:
protected void rdg_ItemDataBound(object sender, GridItemEventArgs e) { if (e.Item is GridDataItem) { GridDataItem item = (GridDataItem)e.Item; DataRowView rowView = (DataRowView)item.DataItem; var matched = NullableHelper.TryParseBoolean(rowView["IsMatch"].ToString()); if (matched.HasValue && !matched.Value) item.BackColor = System.Drawing.Color.FromArgb(249, 79, 79); } }
内容的提问来源于stack exchange,提问作者Farhan Iqbal
相关产品推荐
相关产品推荐

