| 基本操作 > グリッド > パフォーマンスを改善する |
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; } |
|