Kombinationsfelder mit Daten füllen

Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!

Unter Access ist das einfach: Fremdschlüsselfeld als Nachschlagefeld definieren, Tabelle an Formular binden, Fremdschlüsselfeld in den Entwurf ziehen – fertig ist das Kombinationsfeld zur Auswahl von Werten einer Lookup-Tabelle. Unter C#/WPF sieht das etwas anders aus. Dieser Grundlagenartikel zeigt, wie Sie ein Kombinationsfeld mit den Daten einer Lookup-Tabelle füllen und wie Sie auf wichtige Informationen wie etwa den Primärschlüsselwert des gewählten Datensatzes zugreifen – und das auf Basis von typisierten und untypisierten DataSets.

Unter Access/VBA konnten Sie selbst auf Basis einer reinen Tabelle schnell ein Kombinationsfeld erstellen, das etwa das Feld Anrede aus tblAnreden anzeigte und das Primärschlüsselfeld AnredeID als gebundenes Feld nutzte. Unter WPF/C# sind dazu schon ein paar Zeilen Code nötig, damit es funktioniert.

Tabelle in ComboBox per C#

Die erste Variante, die wir uns dabei ansehen, basiert komplett auf C# (siehe Bild 1). Der XAML-Code, der das Aussehen des ComboBox-Steuerelements liefert, weiß nichts davon, dass das Steuerelement Daten aus einer Tabelle einer Datenbank anzeigen soll.

Einfaches Kombinationsfeld mit den Daten der Tabelle tblAnreden

Bild 1: Einfaches Kombinationsfeld mit den Daten der Tabelle tblAnreden

Dementsprechend kommt die Definition dieses ComboBox-Steuerelements sehr sparsam daher:

<ComboBox x:Name="cboAnreden" HorizontalAlignment="Left" Margin="95,45,0,0" VerticalAlignment="Top" Width="145" />

Der C#-Code, der beim Laden des Fensters ausgeführt werden soll und der für das Füllen des ComboBox-Steuerelements verantwortlich ist, fällt dafür umso größer aus (siehe Listing 1). Damit diese Methode aufgerufen wird, fügen wir dem Window-Element die Eigenschaft Loaded mit dem Wert Window_Loaded hinzu (Loaded eingeben, zwei Mal auf die Tabulator-Taste drücken). Das Window-Element sieht dann etwa so aus:

private void Window_Loaded(object sender, RoutedEventArgs e) {
     DataTable dtAnreden = new DataTable();
     string strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Suedsturm.mdb";
     string strSQL = "SELECT * FROM tblAnreden";
     OleDbConnection cnn = new OleDbConnection(strConnection);
     OleDbCommand cmd = new OleDbCommand();
     OleDbDataAdapter da;
     DataSet ds = new DataSet();
     DataTable dt;
     cmd.Connection = cnn;
     cmd.CommandText = strSQL;
     da = new OleDbDataAdapter(strSQL, cnn);
     da.Fill(ds, "tblAnreden");
     dt = ds.Tables["tblAnreden"];
     cboAnreden.ItemsSource = dt.DefaultView;
     cboAnreden.DisplayMemberPath = "Anrede";
     cboAnreden.SelectedValuePath = "AnredeID";
}

Listing 1: Füllen einer ComboBox per C#

<Window Title="MainWindow" ... Height="350" Width="525" WindowStartupLocation="CenterScreen" Icon="data_table.ico" Loaded="Window_Loaded">
     ...
</Window>

Die Methode Window_Loaded erledigt zunächst nichts Anderes, als ein untypisiertes DataSet zu erstellen – und zwar auf Basis der Tabelle tblAnreden der Access-Datenbank namens Suedsturm.mdb, die im gleichen Verzeichnis wie die .exe-Datei der erstellten Anwendung liegen soll.

Wichtig ist, dass wir am Ende ein DataTable-Objekt mit den gewünschten Daten der Tabelle tblAnreden erhalten. Dieses liefert über die Eigenschaft DefaultView eine Form, in der wir es an die Eigenschaft ItemsSource des ComboBox-Steuerelements übergeben können. Dies entspricht grundsätzlich dem Zuweisen einer Tabelle an die Eigenschaft RecordSource unter Access/VBA. Dort haben Sie für ein Kombinationsfeld über die Eigenschaften Gebundene Spalte, Spaltenanzahl und Spaltenbreiten festgelegt, welche Spalte als Wert des Kombinationsfeldes dient und welche angezeigt werden sollte. Das ist unter C# etwas gezielter formuliert: Hier nutzen Sie die Eigenschaft DisplayMemberPath, um den Namen der anzuzeigenden Spalte zu übergeben, in diesem Fall das Feld Anrede.

Die Eigenschaft SelectedValuePath hingegen nimmt das Feld entgegen, das man unter Access mit dem Index der gebundenen Spalte festgelegt hätte – in diesem Fall AnredeID.

Angezeigten Wert und tatsächlichen Wert auslesen

 

Schreibe einen Kommentar