none
DataGrid in "DataGrid" lösen RRS feed

  • Frage

  • Hallo.

    Ich hätte folgende Aufgabenstellung wie in meiner Zeichnung abgebildet!

    Wie könnte ich das im DataGrid abbilden?

    Danke

    Donnerstag, 17. Januar 2013 11:01

Antworten

  • Hi,

    komischerweise ist mein über NNTP gesendeter Beitrag hier nicht angekommen - deshalb nochmals direkt über die Forenoberfläche:

    Du kannst auch einfach prozedural so etwas mit einem Grid lösen. Dein Beispiel würde dann so aussehen:

    Partial Public Class MainPage
      Inherits UserControl
      Public Sub New()
        InitializeComponent()
      End Sub
      Private WithEvents ws As New serv.EDM1ServiceSoapClient
      Private Sub MainPage_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
        ws.GetDataAsync()
      End Sub
      Private Sub ws_GetDataCompleted(sender As Object, e As serv.GetDataCompletedEventArgs) Handles ws.GetDataCompleted
        With LayoutRoot
          Dim i As Integer = 0
          For i = 0 To 5
            .ColumnDefinitions.Add(New ColumnDefinition With {.Width = New GridLength(80)})
          Next
          .RowDefinitions.Add(New RowDefinition With {.Height = New GridLength(0, GridUnitType.Auto)})
          Datenzeile(0, 1, New SolidColorBrush(Media.Colors.Blue), 1, New String() {"Name", "Handy", "Tel.", "Fax", "To pay"})
          i = 1
          Dim k As Integer = 1
          Dim name As String = String.Empty
          Dim summe As Decimal = 0
          For Each r In e.Result
            If Not String.IsNullOrEmpty(name) AndAlso name <> r.Name Then
              Datenzeile(i, 1, New SolidColorBrush(Media.Colors.LightGray), 3, New String() {"", "Sum", "", "", summe.ToString("#0.00")})
              Datenzeile(k, i - k + 1, New SolidColorBrush(Media.Colors.White), 4, New String() {name})
              summe = 0
              i += 1
              k = i
            End If
            Datenzeile(i, 1, New SolidColorBrush(Media.Colors.White), 2, New String() {"", r.Handy, r.Telefon, r.Fax, r.ToPay})
            summe += r.ToPay
            name = r.Name
            i += 1
          Next
          If Not String.IsNullOrEmpty(name) Then
            Datenzeile(i, 1, New SolidColorBrush(Media.Colors.LightGray), 3, New String() {"", "Sum", "", "", summe.ToString("#0.00")})
            Datenzeile(k, i - k + 1, New SolidColorBrush(Media.Colors.White), 4, New String() {name})
          End If
        End With
      End Sub
      ' typ: 1 - Überschrift, 2 - Datenzeile, 3 - Summenzeile, 4 - Name über colspan
      Private Sub Datenzeile(zeile As Integer, rowspan As Integer, bg As Brush, typ As Integer, ParamArray sp() As String)
        LayoutRoot.RowDefinitions.Add(New RowDefinition With {.Height = New GridLength(0, GridUnitType.Auto)})
        For i = 0 To sp.GetUpperBound(0)
          Dim l As New Label With {.Content = sp(i), .Background = bg}
          Select Case typ
            Case 1 : l.HorizontalContentAlignment = Windows.HorizontalAlignment.Left
            Case 2
              If i = 0 Then Continue For
              l.HorizontalContentAlignment = Windows.HorizontalAlignment.Right
            Case 3
              If i = 0 Then Continue For
              If i = 1 Then
                l.HorizontalContentAlignment = Windows.HorizontalAlignment.Left
              Else
                l.HorizontalContentAlignment = Windows.HorizontalAlignment.Right
              End If
            Case 4
              l.HorizontalAlignment = Windows.HorizontalAlignment.Left
              l.VerticalAlignment = Windows.VerticalAlignment.Top
          End Select
          Dim b As New Border With {.BorderBrush = New SolidColorBrush(Media.Colors.Black), .BorderThickness = New Thickness(1)}
          LayoutRoot.Children.Add(b)
          Grid.SetRow(b, zeile)
          Grid.SetColumn(b, i)
          If rowspan > 1 Then Grid.SetRowSpan(b, rowspan)
          b.Child = l
        Next
      End Sub
    End Class

    --

    Peter

    • Als Antwort vorgeschlagen Peter Fleischer Freitag, 18. Januar 2013 07:07
    • Als Antwort markiert Pat_10 Dienstag, 22. Januar 2013 09:33
    Freitag, 18. Januar 2013 07:07

