True DBGrid for WinForms は、階層化されたデータを表示できます。一般に、階層化データは、複数のリレーショナルテーブルに格納されているデータを参照します。リレーショナルテーブルでは、マスターテーブル(親テーブル)がキーフィールドによって詳細テーブル(子テーブル)にリンクされます。データを階層表示すると、最初にマスターデータが表示され、ユーザーは、クリックするだけで、同じグリッド内に関連する詳細データを表示できます。
グリッドをマスター/詳細データソースに連結する場合は、水平テーブル領域(バンド)を使って階層化データの関連グループを表示します。バンドは、データそのものではなく、階層 DataSet を仮想的に表現したものです。バンドは、階層レコードセット内の各レベルごとに作成され、テーブル全体または選択された少数のフィールドだけを入れることができます。実行時、ユーザーは、ツリー表示に似たインタフェースを使用して、バンドを展開したり、折りたたむことができます。
この機能を使用するには、DataView プロパティをDataViewEnum.Hierarchicalに設定する必要があります。また、グリッドコントロールを階層化された DataSet に連結する必要があります。その1つの方法として、DataSource プロパティを使用します。
次の図に、2つのテーブルの関係を例示します。この図は、.NET xsd ファイルエディタ画面の例です。ここでは、Composer テーブルと Opus テーブルが関連付けられています。どちらのテーブルにも Last フィールドがあり、このフィールドが両方のテーブルの主キーになっています。また、Composer テーブルと Opus テーブルの Last フィールドはどちらも同じものです。そこで、このフィールドに基づいて2つのテーブルを連結すると、これらのテーブルによる階層化 DataSet を作成できます。
バンドとグリッドの階層表示を使用することによって、この階層化 DataSet をグリッドに表示できます。3つの手順を踏むだけで、上の DataSet を C1TrueDBGrid に表示できます。次にその手順を示します。
実行時、グリッドには読み取り専用のデータが表示されます。次の図は、グリッドの表示例です。最初にマスターレコードセット(Composer)のデータが表示され、詳細レコードセットバンドのフィールドが右側に表示されます。ただし、詳細レコードセットのフィールドには、最初はデータが含まれていません。レコードの左端の展開アイコン( + )が、階層化データがあることを示しています。
ユーザーが展開アイコンをクリックすると、アイコンは折りたたみアイコン( - )に変わり、横のバンド(Orders)が展開して、クリックした行の詳細レコードが表示されます。
メモ:C1TrueDBGrid DataView プロパティがデフォルト値のDataViewEnum.Normalに設定されている場合、グリッドにはフラットファイルだけが表示され、階層表示はサポートされません。データソースが階層化されたDataSetであっても、グリッドに表示されるのは、マスターテーブルのデータだけです。
DataView プロパティは設計時に設定する必要があります。実行時には変更できません。
階層表示のグリッドを操作するために、次のメソッドが用意されています。
メソッド | 説明 |
---|---|
GetBand | 指定された列インデックスに対応するバンドを返す。 |
CollapseBand | 指定されたバンドのすべての行を折りたたむ。 |
ExpandBand | 指定されたバンドのすべての行を展開する。 |
RowExpanded | 指定されたバンド内で現在の行が展開されている場合は、True を返す。 |
マスター/詳細データソース内のレコードセットのレベル数が事前にわからない場合は、コード内で Bands プロパティを調べます。利用できるバンドの数は、0から -1 までです。
アプリケーションで次のイベントを使用すると、ユーザーによって開始された階層表示操作に応答できます。
イベント | 説明 |
---|---|
Collapse | ユーザーがバンドを折りたたむと発生する。 |
Expand | ユーザーがバンドを展開すると発生する。 |
True DBGrid for WinForms では、データソース間の親子関係を表示する際に、マスターテーブル内からまったく新しい C1TrueDBGrid を開き、そこに子のデータレコードを表示できます。ChildGrid プロパティを設定して2つのグリッドコントロールを接続し、数行のコードを記述するだけで、完全に編集可能な子データのドロップダウンを作成できます。このドロップダウンは、クリックするだけでマスターテーブル内に表示されます。
階層化されたデータセットがすでに設定されている場合は、C1TrueDBGrid1 の ChildGrid プロパティのテキストボックスに C1TrueDBGrid2 と入力することで、親子関係を作成できます。
次に、C1TrueDBGrid2 の SplitCollection エディタを開き、ExtendRightColumn プロパティを True に変更します。
C1TrueDBGrid2 は非表示になり、各行の左端のセルに展開アイコン( + )が表示されます。次の例のマスターテーブルには、作曲家のリストとその主要な情報が含まれています。右にスクロールしても、展開アイコンは常に左端のセルに表示されます。
展開アイコンの1つを左クリックすると、ドロップダウンに子テーブルが表示されます。この例のドロップダウンには、展開した作曲家の作品リストが表示されます。
この例からもわかるように、簡単な操作でマスターグリッドに子グリッドを結び付けて、階層化されたデータをわかりやすく表示できます。
C# |
コードのコピー
|
---|---|
private void Form1_Load(object sender, EventArgs e) { // Create the DataSet and DataTable string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), @"ComponentOne Samples\Common\C1NWind.mdb") + ";"; OleDbConnection conn = new OleDbConnection(connectionString); OleDbDataAdapter adp_Composer = new OleDbDataAdapter("Select Last, * from Composer", conn); OleDbDataAdapter adp_Opus = new OleDbDataAdapter("Select * from Opus", conn); DataSet data = new DataSet(); DataTable table_Composer = new DataTable(); DataTable table_Opus = new DataTable(); data.Tables.Add(table_Composer); data.Tables.Add(table_Opus); adp_Composer.Fill(table_Composer); adp_Opus.Fill(table_Opus); //Create relation between tables data.Relations.Add("Composer_Sale", data.Tables[table_Composer.TableName].Columns["Last"], data.Tables[table_Opus.TableName].Columns["Last"]); //Bind with the dataset c1TrueDBGrid1.DataSource = data;//MasterGrid c1TrueDBGrid2.DataSource = data;// ChildGrid c1TrueDBGrid1.DataMember = table_Composer.TableName; //Provide master grid data member and data relation name to the child grid data member c1TrueDBGrid2.DataMember = c1TrueDBGrid1.DataMember + ".Composer_Sale"; //Set the Child grid c1TrueDBGrid1.ChildGrid = c1TrueDBGrid2; } |