EDM: Kombinationsfelder erweitern

Wenn Sie ein Abonnement des Magazins 'DATENBANKENTWICKLER' besitzen, können Sie sich anmelden und den kompletten Artikel lesen.
Anderenfalls können Sie das Abonnement hier im Shop erwerben.

EDM: Kombinationsfelder erweitern

Im Artikel »Lookup-Kombinationsfelder« zeigen wir, wie Sie eine per Drag and Drop aus dem Datenquellen-Bereich hinzugefügte Entität mit einem Kombinationsfeld versehen, mit dem Sie die Daten einer Lookup-Tabelle auswählen können. Dies wollen wir nun noch erweitern, und zwar um die Möglichkeit der Eingabe neuer Werte für die Lookup-Tabelle direkt über das Kombinationsfeld. Dazu nutzen wir ein neues Fenster, das die Daten der Tabelle Artikel anzeigt – und deren Kategorie per Kombinationsfeld auswählt.

Neuen Eintrag hinzufügen

Unter Access war es relativ einfach, ein Kombinationsfeld mit einer Funktion auszustatten, die dafür sorgte, dass neu eingegebene Einträge, die noch nicht in der Datensatzherkunft vorhanden waren, zur zugrunde liegenden Tabelle hinzugefügt werden und dann direkt im Kombinationsfeld angezeigt werden konnten. Wir wollen uns anschauen, wie dies unter WPF unter Verwendung unseres Entity Data Models auf Basis der Tabellen der Beispieldatenbank Bestellverwaltung funktioniert. Ein passendes Beispiel sind die Tabellen Artikel und Kategorien. Die Tabelle Artikel enthält ein Fremdschlüsselfeld, und zwar zur Auswahl der Kategorie des Artikels. Die Kategorien stammen wiederum aus der Tabelle Kategorien.

Für das neue Beispiel fügen wir der Datenquelle des Projekts die Entität Artikel hinzu. Ein neues Fenster soll die Daten der gleichnamigen Tabelle anzeigen. Dazu ändern wir den Typ der Entität Artikel per Kombinationsfeld auf Details und den Typ des Steuerelements KategorieID auf ComboBox. Dann ziehen Sie die Entität Artikel in das neue Fenster ArtikelMitKombinationsfeld und sortieren die enthaltenen Steuerelemente so wie in Bild 1 um. Damit die Daten auch im Fenster angezeigt werden, sind in aller Kürze die folgenden Schritte nötig:

Erstellen des Beispielfensters

Bild 1: Erstellen des Beispielfensters

  • Als Erstes ändern Sie den Entwurf im XAML-Code wie in Listing 1 dargestellt. Hier kommen vor allem die neue CollectionViewSource für die Kategorien und die Änderungen am ComboBox-Element zum Tragen.
  • Listing 1: Notwendige Änderungen am Fenster zur Anzeige von Artikeln mit Kategorien im Kombinationsfeld

  • Dann erweitern Sie den Code des Code behind-Moduls wie in Listing 2. Hier ist die Deklaration der beiden CollectionViewSource-Elemente und des Datenbankkontexts sowie deren Füllung im Ereignis Window_Loaded, das übrigens auch im XAML-Code noch hinzugefügt werden muss. Details hierzu erfahren Sie im Artikel EDM: Einfaches Detailfenster.
  • public partial class ArtikelMitKombinationsfeld : Window {
         public ArtikelMitKombinationsfeld() {
             InitializeComponent();
         }
         CollectionViewSource artikelViewSource;
         CollectionViewSource kategorienViewSource;
         BestellverwaltungEntities DBContext = new BestellverwaltungEntities();
         private void Window_Loaded(object sender, RoutedEventArgs e) {
             artikelViewSource = ((CollectionViewSource)(this.FindResource("artikelViewSource")));
             DBContext.Artikel.Load();
             artikelViewSource.Source = DBContext.Artikel.Local;
             kategorienViewSource = ((CollectionViewSource)(this.FindResource("kategorienViewSource")));
             DBContext.Kategorien.Load();
             kategorienViewSource.Source = DBContext.Kategorien.Local;
         }

    Listing 2: Anpassung der Code behind-Klasse des Fensters

Auf die Beschreibung der Navigationsschaltflächen verzichten wir an dieser Stelle – wie dies funktioniert, haben wir ebenfalls im Artikel EDM: Einfaches Detailfenster erläutert.

ComboBox zum Hinzufügen von Artikeln?

Nun schauen wir uns an, wie wir dem Kombinationsfeld einen neuen Eintrag unterjubeln können, der dann optimalerweise direkt in der zugrunde liegenden Tabelle Kategorien gespeichert wird. Wenn wir die Anwendung starten und in unserem Beispielfenster versuchen, wie etwa unter Access eine neue Kategorie einzugeben, stellen wir allerdings fest, dass ein ComboBox-Steuerelement wohl nicht zum Hinzufügen von Daten gemacht ist (siehe Bild 2). Was nun? Ein anderes Steuerelement wählen? Oder gibt es Einstellungen für das ComboBox-Steuerelement, die das Hinzufügen von eigenen Texten ermöglichen? Schauen wir uns doch zunächst eine einfache und auch für den Benutzer intuitive Variante an, bei der wir neben dem Kombinationsfeld eine Schaltfläche zum Hinzufügen eines Eintrags platzieren. Anschließend betrachten wir die direkte Eingabe neuer Elemente direkt in das Kombinationsfeld.

Das ComboBox-Steuerelement erlaubt nur die Auswahl, aber kein Anfügen von Einträgen.

Bild 2: Das ComboBox-Steuerelement erlaubt nur die Auswahl, aber kein Anfügen von Einträgen.

Einträge hinzufügen per Schaltfläche

Das Anbieten einer Schaltfläche mit einem Plus-Symbol scheint die offensichtlichere und intuitivere Variante zu sein, um Elemente zu einem Lookup-Kombinationsfeld hinzuzufügen. Nach einem Klick auf diese Schaltfläche soll eine Inputbox erscheinen, die den neuen Eintrag ermittelt (siehe ?Bild 3). Nach der Eingabe soll die Datenherkunft des Kombinationsfeldes direkt aktualisiert und der neue Eintrag übernommen werden, sodass das Kombinationsfeld diesen direkt anzeigt.

Kombinationsfeld mit Schaltfläche zum Hinzufügen neuer Einträge

Bild 3: Kombinationsfeld mit Schaltfläche zum Hinzufügen neuer Einträge

Im Entwurf des Fensters ArtikelMitKombinationsfeld_Button sieht dies wie in Bild 4 aus. Hier haben wir neben dem Kombinationsfeld eine neue Schaltfläche hinzugefügt, die wir mit einigen neuen Attributwerten ausgestattet haben.

Schaltfläche zum Hinzufügen neuer Einträge

Bild 4: Schaltfläche zum Hinzufügen neuer Einträge

Dies war die Leseprobe dieses Artikels.
Melden Sie sich an, um auf den vollständigen Artikel zuzugreifen.

Bitte geben Sie die Zeichenfolge in das nachfolgende Textfeld ein

Die mit einem * markierten Felder sind Pflichtfelder.

Ich habe die Datenschutzbestimmungen zur Kenntnis genommen.