FlexGrid for WPF
パフォーマンスを改善する
基本操作 > グリッド > パフォーマンスを改善する

WPFアプリケーションではごく一般的に使われる仮想化技術では、セルは、ユーザーがグリッドの範囲をスクロール、ソート、選択するたびに作成され、破棄されます。同じく、C1FlexGrid の場合も仮想化技術を活用してパフォーマンスを改善できます。

rows.DeferNotifications() を使用します

グリッドの RowCollection クラスを取得し、ICollectionView インターフェイスで使用したメカニズムと同じDeferNotifications を実装します。このメカニズムは、Windows フォームアプリケーションでよく使用される BeginUpdate/EndUpdate パターンに似ており、パフォーマンスの大幅な向上をもたらします。

次の例では、連結グリッドおよび非連結グリッドの場合 DeferNotifications メカニズムを使用してパフォーマンスを向上します。

非連結グリッドの場合、コードは次のようになります。

コードのコピー
Private Sub InitialUnboundFlexGrid()
    Dim rows = _flex1.Rows
    'グリッドの RowsCollection クラスを取得して
    'ICollectionView インターフェイスで使用したメカニズムと同じDeferNotifications を実装します        
    Using rows.DeferNotifications()
        ' 非連結グリッドに行/列を追加します
        For i As Integer = 0 To 19
            _flex1.Columns.Add(New Column())
        Next
        For i As Integer = 0 To 499
            _flex1.Rows.Add(New Row())
        Next

        ' グリッドにデータを挿入します
        For r As Integer = 0 To _flex1.Rows.Count - 1
            For c As Integer = 0 To _flex1.Columns.Count - 1
                _flex1(r, c) = String.Format("cell [{0},{1}]", r, c)
            Next
        Next
    End Using
End Sub
コードのコピー
private void InitialUnboundFlexGrid()
{
    var rows = _flex1.Rows;
    //グリッドの RowsCollection クラスを取得して
    //ICollectionView インターフェイスで使用したメカニズムと同じDeferNotifications を実装します 
    using (rows.DeferNotifications())
    {
        // 非連結グリッドに行/列を追加します
        for (int i = 0; i < 20; i++)
        {
            _flex1.Columns.Add(new Column());
        }
        for (int i = 0; i < 500; i++)
        {
            _flex1.Rows.Add(new Row());
        }

        // グリッドにデータを挿入します
        for (int r = 0; r < _flex1.Rows.Count; r++)
        {
            for (int c = 0; c < _flex1.Columns.Count; c++)
            {
                _flex1[r, c] = string.Format("cell [{0},{1}]", r, c);
            }
        }
    }
}

連結グリッドの場合、コードは次のようになります。

コードのコピー
Private Sub InitialBoundFlexGrid()
    Dim p = Product.GetProducts(100)
    _flex2.ItemsSource = p
    Dim view = _flex2.CollectionView
    ''using (view.DeferRefresh())' 文はオプションです。この文を追加すると、 
    'すべてのグループが設定されるまでデータソースからの通知が保留になるため、パフォーマンスが向上します。
    Using view.DeferRefresh()
        view.GroupDescriptions.Clear()
        view.GroupDescriptions.Add(New PropertyGroupDescription("Rating"))
        view.GroupDescriptions.Add(New PropertyGroupDescription("Color"))
    End Using

End Sub
コードのコピー
private void InitialBoundFlexGrid()
{
    var p = Product.GetProducts(100);
    _flex.ItemsSource = p;
    var view = _flex.CollectionView;
    //using (view.DeferRefresh())' 文はオプションです。この文を追加すると、 
    //すべてのグループが設定されるまでデータソースからの通知が保留になるため、パフォーマンスが向上します。
    using (view.DeferRefresh())
    {
        view.GroupDescriptions.Clear();
        view.GroupDescriptions.Add(new PropertyGroupDescription("Rating"));
        view.GroupDescriptions.Add(new PropertyGroupDescription("Color"));
    }
    _flex2.ItemsSource = view;
}