Schlagwort: Controls

  • Datagridview – Properties von Unterobjekten anzeigen.

    Das Datagridview hat einen ganz entscheidenen Nachteil.

    Man kann keine Daten von Unterobjekten anzeigen.

    Es gibt einige Lösungsansätze:

    http://www.developer-corner.com/Resources/KnowledgeBase/tabid/118/articleType/ArticleView/articleId/28/Default.aspx

    http://blogs.msdn.com/msdnts/archive/2007/01/19/how-to-bind-a-datagridview-column-to-a-second-level-property-of-a-data-source.aspx

    Ich habe mich für die erste Variante entschieden sie aber leicht abgeändert.

    Als erstet erstellen wir eine eigene DataGridViewKlasse und leiten von DataGridView ab.

    Public Class MyDataGridView
        Inherits Forms.DataGridView
    End Class

    Und dann überschreiben wir das OnCellFormat Ereigniss:

    Public Class MyDataGridView
        Inherits System.Windows.Forms.DataGridView
    
        Protected Overrides Sub OnCellFormatting( _ 
                  ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs)
    
            MyBase.OnCellFormatting(e)
            If Me.Rows(e.RowIndex).DataBoundItem IsNot Nothing _
               AndAlso Me.Columns(e.ColumnIndex).DataPropertyName.Contains(".") Then
                e.Value = BindProperty( _
                     Me.Rows(e.RowIndex).DataBoundItem, _
                     Me.Columns(e.ColumnIndex).DataPropertyName, 0)
            End If
    
        End Sub
    End Class

    Und nun müssen wir noch rekursiv das Richtige Objekt an die Zelle binden.

    Public Class MyDataGridView
        Inherits System.Windows.Forms.DataGridView
    
        Protected Overrides Sub OnCellFormatting( _ 
                  ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs)
    
            MyBase.OnCellFormatting(e)
            If Me.Rows(e.RowIndex).DataBoundItem IsNot Nothing _
               AndAlso Me.Columns(e.ColumnIndex).DataPropertyName.Contains(".") Then
                e.Value = BindProperty( _
                     Me.Rows(e.RowIndex).DataBoundItem, _
                     Me.Columns(e.ColumnIndex).DataPropertyName, 0)
            End If
    
        End Sub
    
        Private Function BindProperty(ByVal dataItem As Object, _
                ByVal bindingPath As String, ByVal index As Integer) As Object
    
            Dim tokens = bindingPath.Split(New Char() {CChar(".")})
            Dim token = tokens(index)
    
            Dim t = dataItem.GetType()
            Dim pi = t.GetProperty(token)
            Dim nextDataItem As Object
    
            If (pi IsNot Nothing) Then
    
                nextDataItem = pi.GetValue(dataItem, Nothing)
    
                If (index = tokens.Length - 1) Then
    
                    Return nextDataItem
                End If
    
                Return BindProperty(nextDataItem, bindingPath, index + 1)
            End If
    
            Return Nothing
    
        End Function
    End Class

    So nun kann man im Designer dem Datagridview ungebundene Felder hinzufügen und dann bei DataProperty die Eigenschaft angeben:

    Adresse.Strasse

    Und das MyDataGridView löst das auf. Da wir das Feld an das Objekt gebunden haben lassen sich auf änderungen am Wert durchführen.

    Man muss beim speichern einfach beachten das die Unterobjekte dann mit gespeichert werden müssen.

    Gruss Marco