通过DataRow从DataGrid wpf中检索容器

时间:2016-09-01 03:01:52

标签: c# wpf datagrid

我在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项目。

哪个好解决方案可以帮到我?

1 个答案:

答案 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;
                    }                        
                }
            }
        }
    }