MS-Blog

Datagridview – Properties von Unterobjekten anzeigen.

Samstag, 13. Juni 2009 von Marco

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

Seiten

Kategorien

Suchen


RSS-Feeds

Blogroll

Meta

 

© Marco – Powered by WordPress – Design: Vlad (aka Perun)