You need to enable JavaScript to run this app. Telerik RadGrid重新绑定时GridDataItem隐藏列UniqueName变更报错咨询
优惠活动
大模型
产品
解决方案
定价
更多

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格式时仅修改列的可见性即可,从根源避免列名冲突:

  1. 在RadGrid属性中设置AutoGenerateColumns="false"
  2. 提前定义两种CSV格式需要的所有业务列、以及IsMatch隐藏列,给每个列设置固定的UniqueName
  3. 用户选择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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 03:45:01