【问题标题】:Retrieve container from DataGrid wpf by DataRow通过 DataRow 从 DataGrid wpf 中检索容器
【发布时间】:2016-09-01 03:01:52
【问题描述】:

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

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

【问题讨论】:

    标签: c# wpf datagrid


    【解决方案1】:

    而不是grid.ItemContainerGenerator.ContainerFromItem(),使用grid.ItemContainerGenerator.ContainerFromIndex()函数,因为DataGrid使用虚拟化所以当时还没有生成Item

    ContainerFromIndex 函数中,您可以获取DataGridRow,然后您可以使用DataGridRow.Item 来比较数据行。

    更新功能如下:

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

    【讨论】:

      猜你喜欢
      • 2017-08-06
      • 1970-01-01
      • 2011-01-17
      • 2016-11-05
      • 2016-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-18
      相关资源
      最近更新 更多