重新绑定时 Telerik GridDataItem 的唯一名称已更改

问题描述

我们有一个场景,不同格式的 csv 需要在 RadGrid 中显示数据。 格式 1 需要显示 4 列(因为格式 1 csv 文件有 4 列,id、fName、lName、age、city) 格式 2 需要显示 5 列(因为格式 2 csv 文件有 5 列,id、fName、lName、age、state、zip) 为了绑定数据,我们创建一个数据表并根据选定的格式添加列,并添加额外的隐藏列,这决定了网格行的背景色。一旦用户选择文件并单击加载按钮,它会检查数据库中是否存在所有用户 ID。一旦记录匹配,它就会更改该行的背景色。

我面临的问题是,我们之前的格式 1 和格式 2 的列数相同。而且效果很好。由于我们更改了列数,因此当我们首先加载格式 1 的 csv 然后加载格式 2 的 csv 时,它开始更改隐藏列的唯一名称(从 IsMatch 到 IsMatch1)。重新绑定时发生以下异常: 找不到绑定到列名的单元格

要隐藏列,我们使用以下代码

protected void rdg_ColumnCreated(object sender,GridColumnCreatedEventArgs e)
{
    e.Column.display = !this.InvisibleColumns.Contains(e.Column.UniqueName);
}

抛出异常的背景颜色复制如下:

protected void rdg_ItemDataBound(object sender,GridItemEventArgs e)
{
    if (e.Item is GridDataItem)
    {
        GridDataItem item = (GridDataItem)e.Item;
        var matched = NullableHelper.TryParseBoolean(item["IsMatch"].Text);
        if (matched.HasValue && !matched.Value)
            item.BackColor = System.Drawing.Color.FromArgb(249,79,79);
    }
} 

解决方法

经过一整天的研究,我设法使用以下 hack 修复它:(仍然不确定为什么在重新绑定之前设置 datasource = null 保持 items.count > 0)

protected void rgUploadResults_ColumnCreated(object sender,GridColumnCreatedEventArgs e)
{
    //uniquename of invisible columns disturb on rebinding
    if (this.InvisibleColumns != null)
    {
        int colIndex = this.InvisibleColumns.FindIndex(
            x => e.Column.UniqueName.Contains(x) //when unique name contains extra characters in invisible columns on rebinding
            && e.Column.UniqueName != x //no need to replace unique name when it exactly matches
        );
        if (colIndex > -1)
        {
            e.Column.UniqueName = this.InvisibleColumns[colIndex];
        }
    }

    e.Column.Display = this.InvisibleColumns != null && !this.InvisibleColumns.Contains(e.Column.UniqueName);
}