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