インフラジスティックス・ジャパン株式会社Blog

インフラジスティックス・ジャパン株式会社のチームメンバーが技術トレンド、製品Tips、サポート情報からライセンス、日々の業務から感じることなど、さまざまなトピックについてお伝えするBlogです。

XamDataGrid 列をコードビハインドで明示的に生成する

XamDataGrid の列をコードビハインドで生成する例をご紹介します。データソースには DataTable を利用しています。

XamDataGrid の定義(XAML)

表示する列は動的に変わることを想定し、XAML 側での定義は行っていません。XamDataGrid ではバインドデータから自動的にデータ型に応じた列を生成するようになっています。ここではバインドするデータのうち、表示しないフィールドもあるため AutoGenerateFields に False を指定し、列の自動生成を無効化します。

<igWPF:XamDataGrid DataSource="{Binding}"
                   FieldLayoutInitialized="XamDataGrid_FieldLayoutInitialized">
    <igWPF:XamDataGrid.FieldLayoutSettings>
        <!--列の自動生成を抑止-->
        <igWPF:FieldLayoutSettings AutoGenerateFields="False"/>
    </igWPF:XamDataGrid.FieldLayoutSettings>
</igWPF:XamDataGrid>

 

バインドデータ

データは ID 列、Name 列、Age 列、HomeTown 列を持つ DataTable です。


C#

DataTable dt = new DataTable();
PrimaryColumn[0] = dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Age", typeof(int));
dt.Columns.Add("HomeTown", typeof(string));

// データの行追加
dt.Rows.Add(1, "たかし", 28, "静岡");
...

 

VB.NET

Dim dt As New DataTable()
PrimaryColumn(0) = dt.Columns.Add("ID", GetType(Integer))
dt.Columns.Add("Name", GetType(String))
dt.Columns.Add("Age", GetType(Integer))
dt.Columns.Add("HomeTown", GetType(String))
' データ行の追加
dt.Rows.Add(1, "たかし", 28, "静岡")
...

 

列の生成

バインドデータのうち、ID 列は不要とし、Name 列、Age 列、HomeTown 列を生成します。FieldLayoutInitialized イベントをハンドルし、列を FieldLayout.Fields コレクションに追加します。


C#

private void XamDataGrid_FieldLayoutInitialized(object sender, Infragistics.Windows.DataPresenter.Events.FieldLayoutInitializedEventArgs e)
{
    //明示的に列(Field)を生成します。
    //Field.Name プロパティには DataTable の対応する列名を指定します。
    Field nameField = new Field { Name = "Name", Label="名前" };
    e.FieldLayout.Fields.Add(nameField);

    Field ageField = new Field { Name = "Age", Label = "年齢" };
    e.FieldLayout.Fields.Add(ageField);

    Field hometownField = new Field { Name = "HomeTown", Label = "出身地" };
    e.FieldLayout.Fields.Add(hometownField);
}

 

VB.NET

Private Sub XamDataGrid_FieldLayoutInitialized(sender As Object, e As Infragistics.Windows.DataPresenter.Events.FieldLayoutInitializedEventArgs)
    '明示的に列(Field)を生成します。
    'Field.Name プロパティには DataTable の対応する列名を指定します。
    Dim nameField As New Field() With {
        .Name = "Name",
        .Label = "名前"
    }
    e.FieldLayout.Fields.Add(nameField)

    Dim ageField As New Field() With {
        .Name = "Age",
        .Label = "年齢"
    }
    e.FieldLayout.Fields.Add(ageField)

    Dim hometownField As New Field() With {
        .Name = "HomeTown",
        .Label = "出身地"
    }
    e.FieldLayout.Fields.Add(hometownField)
End Sub

 

実行結果

データソースの列の内、ID 列以外を表示することができました。 

XamDataGrid DataTable バインド

 

サンプル

サンプルはこちらからどうぞ 
XamDataGrid_DataTable_Fields_CS.zip 
XamDataGrid_DataTable_Fields_VB.zip

(本サンプルは16.1.20161.2099バージョンで作成されました) 

リファレンス

DataPresenter コントロールを DataSet にバインド 
https://help.jp.infragistics.com/doc/WPF/2016.1/CLR4.0/?page=xamDataPresenter_Binding_a_DataPresenter_Control_to_a_DataSet.html

フィールド レイアウトの定義 
https://help.jp.infragistics.com/doc/WPF/2016.1/CLR4.0/?page=xamDataPresenter_Define_a_Field_Layout.html