ツリーグリッドでは、通常のグリッドと同様に、ソートや変更内容の保持など、さまざまな操作をデータレベルで実行できます。
ツリーグリッドでソートを適用するには、親ノードを選択し、Node クラスの Sort メソッドを使用して、子ノードをソートします。SortFlags 列挙を使用して、ソート順を指定できます。
次のコードは、WinForms ツリーグリッドでソートを適用します。
ここまで、高レベルの Subtotal メソッドと、低レベルの InsertNode メソッドおよび Aggregate メソッドを使用して、ツリーや合計を作成する方法について説明してきました。
ここで、忘れてはならないのは、ツリーグリッドはデータに基づいて作成されていますが、いかなる方法でもデータには連結されておらず、グリッドやデータが変更された場合に、それが自動的に保持されることはないということです。
たとえば、ユーザーが列の値を変更しても、小計は自動的に更新されません。また、ユーザーがグリッドをソートすると、データがリフレッシュされ、小計は表示されなくなります。
ツリーグリッドを保持するためによく使用される方法として、次の 2 つがあります。
通常、動的なデータ分析のための迅速でシンプルなツールを提供するには、2 番目の方法が有効です。この方法は、FlexGrid コントロールに付属する製品サンプル「Analyze(分析)」で説明されています。このサンプルでは、初期アウトラインを作成し、ユーザーに列の並べ替えを許可します。列の順序が変更されると、自動的にデータを再ソートし、アウトラインを再作成します。
「ノードの作成」セクションでは、特定の列の同じ値をグループ化してノード行を挿入する GroupBy メソッドの実装についても説明しました。そのコードは、呼び出されたときにいくつかのレベルのノードを追加できるように、既存のノード行をスキップしながらすべての列をスキャンし、グループ化の基準となる列の現在の値を追跡します。現在値が変化すると、ノード行が挿入され、最初のスクロール可能な列に新しいグループ名が表示されます。
ただし、このメソッドはデータがアウトライン構造に従ってソートされることを前提とするなど、グループ化を保持するにはいくつかの課題があります。また、GroupBy メソッドが行を挿入してグリッドがちらつく可能性があります。これを避けるには、通常は、更新を行う前に Redraw プロパティを false に設定し、更新後に true に戻します。
DeferRefresh クラスは、グリッドの Redraw プロパティを false に設定し、破棄されるときに元の値を復元するシンプルなユーティリティです。これにより、更新時に例外が発生した場合でも、Redraw を適切に復元できます。BindGrid メソッドは、アウトライン構造が必要とする順序でグリッドがソートされるようにします。