1

いくつかの外部基準によってフィルタリングされた一連の行を表示する必要があるアプリケーションがあります。ここでは説明しませんが、DataGridがバインドされているDataTableから行を削除したくありません。リストをフィルタリングするために、表示したくない行を折りたたんでいます。これは、ユーザーがDataGridを並べ替えるまではうまく機能します。並べ替えが完了すると、折りたたまれた行が突然再び表示されます。必要な行を再度折りたたむことができるように、Sortedイベントを探しましたが、Sortingイベントしかありません。各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が表示されます。[列1]をクリックして列で並べ替えると、番号1、2、および3が表示されます。

この問題を解決するための助けをいただければ幸いです。

4

1 に答える 1

1

DataGridViewではなくDataTableのフィルタリングに集中する必要があると思います。過去にDataViewを使用してみましたか?これらを使用してDataTableをフィルタリングできます。バインドされたDataGridViewがあるため、ビューはGridViewに反映されますか?

DataTableをフィルタリングすることで、行を削除するのではなく、一時的に外観を変更するだけです。

ここに役立つかもしれないリンクがあります:-

http://msdn.microsoft.com/en-us/library/system.data.dataview.rowfilter.aspx

これがお役に立てば幸いです。

于 2012-09-20T16:50:30.977 に答える