none
Verbinden eines DataSets mit einem DataGrid RRS feed

  • Frage

  • Hallo Netzwelt,

    die folgende Frage wurde sicherlich schon oft gestellt.

    Dennoch habe ich leider trotz langer Suche keine passende Antwort gefunden.

    Es geht einfach nur darum ein DataSet mit 2 Tabellen, welche natürlich verbunden sind in einem Grid abzubilden.

    Die angehängte Tabelle soll in der ComboBox angezeigt werden.

    Hier mein bisheriger Stand:

    c#

    private AirplaneDBDataSet AirplaneDataSet = new AirplaneDBDataSet();
            private AirplaneDBDataSetTableAdapters.AirplaneTableAdapter AirTableAdapter = new AirplaneDBDataSetTableAdapters.AirplaneTableAdapter();
            private AirplaneDBDataSetTableAdapters.PassengerTableAdapter PassTableAdapter = new AirplaneDBDataSetTableAdapters.PassengerTableAdapter();
    
    
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
    AirTableAdapter.Fill(AirplaneDataSet.Airplane);           PassTableAdapter.Fill(AirplaneDataSet.Passenger);
    this.DataContext = AirplaneDataSet;
    }
    
    

    xaml:

     <DataGrid x:Name="DataGrid1" AlternatingRowBackground="#FFF0F0F0" ItemsSource="{Binding}" Height="420" AutoGenerateColumns="False">
                        <DataGrid.Columns>
                            <DataGridTextColumn Header="ID" Binding="{Binding AirplaneID}" IsReadOnly="True" MinWidth="30"/>
                            <DataGridTextColumn Header="Model" Binding="{Binding Model}"  Width="Auto" MinWidth="160"/>
                            <DataGridTextColumn  Header="Fuel" Binding="{Binding Fuel}" MinWidth="50"/>
                          
                            <DataGridComboBoxColumn x:Name="ComboBox1" Header="Passenger" ItemsSource="{Binding Passenger}" DisplayMemberPath="Name" SelectedValuePath="{Binding Path=AirplaneID}"  SelectedValueBinding="{Binding Path=AirplaneID}"   />
                            
                        </DataGrid.Columns>
                    </DataGrid>

    Ich bin für jeden Lösungsansatz dankbar.

    Mfg

    Kevin

    Freitag, 5. Juni 2015 15:27

Antworten

  • Hi Kevin,
    nachfolgend mal ein kleines Beispiel, wie man eine Master-Child-Darstellung mit DataGrid und Combobox-Spalte lösen kann:

    XAML:

    <Window x:Class="WpfApplication1.Window14"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="Window14" Height="300" Width="400"
            xmlns:local="clr-namespace:WpfApplication1">
      <Window.Resources>
        <local:ViewModel14 x:Key="vm"/>
      </Window.Resources>
        <Grid DataContext="{Binding Source={StaticResource vm}}">
        <DataGrid AlternatingRowBackground="#FFF0F0F0" ItemsSource="{Binding Child}" Height="420" AutoGenerateColumns="False">
          <DataGrid.Columns>
            <DataGridTextColumn Header="ID" Binding="{Binding AirplaneID}" IsReadOnly="True" MinWidth="30"/>
            <DataGridTextColumn Header="Model" Binding="{Binding Model}"  Width="Auto" MinWidth="160"/>
            <DataGridTextColumn  Header="Fuel" Binding="{Binding Fuel}" MinWidth="50"/>
            <DataGridComboBoxColumn Header="Passenger" ItemsSource="{Binding Source={StaticResource vm}, Path=Master }" DisplayMemberPath="Name" SelectedValuePath="ID" SelectedValueBinding="{Binding Path=AirplaneID}"   />
          </DataGrid.Columns>
        </DataGrid>
      </Grid>
    </Window>

    Und der ViewModel dazu:

    using System;
    using System.Data;
    
    namespace WpfApplication1
    {
      class ViewModel14
      {
        public ViewModel14()
        {
          Random rnd = new Random();
          DataTable dt1 = new DataTable("Master");
          dt1.Columns.Add("ID", typeof(int));
          dt1.Columns.Add("Name", typeof(string));
          for (int i = 1; i < 10; i++)
          {
            dt1.Rows.Add(i, string.Format("Name {0}", i));
          }
          dset.Tables.Add(dt1);
          DataTable dt2 = new DataTable("Child");
          dt2.Columns.Add("AirplaneID", typeof(int));
          dt2.Columns.Add("Model", typeof(string));
          dt2.Columns.Add("Fuel", typeof(string));
          for (int i = 1; i < 100; i++)
          {
            dt2.Rows.Add(rnd.Next(1, 10), string.Format("Model {0}", i), string.Format("Fuel {0}", rnd.Next(1, 50)));
          }
          dset.Tables.Add(dt2);
        }
        private DataSet dset = new DataSet();
        public DataView Child { get { return dset.Tables["Child"].DefaultView; } }
        public DataView Master { get { return dset.Tables["Master"].DefaultView; } }
      }
    }
    


    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks

    Freitag, 5. Juni 2015 17:38