问题描述
我们有一个场景,不同格式的 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);
}