WinGrid は多数の構成要素から成り立っており、それぞれに独自の多様なフォーマットを設定できます。ただしグリッドに適用されるフォーマットのほとんどは、指定したタイプのオブジェクト全体で同一になります(たとえば、グリッド内の各行に異なるフォントを適用したり、各列に異なる配色を適用することはあまり望ましくないためです)。WinGrid(および他の Infragistics WinForms エレメント)では、オブジェクトベースのアプローチを採用しており、Appearance オブジェクトの使用によってこのようなフォーマットの問題に対応しています。
Appearance は配列、フォント、色、画像、およびアルファ ブレンディング情報など、多様なフォーマット関連のプロパティを持つオブジェクトです。オブジェクトが直接 Font、BackColor、ForeColor、Picture、および PictureAlignment などのプロパティをサポートする代わりに、オブジェクト自体をフォーマット可能な場合は、そのオブジェクトにはこれらのタイプのプロパティにアクセスを提供する単一の Appearance プロパティがあります。Appearance プロパティは、関連づけられているオブジェクトのフォーマットを制御する(およびオブジェクトのプロパティを個別に設定できる)Appearance サブオブジェクトを指し示すか、またはフォーマットされるオブジェクトのプロパティ設定を提供する名前付きの Appearance オブジェクトへの参照として機能することができます。
エレメントにはAppearanceコレクションがあり、このコレクションを使用して作成する名前付きの Appearanceオブジェクトを保存します。複数のオブジェクトに適用したい設定を備えた Appearance オブジェクトを作成したら、あとはそのオブジェクトを、フォーマットするオブジェクトの Appearance プロパティに割り当てるだけです。フォーマットにおけるこのオブジェクトベースのアプローチにはいくつもの利点があります。まず第一に、記述するコードの量が少なくなり、一律の設定を好きな場所に容易に適用することができます。さらにすべての設定がひとつのオブジェクトに含まれるため、フォーマットを制御している単一の Appearance オブジェクトを変更すれば、複数のオブジェクトの設定を一度に動的に変更できます。
オブジェクトをフォーマットしようとしても必須のプロパティが見つからない場合は、そのオブジェクトに Appearance プロパティがあるかどうかを確認してください。Appearance プロパティがある場合は、通常フォーマットするオブジェクトの Appearance サブオブジェクトを確認すれば必要なプロパティが見つかります。
WinGrid の機能の多くは、開発者とエンド ユーザーの両方がグリッドのレイアウトを容易にカスタマイズできるようにすることを目的に設計されています。開発者やユーザーは列の配置の変更、列のグループ化やグループの解除、列の幅や行の高さの変更、列のスクロール可能領域の追加や削除、その他を実行できます。こういった変更を加えた場合、可能ならばそれをアプリケーションに記憶させて、ユーザーが次回アプリケーションを実行した際にもカスタマイズしたレイアウトを利用できることが理想的です。
WinGrid は、エレメントの状態を容易に維持およびリストアできる包括的な構造を備えています。エレメントの最上位プロパティは DisplayLayout プロパティで、これによって UltraGridLayout オブジェクトにアクセスできます。このオブジェクトは、維持するコントロールのすべてのプロパティおよびオブジェクトを格納するコンテナとして機能します。バンドの配列やレイアウト、列の幅や順序といったアイテムの他、色、フォント、スタイルなどの Appearance 関連設定に加え、多数のグリッド設定はすべて、UltraGridLayout オブジェクト内に格納されます。コントロールの外観を維持する場合は、このオブジェクトのメソッドを呼び出して、レイアウト情報をストレージ ストリームに保存、およびそこから取得します。
WinGrid の設定の多くが維持可能なため、要素の多くの機能には UltraGridLayout オブジェクトを通してアクセスします。
各バンドは、グリッド自体と同じプロパティを数多く共有します。ただし各バンドはそれぞれ独立しているため、グリッドや他のバンドとは異なる独自のプロパティ設定を持つことができます。またデータ階層には多数のレベルが含まれる場合があるため、バンドによってはその直前のバンドや上位レベルの階層からプロパティを継承するほうがよいこともあります。これらのオブジェクトでは動作やフォーマットのオプションが重複するため、オブジェクトのフォーマットを決定するための構造が必要になります。この構造として、オーバーライド階層を利用できます。
WinGrid でオブジェクトの外観および動作を決定する必要がある際には、必ずオブジェクトのオーバーライド階層がチェックされます。オーバーライド階層の一部であるプロパティが、そのオブジェクトについて明示的に設定されている(すなわちデフォルトの設定が変更されている)場合は、指定された設定が使用されます。ただしプロパティが設定されていない場合は、オーバーライド階層内でそのオブジェクトの上位にあるオブジェクトの、同じプロパティの設定が使用されます。そのオブジェクトもデフォルトの設定を使用している場合、連鎖的に次の上位オブジェクトがチェックされて、指定値があるかどうかが調べられます。これは何度も繰り返され、明示的に設定された(デフォルトでない)プロパティを持つオブジェクトが見つかるまで、または階層の最上位(エレメント自体)に達するまで、続けられる場合があります。
オーバーライド階層の一部であるプロパティは、グリッドまたは UltraGridBand オブジェクトの直属プロパティとしては表示されません。そのかわりに、サブオブジェクト、UltraGridOverride オブジェクトのプロパティとしてはグループ化されます。UltraGridOverride は Appearance オブジェクトと同様で、そのプロパティ設定がその親であるオブジェクトに適用されます。一般に、UltraGridBand オブジェクトとグリッド自体の両方に設定できるプロパティは、オーバーライド階層に属します。たとえば、特定のバンド内またはグリッド全体の中で選択可能なセルの最大数を決定できる MaxSelectedCells プロパティは、Override オブジェクトのプロパティです。
このシステムでは、コントロール用のコードの記述方法にさまざまな影響が出ます。ひとつ目は、UltraGridOverride オブジェクトのすべてのプロパティで、デフォルト(初期)の設定が [デフォルトを使用] であることです。ここでの「デフォルト」という言葉はオブジェクトのプロパティの 初期 設定ではなく、オーバーライド階層における1レベル上のオブジェクト から継承された 設定を意味します。
たとえば、3 つのレベルを含む階層式データ セットを表示するグリッドがあるとします。バンドは Customers、Orders、および Order Details の 3 つです。グリッド レベルでは、単一行のみを選択できるように SelectTypeRow プロパティを次のように設定しました。
UltraGrid1.DisplayLayout.Override.SelectTypeRow = Infragistics.Win.UltraWinGrid.SelectType.Single;
ただしユーザーが複数のオーダーや、ひとつのオーダーから複数のアイテムを選択できるようにするため、Orders バンドでは複数行を選択できるよう SelectTypeRow プロパティを設定したとします。
UltraGrid1.DisplayLayout.Bands["Orders"].Override.SelectTypeRow = Infragistics.Win.UltraWinGrid.SelectType.Extended;
SelectTypeRowはUltraGridOverride オブジェクトのプロパティなので、各バンドの選択タイプはオーバーライド階層での設定によって決まります。Order Details バンドの値は変更していないため、[デフォルトを使用] オプションに対応する初期値である「SelectType.Default」に設定されています。グリッドが Order Detail バンドを作成する際には、このプロパティが SelectTypeRow の設定をオーバーライド階層の上位レベルから取得するよう指定するため、グリッドは Order Details バンドの親である Orders バンドを探します。Orders バンドのプロパティの値は指定してあるので、エレメントはこの同じ値を Order Details バンドに使用します。
Orders バンドを作成する際は、SelectTypeRow プロパティが特定の値に設定されているため、エレメントはこの設定をバンドに使用します。Customer バンドを作成する際は、SelectTypeRow の値が [デフォルトを使用] であることがわかるため、エレメントは再度オブジェクト階層を「遡って」、今度はグリッド レベルに達するまで設定値を探していきます。これは Customers バンドに効力を及ぼす値である「SelectType.Single」をグリッドが使用するよう、明示的に設定してあるためです。グリッドでこのプロパティを設定しなければ、これも [デフォルトを使用] オプションに設定されます。階層の最上位レベルで、[デフォルトを使用] が設定されていると、エレメントは独自の内部設定をデフォルト値として使用します。