none
Sortiertes Datagrid in Datatable schreiben RRS feed

  • Frage

  • Hi

    gibt es eine "einfache"  möglichkeit den inhalt von einem datagrid in eine datatable zu schreiben ?

    Grüße

    Klaus


    Visual Studio 2010 Proffessional / Microsoft Visual Basic 2010

    Donnerstag, 31. Mai 2012 08:49

Antworten

  • Die Lösung ist ohne Kenntnis der konkreten Aufgabenstellung nicht zu bewerten.

    Wenn lediglich die Datenobjekte sortiert durchlaufen werden sollen, dann ist keine neue Tabelle (...ToTable) erforderlich. Wenn jedoch eine nachzunutzende Methode, auf die man keinen Zugriff hat, eine sortierte Tabelle erfordert, dann ist das schon ein funktionierender Weg.

    Hier mal eine Demo zum durchlaufen einer per Klick auf den Spaltenkopf eines DataGrid sortierten Datensatzfolge:

    <Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
      <Grid>
        <Grid.ColumnDefinitions>
          <ColumnDefinition/>
          <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <DataGrid Grid.Column="0" ItemsSource="{Binding Daten}" AutoGenerateColumns="false">
          <DataGrid.Columns>
            <DataGridTextColumn Header="ID" Binding="{Binding ID}"/>
            <DataGridTextColumn Header="Spalte1" Binding="{Binding Spalte1}"/>
          </DataGrid.Columns>
        </DataGrid>
        <StackPanel Grid.Column="1">
          <Button Name="btnShow" Content="Anzeige" />
          <ListBox Name="lb"/>
        </StackPanel>
      </Grid>
    </Window>

    Dazu der CodeBehind:

    Imports System.ComponentModel
    Imports System.Data
    
    Class MainWindow
    
      Private Sub MainWindow_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles Me.Loaded
        Me.DataContext = Me
        '
        Dim rnd As New Random
        '
        dt = New DataTable
        With dt
          With .Columns
            .Add("ID", GetType(Integer))
            .Add("Spalte1", GetType(String))
          End With
          For i = 1 To 10
            Dim r = dt.NewRow
            r(0) = i
            Dim s As String = ""
            For k = 1 To rnd.Next(10, 20)
              s &= Chr(rnd.Next(65, 91))
            Next
            r(1) = s
            dt.Rows.Add(r)
          Next
        End With
      End Sub
    
      Public ReadOnly Property Daten() As DataView
        Get
          Return dt.DefaultView
        End Get
      End Property
    
      Private dt As DataTable
    
      Private Sub btnShow_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnShow.Click
        Me.lb.Items.Clear()
        For Each r As DataRowView In dt.DefaultView
          Me.lb.Items.Add(String.Format("{0:00} - {1}", r(0), r(1)))
        Next
      End Sub
    
    End Class

    --
    Viele Gruesse
    Peter

    Donnerstag, 31. Mai 2012 14:55

Alle Antworten

  • Die einfachste Möglichkeit ist, als Datenquelle für das Grid die DataTable zu nutzen. Da werden die im Grid erfassten Daten sofort in die DataRows der DataTable geschrieben.
     
    --
    Viele Gruesse
    Peter
    Donnerstag, 31. Mai 2012 08:54
  • Hi Peter,

    die "erfassten/geänderten " Daten sind nicht das Problem den das darf der Anwender in diesem Grid nicht !

    Das Problem ist ein anderst "Sortiertes" Grid. d.h. es werden keine Daten geändert sondern "nur" das Grid umsortiert durch klicken auf den Header und dieses"geänderte" Grid würde ich geren in ein datatable schreiben.

    Grüße

    Klaus


    Visual Studio 2010 Proffessional / Microsoft Visual Basic 2010

    Donnerstag, 31. Mai 2012 09:02
  • Hi Peter,

    ok hab das jetzt so gelöst.

    Erstelle mir ein DataView mit dem Name selectionview

    Dim selectionview As DataView

    Dann weise ich der selectionview  die DefaultView meiner dataable1 zu

    selectionview = datatable1.DefaultView

    dann wird der DataContext des Datagrid gesetzt

    dataGrid1.DataContext = selectionview

    und wenn ich wissen will wie das Datagrid im Moment Sortiert ist übertrage ich das Aktuelle Datagridview in eine Tabelle mit der ich dann weiter Arbeiten kann :

     Dim sortierung As DataTable = selectionview.ToTable

    nicht schön aber Funktioniert.

    Grüße

    Klaus


    Visual Studio 2010 Proffessional / Microsoft Visual Basic 2010

    Donnerstag, 31. Mai 2012 14:18
  • Die Lösung ist ohne Kenntnis der konkreten Aufgabenstellung nicht zu bewerten.

    Wenn lediglich die Datenobjekte sortiert durchlaufen werden sollen, dann ist keine neue Tabelle (...ToTable) erforderlich. Wenn jedoch eine nachzunutzende Methode, auf die man keinen Zugriff hat, eine sortierte Tabelle erfordert, dann ist das schon ein funktionierender Weg.

    Hier mal eine Demo zum durchlaufen einer per Klick auf den Spaltenkopf eines DataGrid sortierten Datensatzfolge:

    <Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
      <Grid>
        <Grid.ColumnDefinitions>
          <ColumnDefinition/>
          <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <DataGrid Grid.Column="0" ItemsSource="{Binding Daten}" AutoGenerateColumns="false">
          <DataGrid.Columns>
            <DataGridTextColumn Header="ID" Binding="{Binding ID}"/>
            <DataGridTextColumn Header="Spalte1" Binding="{Binding Spalte1}"/>
          </DataGrid.Columns>
        </DataGrid>
        <StackPanel Grid.Column="1">
          <Button Name="btnShow" Content="Anzeige" />
          <ListBox Name="lb"/>
        </StackPanel>
      </Grid>
    </Window>

    Dazu der CodeBehind:

    Imports System.ComponentModel
    Imports System.Data
    
    Class MainWindow
    
      Private Sub MainWindow_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles Me.Loaded
        Me.DataContext = Me
        '
        Dim rnd As New Random
        '
        dt = New DataTable
        With dt
          With .Columns
            .Add("ID", GetType(Integer))
            .Add("Spalte1", GetType(String))
          End With
          For i = 1 To 10
            Dim r = dt.NewRow
            r(0) = i
            Dim s As String = ""
            For k = 1 To rnd.Next(10, 20)
              s &= Chr(rnd.Next(65, 91))
            Next
            r(1) = s
            dt.Rows.Add(r)
          Next
        End With
      End Sub
    
      Public ReadOnly Property Daten() As DataView
        Get
          Return dt.DefaultView
        End Get
      End Property
    
      Private dt As DataTable
    
      Private Sub btnShow_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnShow.Click
        Me.lb.Items.Clear()
        For Each r As DataRowView In dt.DefaultView
          Me.lb.Items.Add(String.Format("{0:00} - {1}", r(0), r(1)))
        Next
      End Sub
    
    End Class

    --
    Viele Gruesse
    Peter

    Donnerstag, 31. Mai 2012 14:55
  • Hallo WPF_Klaus,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert


    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Donnerstag, 7. Juni 2012 13:52
    Moderator