Alle Antworten

  • Hi Pat_10,

    Ich denke Grouped Rows können, dir da weiter helfen. Schau mal unter den Links nach.

    http://aspalliance.com/723_Enhancing_the_DataGrid_with_Grouped_Rows_and_Subheadings

    http://wpftutorial.net/DataGrid.html

    http://www.c-sharpcorner.com/uploadfile/dpatra/grouping-in-datagrid-in-wpf/

    Ob das Silverlight Grid das auch kann, weiß ich jetzt nicht.

    MFG

    Björn


    • Bearbeitet Palin Donnerstag, 17. Januar 2013 11:50
    Donnerstag, 17. Januar 2013 11:49
  • Danke für die Antwort.

    Glaub jedoch, dass es mit dem Grouping nicht funktionieren wird.

    Weil ich habe folgende Klassen:

    Eine Liste von Namen

    Ein Name hat wieder eine Liste von Nummern.

    Und das soll eben alles in einer DataGrid dargestellt werden.

    Aber so wie ich das in der Skizze habe, wird es mir nicht aufgehen!

    Sodass ein Name und sogar die erste Zeile der Nummer ein einer Zeile ist.

    Oder?

    Danke!!!

    Donnerstag, 17. Januar 2013 13:04
  • Nun so genau weiß ich jetzt nicht was dein Problem ist.

    Grouping scheint eigentlich schon richtig zu sein.

    Man könnte vieleicht noch Row Detail (weiter unten im 2. Link) verwenden.

    Hier noch mal ein Link wie andere etwas ähnliches gelöst haben (Ganz unten auf der Seite sind die Links zu den anderen Beispielen.)

    Wenn deine Daten nicht im Richtigen zustand Vorliegen könntest du mit Linq eine abfrage machen.

    MFG

    Björn

    Donnerstag, 17. Januar 2013 14:22
  • So weit ich das Grouping jetzt verstanden habe habe ich eine Klasse Name mit den Propertys Vorname Nachname und z.B. Land. Und hier könnte ich nach Land ein "group" absetzen.

    Aber das hier wieder eine Liste von Namen drinnen ist das müsste ich mir nochmals genau anschauen.

    An RowDetails habe ich auch schon gedacht.

    DANKE!!!

    mfg

    Donnerstag, 17. Januar 2013 14:25
  • Hi,
    Du kannst auch einfach prozedural so etwas mit einem Grid lösen. Dein Beispiel würde dann so aussehen:
    Partial Public Class MainPage
      Inherits UserControl
    
      Public Sub New()
        InitializeComponent()
      End Sub
    
      Private WithEvents ws As New serv.EDM1ServiceSoapClient
    
      Private Sub MainPage_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
        ws.GetDataAsync()
      End Sub
    
      Private Sub ws_GetDataCompleted(sender As Object, e As serv.GetDataCompletedEventArgs) Handles ws.GetDataCompleted
        With LayoutRoot
          Dim i As Integer = 0
          For i = 0 To 5
            .ColumnDefinitions.Add(New ColumnDefinition With {.Width = New GridLength(80)})
          Next
          .RowDefinitions.Add(New RowDefinition With {.Height = New GridLength(0, GridUnitType.Auto)})
          Datenzeile(0, 1, New SolidColorBrush(Media.Colors.Blue), 1, New String() {"Name", "Handy", "Tel.", "Fax", "To pay"})
          i = 1
          Dim k As Integer = 1
          Dim name As String = String.Empty
          Dim summe As Decimal = 0
          For Each r In e.Result
            If Not String.IsNullOrEmpty(name) AndAlso name <> r.Name Then
              Datenzeile(i, 1, New SolidColorBrush(Media.Colors.LightGray), 3, New String() {"", "Sum", "", "", summe.ToString("#0.00")})
              Datenzeile(k, i - k + 1, New SolidColorBrush(Media.Colors.White), 4, New String() {name})
              summe = 0
              i += 1
              k = i
            End If
            Datenzeile(i, 1, New SolidColorBrush(Media.Colors.White), 2, New String() {"", r.Handy, r.Telefon, r.Fax, r.ToPay})
            summe += r.ToPay
            name = r.Name
            i += 1
          Next
          If Not String.IsNullOrEmpty(name) Then
            Datenzeile(i, 1, New SolidColorBrush(Media.Colors.LightGray), 3, New String() {"", "Sum", "", "", summe.ToString("#0.00")})
            Datenzeile(k, i - k + 1, New SolidColorBrush(Media.Colors.White), 4, New String() {name})
          End If
        End With
      End Sub
    
      ' typ: 1 - Überschrift, 2 - Datenzeile, 3 - Summenzeile, 4 - Name über colspan
      Private Sub Datenzeile(zeile As Integer, rowspan As Integer, bg As Brush, typ As Integer, ParamArray sp() As String)
        LayoutRoot.RowDefinitions.Add(New RowDefinition With {.Height = New GridLength(0, GridUnitType.Auto)})
        For i = 0 To sp.GetUpperBound(0)
          Dim l As New Label With {.Content = sp(i), .Background = bg}
          Select Case typ
            Case 1 : l.HorizontalContentAlignment = Windows.HorizontalAlignment.Left
            Case 2
              If i = 0 Then Continue For
              l.HorizontalContentAlignment = Windows.HorizontalAlignment.Right
            Case 3
              If i = 0 Then Continue For
              If i = 1 Then
                l.HorizontalContentAlignment = Windows.HorizontalAlignment.Left
              Else
                l.HorizontalContentAlignment = Windows.HorizontalAlignment.Right
              End If
            Case 4
              l.HorizontalAlignment = Windows.HorizontalAlignment.Left
              l.VerticalAlignment = Windows.VerticalAlignment.Top
          End Select
          Dim b As New Border With {.BorderBrush = New SolidColorBrush(Media.Colors.Black), ..BorderThickness = New Thickness(1)}
          LayoutRoot.Children.Add(b)
          Grid.SetRow(b, zeile)
          Grid.SetColumn(b, i)
          If rowspan > 1 Then Grid.SetRowSpan(b, rowspan)
          b.Child = l
        Next
      End Sub
    
    End Class
    

    --
    Viele Gruesse
    Peter

    Donnerstag, 17. Januar 2013 17:31
  • Hi,

    komischerweise ist mein über NNTP gesendeter Beitrag hier nicht angekommen - deshalb nochmals direkt über die Forenoberfläche:

    Du kannst auch einfach prozedural so etwas mit einem Grid lösen. Dein Beispiel würde dann so aussehen:

    Partial Public Class MainPage
      Inherits UserControl
      Public Sub New()
        InitializeComponent()
      End Sub
      Private WithEvents ws As New serv.EDM1ServiceSoapClient
      Private Sub MainPage_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
        ws.GetDataAsync()
      End Sub
      Private Sub ws_GetDataCompleted(sender As Object, e As serv.GetDataCompletedEventArgs) Handles ws.GetDataCompleted
        With LayoutRoot
          Dim i As Integer = 0
          For i = 0 To 5
            .ColumnDefinitions.Add(New ColumnDefinition With {.Width = New GridLength(80)})
          Next
          .RowDefinitions.Add(New RowDefinition With {.Height = New GridLength(0, GridUnitType.Auto)})
          Datenzeile(0, 1, New SolidColorBrush(Media.Colors.Blue), 1, New String() {"Name", "Handy", "Tel.", "Fax", "To pay"})
          i = 1
          Dim k As Integer = 1
          Dim name As String = String.Empty
          Dim summe As Decimal = 0
          For Each r In e.Result
            If Not String.IsNullOrEmpty(name) AndAlso name <> r.Name Then
              Datenzeile(i, 1, New SolidColorBrush(Media.Colors.LightGray), 3, New String() {"", "Sum", "", "", summe.ToString("#0.00")})
              Datenzeile(k, i - k + 1, New SolidColorBrush(Media.Colors.White), 4, New String() {name})
              summe = 0
              i += 1
              k = i
            End If
            Datenzeile(i, 1, New SolidColorBrush(Media.Colors.White), 2, New String() {"", r.Handy, r.Telefon, r.Fax, r.ToPay})
            summe += r.ToPay
            name = r.Name
            i += 1
          Next
          If Not String.IsNullOrEmpty(name) Then
            Datenzeile(i, 1, New SolidColorBrush(Media.Colors.LightGray), 3, New String() {"", "Sum", "", "", summe.ToString("#0.00")})
            Datenzeile(k, i - k + 1, New SolidColorBrush(Media.Colors.White), 4, New String() {name})
          End If
        End With
      End Sub
      ' typ: 1 - Überschrift, 2 - Datenzeile, 3 - Summenzeile, 4 - Name über colspan
      Private Sub Datenzeile(zeile As Integer, rowspan As Integer, bg As Brush, typ As Integer, ParamArray sp() As String)
        LayoutRoot.RowDefinitions.Add(New RowDefinition With {.Height = New GridLength(0, GridUnitType.Auto)})
        For i = 0 To sp.GetUpperBound(0)
          Dim l As New Label With {.Content = sp(i), .Background = bg}
          Select Case typ
            Case 1 : l.HorizontalContentAlignment = Windows.HorizontalAlignment.Left
            Case 2
              If i = 0 Then Continue For
              l.HorizontalContentAlignment = Windows.HorizontalAlignment.Right
            Case 3
              If i = 0 Then Continue For
              If i = 1 Then
                l.HorizontalContentAlignment = Windows.HorizontalAlignment.Left
              Else
                l.HorizontalContentAlignment = Windows.HorizontalAlignment.Right
              End If
            Case 4
              l.HorizontalAlignment = Windows.HorizontalAlignment.Left
              l.VerticalAlignment = Windows.VerticalAlignment.Top
          End Select
          Dim b As New Border With {.BorderBrush = New SolidColorBrush(Media.Colors.Black), .BorderThickness = New Thickness(1)}
          LayoutRoot.Children.Add(b)
          Grid.SetRow(b, zeile)
          Grid.SetColumn(b, i)
          If rowspan > 1 Then Grid.SetRowSpan(b, rowspan)
          b.Child = l
        Next
      End Sub
    End Class

    --

    Peter

    • Als Antwort vorgeschlagen Peter Fleischer Freitag, 18. Januar 2013 07:07
    • Als Antwort markiert Pat_10 Dienstag, 22. Januar 2013 09:33
    Freitag, 18. Januar 2013 07:07