True DBGrid for WinForms
階層化データ表示
データの表示 > 階層化データ表示

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 に表示できます。次にその手順を示します。

  1. まず、グリッドのDataSource プロパティを階層化 DataSet に設定する必要があります。この例では、DataSet の名前は dsMasterDetail1 です。
  2. 次に、グリッドのDataMember プロパティを DataSet の親テーブルに設定する必要があります。これにより、グリッドに最初に表示するテーブルを設定できます。この例では、親テーブルは Composer です。
  3. 最後に、グリッドを階層表示に切り替えます。DataView プロパティを DataViewEnum.Hierarchical に設定すると、グリッドに上のデータセットがバンド構造で表示されます。

実行時、グリッドには読み取り専用のデータが表示されます。次の図は、グリッドの表示例です。最初にマスターレコードセット(Composer)のデータが表示され、詳細レコードセットバンドのフィールドが右側に表示されます。ただし、詳細レコードセットのフィールドには、最初はデータが含まれていません。レコードの左端の展開アイコン( + )が、階層化データがあることを示しています。

ユーザーが展開アイコンをクリックすると、アイコンは折りたたみアイコン( - )に変わり、横のバンド(Orders)が展開して、クリックした行の詳細レコードが表示されます。

メモ:C1TrueDBGrid DataView プロパティがデフォルト値のDataViewEnum.Normalに設定されている場合、グリッドにはフラットファイルだけが表示され、階層表示はサポートされません。データソースが階層化されたDataSetであっても、グリッドに表示されるのは、マスターテーブルのデータだけです。

DataView プロパティは設計時に設定する必要があります。実行時には変更できません。

階層表示のグリッドを操作するために、次のメソッドが用意されています。

メソッド 説明
GetBand 指定された列インデックスに対応するバンドを返す。
CollapseBand 指定されたバンドのすべての行を折りたたむ。
ExpandBand 指定されたバンドのすべての行を展開する。
RowExpanded 指定されたバンド内で現在の行が展開されている場合は、True を返す。

マスター/詳細データソース内のレコードセットのレベル数が事前にわからない場合は、コード内で Bands プロパティを調べます。利用できるバンドの数は、0から -1 までです。

アプリケーションで次のイベントを使用すると、ユーザーによって開始された階層表示操作に応答できます。

イベント 説明
Collapse ユーザーがバンドを折りたたむと発生する。
Expand ユーザーがバンドを展開すると発生する。

Dropdown Hierarchical Data Display

True DBGrid for WinForms では、データソース間の親子関係を表示する際に、マスターテーブル内からまったく新しい C1TrueDBGrid を開き、そこに子のデータレコードを表示できます。ChildGrid プロパティを設定して2つのグリッドコントロールを接続し、数行のコードを記述するだけで、完全に編集可能な子データのドロップダウンを作成できます。このドロップダウンは、クリックするだけでマスターテーブル内に表示されます。

階層化されたデータセットがすでに設定されている場合は、C1TrueDBGrid1ChildGrid プロパティのテキストボックスに C1TrueDBGrid2 と入力することで、親子関係を作成できます。

次に、C1TrueDBGrid2SplitCollection エディタを開き、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;
}