FlexGrid for WinForms
データ操作
ツリーグリッド > データ操作

ツリーグリッドでは、通常のグリッドと同様に、ソートや変更内容の保持など、さまざまな操作をデータレベルで実行できます。

データ操作

ソート

ツリーグリッドでソートを適用するには、親ノードを選択し、Node クラスの Sort メソッドを使用して、子ノードをソートします。SortFlags 列挙を使用して、ソート順を指定できます。

次のコードは、WinForms ツリーグリッドでソートを適用します。

private void btnSort_Click(object sender, System.EventArgs e)
{
  // 現在のノードを取得します
  Node nd = flex.Rows[flex.Row].Node; 
  // ユーザーが選択した並べ替えを適用します
  // (これにより、選択したノードの子が並べ替えられます)
  if (sender == btnSortAscending)
   nd.Sort(SortFlags.Ascending);
 else
   nd.Sort(SortFlags.Descending);
 // 完了
  flex.Focus();
}     
Private Sub btnSort_Click(ByVal sender As Object, ByVal e As EventArgs)
    ' 現在のノードを取得します
    Dim nd As Node = flex.Rows(flex.Row).Node
    ' ユーザーが選択した並べ替えを適用します
    ' (これにより、選択したノードの子が並べ替えられます)
    If sender Is btnSortAscending Then
        nd.Sort(SortFlags.Ascending)
    Else
        nd.Sort(SortFlags.Descending)
    End If
    ' 完了
    flex.Focus()
End Sub          

変更内容の保持

ここまで、高レベルの Subtotal メソッドと、低レベルの InsertNode メソッドおよび Aggregate メソッドを使用して、ツリーや合計を作成する方法について説明してきました。

ここで、忘れてはならないのは、ツリーグリッドはデータに基づいて作成されていますが、いかなる方法でもデータには連結されておらず、グリッドやデータが変更された場合に、それが自動的に保持されることはないということです。

たとえば、ユーザーが列の値を変更しても、小計は自動的に更新されません。また、ユーザーがグリッドをソートすると、データがリフレッシュされ、小計は表示されなくなります。

ツリーグリッドを保持するためによく使用される方法として、次の 2 つがあります。

  1. ツリーを無効化するような変更をユーザーが行えないようにします。これは最も簡単なオプションです。グリッドの AllowEditingAllowDragging、および AllowSorting プロパティを false に設定すると、ツリーに影響を与える変更をすべて禁止できます。
  2. データまたはグリッドが変更されたときに、ツリーを更新します。グリッドの AfterDataRefreshAfterSort、および AfterEdit イベントにハンドラをアタッチすると、アウトラインを適切に再生成できます。

通常、動的なデータ分析のための迅速でシンプルなツールを提供するには、2 番目の方法が有効です。この方法は、FlexGrid コントロールに付属する製品サンプル「Analyze(分析)」で説明されています。このサンプルでは、初期アウトラインを作成し、ユーザーに列の並べ替えを許可します。列の順序が変更されると、自動的にデータを再ソートし、アウトラインを再作成します。

メモ: ComponentOneControlPanel.exe を使用して WinForms Edition をインストールする際にサンプルをインストールした場合、前述の製品サンプルは、システムの \Documents\ComponentOne Samples\WinForms\vx.x.x\C1FlexGrid\CS にあります。

ノードの作成」セクションでは、特定の列の同じ値をグループ化してノード行を挿入する GroupBy メソッドの実装についても説明しました。そのコードは、呼び出されたときにいくつかのレベルのノードを追加できるように、既存のノード行をスキップしながらすべての列をスキャンし、グループ化の基準となる列の現在の値を追跡します。現在値が変化すると、ノード行が挿入され、最初のスクロール可能な列に新しいグループ名が表示されます。

ただし、このメソッドはデータがアウトライン構造に従ってソートされることを前提とするなど、グループ化を保持するにはいくつかの課題があります。また、GroupBy メソッドが行を挿入してグリッドがちらつく可能性があります。これを避けるには、通常は、更新を行う前に Redraw プロパティを false に設定し、更新後に true に戻します。

DeferRefresh クラスは、グリッドの Redraw プロパティを false に設定し、破棄されるときに元の値を復元するシンプルなユーティリティです。これにより、更新時に例外が発生した場合でも、Redraw を適切に復元できます。BindGrid メソッドは、アウトライン構造が必要とする順序でグリッドがソートされるようにします。

関連トピック