如何以编程方式 select 所有 DataGrid 行匹配条件
How to programmatically select ALL DataGrid rows matching criteria
我想将一个值和一个列索引传递给一个方法,该方法将以编程方式 select 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);
}
}
}
我发现此方法仅在整个数据网格显示在屏幕上时才有效。如果由于 space 约束而有任何未显示的行,那么它将抛出 nullexception 错误。
所以我的问题是,即使显示区域中有看不见的行,我是否可以更改我的代码以使其正常工作?
首先,通过添加 row != null
来处理 ArgumentNullException
:
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(?, ?);
}
这里好的解决方案是为行设置带有 IsSelected 属性 的 DataContext,然后您应该将它与行 IsSelected 绑定,之后您可以设置您的 DataContext 属性,一切都应该是好的,因为您的 DataContext 始终具有有效项。
我认为您需要先找出导致 ArgumentNullException 的原因。禁用 DataGrid 虚拟化功能可能会有所帮助。
我想将一个值和一个列索引传递给一个方法,该方法将以编程方式 select 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);
}
}
}
我发现此方法仅在整个数据网格显示在屏幕上时才有效。如果由于 space 约束而有任何未显示的行,那么它将抛出 nullexception 错误。
所以我的问题是,即使显示区域中有看不见的行,我是否可以更改我的代码以使其正常工作?
首先,通过添加 row != null
来处理 ArgumentNullException
:
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(?, ?);
}
这里好的解决方案是为行设置带有 IsSelected 属性 的 DataContext,然后您应该将它与行 IsSelected 绑定,之后您可以设置您的 DataContext 属性,一切都应该是好的,因为您的 DataContext 始终具有有效项。
我认为您需要先找出导致 ArgumentNullException 的原因。禁用 DataGrid 虚拟化功能可能会有所帮助。