如何以编程方式选择匹配条件的所有DataGrid行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何以编程方式选择匹配条件的所有DataGrid行相关的知识,希望对你有一定的参考价值。

我想将值和列索引传递给一个方法,该方法将以编程方式选择DataGrid控件中与给定列中的值匹配的行。

我的代码是这样的:

private void HighlightSelections(string selection, int colIndex)
{
    mtoDG.UnselectAll();
    for(int i = 0; i < mtoDG.Items.Count; i++)
    {
        DataGridRow row = mtoDG.ItemContainerGenerator.ContainerFromIndex(i) as DataGridRow;
        if (mtoDG.Columns[colIndex].GetCellContent(row) is TextBlock cellContent && cellContent.Text.Equals(selection))
            {
                object item = mtoDG.Items[i];
                mtoDG.SelectedItems.Add(item);
            }
        }
    }

我发现只有在屏幕上显示整个数据网格时,此方法才有效。如果由于空间约束而有任何未显示的行,那么它将抛出一个nullexception错误。

所以我的问题是,即使显示区域中有看不见的行,我的代码中是否有任何可以改变它以使其工作?

答案

首先,通过添加ArgumentNullException来处理row != null

DataGridRow row = mtoDG.ItemContainerGenerator.ContainerFromIndex(i) as DataGridRow;
if (row != null)
{
    if (mtoDG.Columns[colIndex].GetCellContent(row) is TextBlock cellContent && cellContent.Text.Equals(selection))
    {
        object item = mtoDG.Items[i];
        mtoDG.SelectedItems.Add(item);
    }
}

其次,订阅ItemContainerGenerator.StatusChanged事件以刷新HighlightSelections

mtoDG.ItemContainerGenerator.StatusChanged += ItemContainerGenerator_StatusChanged;

private void ItemContainerGenerator_StatusChanged(object sender, EventArgs e)
{
    // HighlightSelections(?, ?);
}
另一答案

这里的好解决方案是让DataContext具有行的IsSelected属性,然后你应该只将它与行IsSelected绑定,之后你可以设置你的DataContext属性,一切都应该没问题,因为你的DataContext总是有有效的项目。

另一答案

我想你需要先找出导致ArgumentNullException的原因。禁用DataGrid虚拟化功能可能会有所帮助。

以上是关于如何以编程方式选择匹配条件的所有DataGrid行的主要内容,如果未能解决你的问题,请参考以下文章

MUI:如何以编程方式更新 DataGrid 状态?

如何以编程方式对 Material UI DataGrid 列进行排序?

Dojo Datagrid - 以编程方式设置选定行的样式

以编程方式 WPF DataGrid 行双击事件

以编程方式在 WPF DataGrid 中选择多行

jQuery AND 选择器