none
dynamische Datenbindung an DataGrid in RowDetailsTemplate RRS feed

  • Frage

  • Hallo,

    ich habe folgendes vor: ich zeige Daten in einem DataGrid an. Je nach Auswahl sollen weitere Daten aus diversen anderen Tabellen (abhängig von der Auswahl im DataGrid) in einem weiteren DataGrid in den RowDetails angezeigt werden.

    Da diese zusätzlichen Daten erst nach Auswahl im "Vater-DataGrid" ermittelt werden können, war meine Idee, mit dem SelectionChanged-Event die notwendigen Daten zu ermitteln und dann ans "innere" DataGrid zu binden, um sie dann anzuzeigen. Das scheitert aber schon daran, das ich im Code-Behind nicht ans "innere" DataGrid komme, um dort Daten binden zu können.

    Hat jemand eine Idee, wie ich dieses Problem lösen könnte bzw. wie ich dazu vorgehen muss?

    Danke!

    Mittwoch, 17. August 2011 10:35

Antworten

  • Nach vielen Versuchen bin ich nun doch zu einer Lösung gekommen, allerdings nicht über das SelectionChanged-Event, sondern dem RowDetailsVisibilityChanged-Event.

    Nach Auswahl eines DataGrid-Items folgt dynamisches Binden von Daten aus anderen Tabellen an ein DataGrid im RowDetailsTemplate

    XAML

     <!-- das DataGrid für die Basis-Tabelle -->
     <DataGrid Name="dgrBasis"
       AutoGenerateColumns="False" 
       Style="{DynamicResource DataGridStyle1}"
       ItemsSource="{Binding}"
       RowDetailsVisibilityChanged="dgrBasis_RowDetailsVisibilityChanged">
    
      <DataGrid.RowDetailsTemplate>
      <DataTemplate>
       <!-- das DataGrid für die Detail-Tabelle, deren Daten dynamisch erzeugt werden -->
       <DataGrid AutoGenerateColumns="False">
       <DataGrid.Columns>
        <DataGridTextColumn Header="Detail 1" 
    								Binding="{Binding detail1}" 
    								CellStyle="{StaticResource cellStyle2}" />
        <DataGridTextColumn Header="Detail 2" 
    								Binding="{Binding detail2}"
    								CellStyle="{StaticResource cellStyle2}" />
        <!-- usw... -->
       </DataGrid.Columns>
       </DataGrid>
      </DataTemplate>
      </DataGrid.RowDetailsTemplate>
    
      <DataGrid.Columns>
      <DataGridTextColumn Header="Basis 1" 
         		Binding="{Binding Path=basis1}" 
         		CellStyle="{StaticResource cellStyle1}" />
      <DataGridTextColumn Header="Basis 2" 
         		Binding="{Binding Path=basis2}" 
         		CellStyle="{StaticResource cellStyle1}" />
      <!-- usw... -->
      </DataGrid.Columns>
     </DataGrid>
    
    

    Code-Behind (C#)
     public MainWindow()
     {
      InitializeComponent();
    
      //...
      dgrBasis.DataContext = meinDataSet.Basistabelle;
      //...
     }
    
     private void dgrBasis_RowDetailsVisibilityChanged(object sender, DataGridRowDetailsEventArgs e)
     {
      // das RowDetailsTemplate-DataGrid
      DataGrid dgrDetails = e.DetailsElement as DataGrid;
    
      // exemplarisch: Kriterium für die Erstellung der Detail-Tabelle
      // (hier: aus einem typisierten DataSet)
      String guid = ((e.Row.Item as DataRowView).Row as meinDataSet.BasistabelleRow).guid;
      DetailtabelleTableAdapterTA.Fill(meinDataSet.Detailtabelle, guid);
    
      // dem RowDetailsTemplate-DataGrid die eben erzeugten Daten zuweisen
      dgrDetails.ItemsSource = ((IListSource)meinDataSet.Detailtabelle).GetList();
     }
    
    
    Vielleicht nicht die sauberste Lösung, bestimmt nicht die beste Lösung, aber es funktioniert ;)

     



    • Als Antwort markiert KeepCoolMan Mittwoch, 17. August 2011 18:01
    Mittwoch, 17. August 2011 17:55