Schlagwort: vb

  • 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

  • BindingListView

    So

    Es hat mir einfach keine Ruhe gelassen. Ich habe nun eine BindingListView die, die IBindingListView implementiert geschrieben.

    Mit dieser ist das einfache Sortieren und auch das Filtern möglich. Beim verändern der Daten werden immer die Orginaldaten verändert und die gefilterte Liste neu aufgebaut.

    Der Filter kann im Moment erst OR Verknüpfungen verarbeiten die mit Komma getrennt sind :

    Vorname=Marco,Nachname=Müller

    Es werden also nun alle Marco und alle Müller angezeigt.

    Das erweiterte Sortieren ist nicht möglich.

    BindingListView.vb

    Gruss Marco

  • SortableBindingList

    Also nach ein wenig ausprobieren bin ich auf follgendes Problem gestossen.

    Wenn ich eine Datagridview eine BindingList als Datasource zuweise, kann ich diese nicht sortieren oder Filtern.

    Nun da ich doch gerne eine Sortiermöglichkeit hätte habe ich diese mal im plementiert.

    Die Filtermöglichkeit habe ich noch nicht implementiert.

    Da ich ein verändern, löschen und hinzufügen der Daten in der Liste ermöglichen will und nicht jedesmal die Liste neu laden will wenn sich der Filter verändert.

    Dafür müsse ich eine WrapperKlasse schreiben die alle Funktionen implementiert.

    SortableBindingList.vb

    Es gibt unter SF ein Projekt das zum Ziel hat eine BindingListe zu erstellen die das IBindingListView Interface implementiert.

    Damit ist sortieren und auch filtern möglich. Soweit ich gesehen habe ist aber ein hinzufügen von Elementen zur Orgnialliste nicht möglich.

    http://blw.sourceforge.net/