本記事の概要
過去記事「データグリッドにデータを表示する方法」では、DataGrid にデータを表示する方法について説明しました。
この記事では、複数のデータを連結して1つのセルに表示する方法について説明します。
公式サイト情報はコチラを参照してください。
複数のデータを1つにまとめるための基本方法
1つのデータを表示する際は、<DataGridTextColumn> を使用しますが、複数のデータを1つにまとめて表示する場合は <DataGridTemplateColumn> を使用します。
以下に、複数データを1つにまとめる時のテンプレを示します。
まずは、1つの列の中に複数データを表示できるようにするため <DataGridTemplateColumn> を使用します。このときヘッダーに表示する文字列は Header プロパティを使用します。
次に、複数のデータを表示するためのセルを作成するために <DataGridTemplateColumn.CellTemplate> を使用します。この内側には <DataTemplate> を置き、さらにその内側には、複数のコントロールを配置できるコンテナコントロールを置きます。この例では、<StackPanel> を配置して、複数のコントロールが横方向になるよう、Orientation プロパティを Horizontal に設定しています。ここでは、<TextBlock> を2つ配置して、テキストデータを2つ表示できるようにしています。
<DataGridTemplateColumn Header="ヘッダーに表示する文字列"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding 連結するデータ}" /> <TextBlock Text="{Binding 連結するデータ}" /> </StackPanel> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn>
実例
上記を踏まえた上で、実例を見ていきましょう。
ここでは、住所録のデータ一覧を表示する例を示します。
DataGrid にバインド(ItemsSource に連結)するデータクラスを作成します。あとでこのクラスの Prefecture と City を1つのセルに表示します。
namespace WpfSample { public class AddressData { // Id public string Id { get; set; } // 氏名 public string Name { get; set; } // 年齢 public int Age { get; set; } // 郵便番号 public string ZipCode { get; set; } // 県 public string Prefecture { get; set; } // 市町村 public string City { get; set; } } }
XAML は以下の通りです。
16 〜 25行目が、セルに複数のデータを表示する箇所です。先ほど作成した AddressData クラスの Prefecture と City をそれぞれの <TextBlock> に表示しています。
MainWindow.xaml の例
<Window x:Class="WpfSample.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfSample" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Grid> <DataGrid x:Name="dataGrid" AutoGenerateColumns="False" > <DataGrid.Columns> <DataGridTextColumn Header="Id" Binding="{Binding Id}"/> <DataGridTextColumn Header="氏名" Binding="{Binding Name}"/> <DataGridTextColumn Header="年齢" Binding="{Binding Age}"/> <DataGridTextColumn Header="郵便番号" Binding="{Binding ZipCode}"/> <DataGridTemplateColumn Header="住所"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding Prefecture}" /> <TextBlock Text="{Binding City}" /> </StackPanel> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid> </Grid> </Window>
最後にデータを表示するコードを示します。
using System.Collections.ObjectModel; using System.Windows; namespace WpfSample { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); dataGrid.ItemsSource = new ObservableCollection<AddressData> { new AddressData { Id= "1", Name="山田 棟上", Age=14, ZipCode="037-9950", Prefecture="京都府", City="京都市" }, new AddressData { Id= "2", Name="梶 朱莉", Age=36, ZipCode="736-9872", Prefecture="群馬県", City="高崎市" }, new AddressData { Id= "3", Name="砂田 正浩", Age=38, ZipCode="220-9735", Prefecture="鳥取県", City="鳥取市" }, new AddressData { Id= "4", Name="宇都宮 修司",Age= 22, ZipCode="286-1928", Prefecture="新潟県" ,City="新潟市" }, new AddressData { Id= "5", Name="寺崎 尚生", Age=15, ZipCode="382-2430",Prefecture= "愛媛県", City="松山市" } }; } } }
実行例は以下の通りです。
コメント