12.4 Datenbindung
In diesem Abschnitt soll gezeigt werden, wie einfach die Erstellung einer Datenbindung mithilfe der WPF ist, zum Beispiel zu einer Datenbank. Als Steuerelement wird ein Steuerelement vom Typ DataGrid genommen, siehe Abbildung 12.6. Es bietet viel Komfort durch eine große Anzahl an Einstellmöglichkeiten. Außerdem ist es editierbar und somit nicht nur zur Darstellung von großen Datenmengen (zum Beispiel aus Datenbanken) sondern auch zur Veränderung derselben geeignet.
Abbildung 12.6 Datenbindung mit DataGrid
Es wird die bereits bekannte Datenbank firma.accdb mit der Tabelle personen verwendet. Sie wird dem Projekt per Drag & Drop im Projektmappen-Explorer hinzugefügt. Es öffnet sich ein Assistenten-Dialogfeld. Darin wird die Erstellung des DataSets abgebrochen.
Nach dem Start des Programms wird der Inhalt der Tabelle geladen und dargestellt. Der Benutzer kann Daten ändern, neu hinzufügen oder löschen. Beim Schließen des Fensters wird die Datenbank mit den geänderten Daten aktualisiert.
Der Aufbau in XAML ist einfach:
<Window ... Loaded="Window_Loaded" Closing="Window_Closing">
<StackPanel>
<DataGrid x:Name="dg" ItemsSource="{Binding}" />
</StackPanel>
</Window>
Listing 12.9 Projekt »WPFDataGridAccess«, XAML-Code
Die Eigenschaft ItemsSource verweist auf die Auflistung, die als Inhalt für das DataGrid dienen soll. Die Auflistung wird in diesem Falle über eine Datenbindung ermittelt.
Es folgt der Code der Fensterklasse:
Imports System.Data
Imports System.Data.OleDb
Class MainWindow
Dim da As OleDbDataAdapter
Dim dt As DataTable
Sub New()
InitializeComponent()
Dim con As OleDbConnection = New OleDbConnection(
"Provider=Microsoft.ACE.OLEDB.12.0;" &
"Data Source=firma.accdb")
da = New OleDbDataAdapter("select * from personen", con)
Dim cb As OleDbCommandBuilder =
New OleDbCommandBuilder(da)
dt = New DataTable()
End Sub
Private Sub Window_Loaded(sender As Object,
e As RoutedEventArgs)
da.Fill(dt)
dg.DataContext = dt
End Sub
Private Sub Window_Closing(sender As Object,
e As ComponentModel.CancelEventArgs)
da.Update(dt)
End Sub
End Class
Listing 12.10 Projekt WPFDataGridAccess, Programmcode
Es werden die beiden Namespaces System.Data und System.Data.OleDb benötigt. Die Instanzen der Klassen OleDbAdapter und DataTable werden sowohl beim Laden als auch beim Aktualisieren der Daten genutzt, daher werden sie zu Eigenschaften der Fensterklasse.
Im Konstruktor der Fensterklasse wird über die Instanz der Klasse OleDbConnection die Verbindung zur Datenbank hergestellt. Die Instanz der Klasse OleDbAdapter beinhaltet nach ihrer Erzeugung den Inhalt des SQL-Kommandos select zur Auswahl der Daten. Die Instanz der Klasse OleDbCommandBuilder erzeugt passend für diesen Adapter die Inhalte der SQL-Kommandos insert, update und delete. Es wird eine Instanz einer DataTable erzeugt.
Beim Laden des Fensters wird die DataTable über den Adapter gefüllt. Die Eigenschaft DataContext des DataGrid verweist auf die gefüllte DataTable.
Beim Schließen des Fensters (Ereignis Window_Closing()) wird die Datenbank aus der DataTable über den Adapter durch Aufruf der Methode Update() aktualisiert. Dabei kommen die SQL-Kommandos zum Einsatz, die über die Instanz der Klasse OleDbCommandBuilder erzeugt wurden.
Der XAML-Code ist sehr kurz. Dies liegt daran, dass ein DataGrid in seinen Standard-Einstellungen bereits viel Funktionalität bietet. Diese Standard-Einstellungen können Sie mithilfe der nachfolgenden Beschreibung testen. Außerdem können Sie die genannten Alternativen ausprobieren.
Sie können Daten ändern, hinzufügen oder löschen, weil die boolesche Eigenschaft IsReadOnly den Wert False hat. Auch wenn sie den Wert True hat, können Sie das Hinzufügen neuer Datensätze verhindern, indem Sie CanUserAddRows auf False setzen. Das Entsprechende gilt für das Löschen von Datensätzen und CanUserDeleteRows.
Sie können mehrere Datensätze, ob zusammenhängend oder nicht, auswählen, weil die Eigenschaft SelectionMode den Wert Extended hat. Die Enumeration DataGridSelectionMode bietet außerdem noch den Wert Single, für die einfache Auswahl.
Falls Sie auf eine beliebige Zelle in einer Zeile klicken, so wird die gesamte Zeile ausgewählt, weil die Eigenschaft SelectionUnit den Wert FullRow hat. Der Wert Cell aus der Enumeration DataGridSelectionUnit ermöglicht die Auswahl einer einzelnen Zelle. Der Wert CellOrRowHeader ermöglicht beides, dabei muss zur Auswahl einer ganzen Zeile auf den Zeilenkopf geklickt werden.
Die Spalten lassen sich nach Wert sortieren, weil CanUserSortColumns den Wert True hat. Derselbe Wert für CanUserReorderColumns ermöglicht den Tausch von Spalten. Spaltenbreite und Zeilenhöhe lassen sich verändern, weil CanUserResizeColumns und CanUserResizeRows den Wert True haben.
Es sind alle Gitternetzlinien sichtbar, weil die Eigenschaft GridLinesVisibility den Wert All hat. Weitere Werte aus der Enumeration DataGridGridLinesVisibility sind None, Horizontal und Vertical. Alle Zeilen- und Spaltenköpfe sind sichtbar, weil die Eigenschaft HeadersVisibility ebenfalls den Wert All hat. Die Enumeration DataGridHeadersVisibility bietet noch die Werte None, Column und Row.
Sie können eine ganze Zeile ohne Header in Form einer Tabellenzeile in die Zwischenablage kopieren, zum Beispiel mit der Tastenkombination + . Dafür sorgt der Wert ExcludeHeader für die Eigenschaft ClipboardCopyMode. Weitere Werte in der Enumeration DataGridClipboardCopyMode sind IncludeHeader und None. Anschließend könnten Sie die Tabellenzeile(n) zum Beispiel in MS Word oder MS Excel einfügen.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.