Q056. XamDataGrid で列を固定表示するには?

A. Field クラスを使って設定します。
データソースの列とバインドさせるには Field.Name プロパティに列名を指定します。Name プロパティに列名指定するのってやや気持ち悪い仕様になっててベンダーさんも認識してるようですが、WPF 1.0 くらいからの仕様だそうで今更変えられないだろうから仕方ないですね。でも Name プロパティのエイリアス設ければ逃げられそうな感がしなくもないのですが・・・


まず XAML のサンプル。XamDataGrid.FieldLayouts に列を定義します。あと列が自動生成されないよう FieldLayoutSettings.AutoGenerateFields は False にしておきましょう。

<Window x:Class="MainWindow"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:igDP="http://infragistics.com/DataPresenter"
  Title="MainWindow" Height="350" Width="525" >
  <Grid>
    <Grid.RowDefinitions>
      <RowDefinition Height="50" />
      <RowDefinition />
    </Grid.RowDefinitions>
    <igDP:XamDataGrid Grid.Row="1" Name="XamDataGrid1" >
      <igDP:XamDataGrid.FieldLayouts>
        <igDP:FieldLayout>
          <igDP:FieldLayout.Fields>
            <igDP:Field Name="kokyaku_code" Label="顧客番号" Width="12*" />
            <igDP:Field Name="kokyaku_mei" Label="顧客名" Width="20*" />
            <igDP:Field Name="address" Label="住所" Width="30*" />
            <igDP:Field Name="tantousha_mei" Label="担当者" Width="12*" />
            <igDP:Field Name="tel" Label="電話番号" Width="20*" />
          </igDP:FieldLayout.Fields>
        </igDP:FieldLayout>
      </igDP:XamDataGrid.FieldLayouts>
      <igDP:XamDataGrid.FieldLayoutSettings>
        <igDP:FieldLayoutSettings AutoGenerateFields="False" />
      </igDP:XamDataGrid.FieldLayoutSettings>
    </igDP:XamDataGrid>
  </Grid>
</Window>


Window のInitialized イベント内で DataTable を生成し XamDataGrid.DataSource にバインドします。

Option Explicit On
Option Strict On

Imports System.Data

Class MainWindow
    Private Sub Window_Initialized(sender As Object, e As EventArgs) Handles MyBase.Initialized
        Dim table As New DataTable()
        table.Columns.Add("kokyaku_code", GetType(String))
        table.Columns.Add("kokyaku_mei", GetType(String))
        table.Columns.Add("address", GetType(String))
        table.Columns.Add("tantousha_mei", GetType(String))
        table.Columns.Add("tel", GetType(String))

        table.Rows.Add(New Object() {"A00001", "田中商事", "東京都港区", "田中", "03-XXXX-XXXX"})
        table.Rows.Add(New Object() {"A00002", "山田建設", "東京都中央区", "山田", "03-XXXX-XXXX"})
        table.Rows.Add(New Object() {"A00003", "佐藤商会", "東京都新宿区", "佐藤", "03-XXXX-XXXX"})
        table.Rows.Add(New Object() {"A00004", "鈴木豆腐店", "東京都大田区", "鈴木", "03-XXXX-XXXX"})

        Me.XamDataGrid1.DataSource = table.DefaultView
    End Sub
End Class


するとこうなる。


Field.Name の注意点

あと開発してて気づいたんですが、テーブルに存在しない列名を Field.Name に設定すると、列がすべて表示されなくなるので注意が必要です。

<Window x:Class="MainWindow"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:igDP="http://infragistics.com/DataPresenter"
  Title="MainWindow" Height="350" Width="525" >
  <Grid>
    <Grid.RowDefinitions>
      <RowDefinition Height="50" />
      <RowDefinition />
    </Grid.RowDefinitions>
    <igDP:XamDataGrid Grid.Row="1" Name="XamDataGrid1" >
      <igDP:XamDataGrid.FieldLayouts>
        <igDP:FieldLayout>
          <igDP:FieldLayout.Fields>
            <igDP:Field Name="kokyaku_code" Label="顧客番号" Width="12*" />
            <igDP:Field Name="kokyaku_mei" Label="顧客名" Width="20*" />
            <igDP:Field Name="address" Label="住所" Width="30*" />
            <igDP:Field Name="tantousha_mei" Label="担当者" Width="12*" />
            <!-- 試しにテーブルに存在しない列を指定してみる -->
            <igDP:Field Name="qb" Label="インキュベーター" Width="20*" />
          </igDP:FieldLayout.Fields>
        </igDP:FieldLayout>
      </igDP:XamDataGrid.FieldLayouts>
      <igDP:XamDataGrid.FieldLayoutSettings>
        <igDP:FieldLayoutSettings AutoGenerateFields="False" />
      </igDP:XamDataGrid.FieldLayoutSettings>
    </igDP:XamDataGrid>
  </Grid>
</Window>


レコードはバインドされてるようですが、列が全く表示されません。これ仕様みたいです。


WPF FAQ の目次に戻る