In WPF 4.0 wurde das DataGrid Steuerelement als Standardsteuerelement hinzugefügt. Mit diesem Steuerelement lassen sich Datensätze in einem Raster darstellen und bearbeiten. Das DataGrid ist sehr umfangreich und mächtig. Im nachfolgenden wird lediglich der grundlegende Einsatz demonstriert.
Zur Demonstration wird als erstes eine Klasse Person erzeugt.
public class Person
{
public int Id { get; set; }
public string LastName { get; set; }
public string FirstName { get; set; }
public string Email { get; set; }
public Person(int id, string lastName, string firstName, string email)
{
Id = id;
LastName = lastName;
FirstName = firstName;
Email = email;
}
}
Innerhalb des MainWindow-Konstruktors wird ein Property (Eigenschaft) zur Aufnahme der Liste mit Personen angelegt und DataContext wird auf die MainWindow-Instanz (this) gesetzt, da die Liste der Personen in MainWindow verfügbar ist. Es lassen sich aber auch andere Datenquellen verwenden.
public MainWindow()
{
InitializeComponent();
p = new List<Person>();
p.Add(new Person(1, „Mustermann“, „Max“, „m.mustermann@mustermann.de“));
p.Add(new Person(2, „Musterfrau“, „Siglinde“, „sigmufra@smf.de“));
p.Add(new Person(3, „Doe“, „John“, „j.doe@jdoe.com“));
DataContext = this;
}
Im nächsten Schritt wird in der MainWindow.xaml ein DataGrid hinzugefügt und die ItemsSource Property an p gebunden.
<Window x:Class=“DataGrid.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:DataGrid“
mc:Ignorable=“d“
Title=“MainWindow“ Height=“350″ Width=“525″>
<Grid>
<DataGrid ItemsSource=“{Binding p}“ />
</Grid>
</Window>
Startet man das Programm, erhält man auch schon das nachfolgende Fenster. Die Spalten (Columns) werden vom DataGrid ohne weiteres Hinzutun zur Laufzeit (also dynamisch) erzeugt. Per Vorgabe ist das Property AutoGenerateColumns des DataGrid auf true gesetzt. Ändert man dieses Property auf false, erzeugt das DataGrid die Spalten nicht mehr automatisch.
Verzichtet man auf die automatische Erzeugung der Spalten durch das DataGrid , muss man sich selbst darum kümmern und die entsprechenden Definitionen mittels DataGrid.Columns in der XAML-Datei vornehmen.
<DataGrid ItemsSource=“{Binding p}“ AutoGenerateColumns=“False“>
<DataGrid.Columns>
<DataGridTextColumn Header=“Name“ Binding=“{Binding LastName}“ />
<DataGridTextColumn Header=“Vorname“ Binding=“{Binding FirstName}“ />
<DataGridTextColumn Header=“eMail“ Binding=“{Binding email}“ />
</DataGrid.Columns>
</DataGrid>
Durch diese Vorgehensweise lassen sich z.B. die Spaltenbezeichnungen ändern oder nicht benötigte Spalten können ausgelassen werden. Außerdem werden die Columns des Grid im Designer bereits entsprechend der Definition dargestellt.
Bei Datentabellen mit vielen Columns würde es aber einen nicht unerheblichen Aufwand bedeuten, wenn man zwecks Änderung von Spaltenbezeichnungen oder Auslassen von Spalten alle benötigten Columns mit DataGrid.Columns definieren müsste. Eine alternative Möglichkeit bietet das Event AutoGeneratingColumn. Bei jedem automatischen Erzeugen einer Spalte wird dieser Event aufgerufen.
<DataGrid ItemsSource=“{Binding p}“
AutoGeneratingColumn=“DataGrid_AutoGeneratingColumn“>
</DataGrid>
Innerhalb des Eventhandlers lässt sich dann überprüfen, welche Spalte gerade erzeugt wurde. Wird Cancel auf true gesetzt, wird eine Spalte ausgelassen. Die Änderung der Spaltenüberschrift erfolgt über Column.Header.
private void DataGrid_AutoGeneratingColumn(
object sender,DataGridAutoGeneratingColumnEventArgs e)
{
switch (e.PropertyName) {
case „Id“: e.Cancel = true; break;
case „LastName“: e.Column.Header = „Name“; break;
case „FirstName“: e.Column.Header = „Vorname“; break;
}
}