C# 在对DataGrid排序时,如何防止DataGridRow可见性发生变化?

C# 在对DataGrid排序时,如何防止DataGridRow可见性发生变化?,c#,xaml,sorting,datagrid,wpfdatagrid,C#,Xaml,Sorting,Datagrid,Wpfdatagrid,我有一个应用程序,它需要显示一组由一些外部条件过滤的行。出于我在这里不解释的原因,我不想从DataGrid绑定到的DataTable中删除行。为了过滤列表,我正在折叠我不想显示的行。这非常有效,直到用户对数据网格进行排序。排序完成后,折叠的行突然再次可见。我寻找了一个排序事件,这样我就可以重新折叠我需要的行,但是只有一个排序事件。我尝试在每个DataGridRow上使用IsVisibleChanged,但似乎没有触发。我如何解决这个问题 下面是该问题的简单演示: public partial c

我有一个应用程序,它需要显示一组由一些外部条件过滤的行。出于我在这里不解释的原因,我不想从DataGrid绑定到的DataTable中删除行。为了过滤列表,我正在折叠我不想显示的行。这非常有效,直到用户对数据网格进行排序。排序完成后,折叠的行突然再次可见。我寻找了一个排序事件,这样我就可以重新折叠我需要的行,但是只有一个排序事件。我尝试在每个DataGridRow上使用IsVisibleChanged,但似乎没有触发。我如何解决这个问题

下面是该问题的简单演示:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        DataTable table = new DataTable();
        table.Columns.Add("Column 1");

        DataRow row = table.NewRow();
        row[0] = "1";
        table.Rows.Add(row);

        row = table.NewRow();
        row[0] = "2";
        table.Rows.Add(row);

        row = table.NewRow();
        row[0] = "3";
        table.Rows.Add(row);

        _grid.ItemsSource = table.AsDataView();
        _grid.DataContext = table;
        _grid.Loaded += _grid_Loaded;
    }

    void _grid_Loaded(object sender, RoutedEventArgs e)
    {
        var dataGridRow = GetRow(_grid, 1);
        dataGridRow.Visibility = Visibility.Collapsed;

        dataGridRow = GetRow(_grid, 0);
        dataGridRow.Visibility = Visibility.Collapsed;
    }

    public DataGridRow GetRow(DataGrid grid, int index)
    {
        var row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(index);
        if (row == null)
        {
            // May be virtualized, bring into view and try again.
            grid.UpdateLayout();
            if (grid.Items.Count > index)
            {
                grid.ScrollIntoView(grid.Items[index]);
                row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(index);
            }
        }
        return row;
    }
}
以下是XAML:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <DataGrid HorizontalAlignment="Left" Margin="54,43,0,0" VerticalAlignment="Top" Height="216" Width="382" Name="_grid"/>

</Grid>

运行程序后,您将看到一个只有数字3的DataGrid。单击“Column 1”以按列排序,注意您现在有了数字1、2和3


如果您能帮助解决此问题,我们将不胜感激。

我认为您应该专注于筛选DataTable,而不是DataGridView。您过去是否尝试过使用DataView?您可以使用这些来过滤数据表,当您拥有绑定的DataGridView时,视图将在GridView中反映出来

通过过滤DataTable,您不会删除任何行,而只是暂时改变它的外观

以下链接可能会有所帮助:-


我希望这有帮助

我认为您应该集中精力过滤DataTable,而不是DataGridView。您过去是否尝试过使用DataView?您可以使用这些来过滤数据表,当您拥有绑定的DataGridView时,视图将在GridView中反映出来

通过过滤DataTable,您不会删除任何行,而只是暂时改变它的外观

以下链接可能会有所帮助:-


我希望这有帮助

德里克,谢谢你的快速回复。我现在就去查看链接。德里克,谢谢你的快速回复。我现在将查看链接。