我在Wpf中使用DataGrid并按如下方式绑定数据:
datagridEx.ItemsSource = tblEx.AsDataView();
现在我有一个处理某些逻辑的函数然后返回一个DataRow列表。 我想为这些行设置背景
public void HighlightRows(IEnumerable<DataRow> rows, DataGrid grid)
{
foreach(var row in rows)
{
DataGridRow dgr = grid.ItemContainerGenerator.ContainerFromItem(row) as DataGridRow;
if (dgr != null)
{
dgr.Background = Brushes.LightBlue;
}
}
}
但我总是收到dgr的空引用指针。我意识到DataRow被转换为DataRowView,因此DataGrid找不到容器代表DataRow项目。
哪个好解决方案可以帮到我?
答案 0 :(得分:0)
取代grid.ItemContainerGenerator.ContainerFromItem,请使用grid.ItemContainerGenerator.ContainerFromIndex函数,因为Datadrid正在使用虚拟化,因此当时不生成Item。从ContainerFromIndex函数,您可以获取datagridrow,然后您可以使用DataGridRow.Item来比较datarow。更新的功能如下:
public void HighlightRows(IEnumerable<DataRow> rows, DataGrid grid)
{
for (int index = 0; index < grid.Items.Count; index++)
{
DataGridRow dgr = grid.ItemContainerGenerator.ContainerFromIndex(index) as DataGridRow;
if (dgr.Item.GetType() == typeof(DataRowView))
{
foreach (DataRow row in rows)
{
var array1 = row.ItemArray;
var array2 = (((DataRowView)dgr.Item).Row).ItemArray;
if (array1.SequenceEqual(array2))
{
dgr.Background = Brushes.LightBlue;
}
}
}
}
}