EDM: Kombinationsfelder erweitern

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

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.
  • <Window x:Class="BlaetternInDetails.ArtikelMitKombinationsfeld" ...
             Title="ArtikelMitKombinationsfeld" Height="250" Width="300" Loaded="Window_Loaded">
         <Window.Resources>
             <CollectionViewSource x:Key="artikelViewSource" 
                 d:DesignSource="{d:DesignInstance {x:Type local:Artikel}, CreateList=True}"/>
             <CollectionViewSource x:Key="kategorienViewSource" 
                 d:DesignSource="{d:DesignInstance {x:Type local:Kategorie}, CreateList=True}"/>
         </Window.Resources>
         <Grid DataContext="{StaticResource artikelViewSource}">
             <Grid x:Name="grid1" HorizontalAlignment="Left" Margin="22,11,0,0" VerticalAlignment="Top">
                 ...
                 <ComboBox x:Name="kategorieIDComboBox" ItemsSource="{Binding Source={StaticResource kategorienViewSource}}" 
                     DisplayMemberPath="Bezeichnung" SelectedValuePath="ID" SelectedValue="{Binding Path=KategorieID}">
                 </ComboBox>
                 ...
             </Grid>
         </Grid>
    </Window>

    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

 

Schreibe einen Kommentar