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