2016-03-22 14 views
0

Ich habe eine Datagridview, die ich verwende, um eine Liste der Objekte anzuzeigen. Diese Objekte haben mehrere Eigenschaften, die zum Füllen der Spalten der Datagridview verwendet werden.Kann aktualisierte Liste in datagridview nicht aktualisieren

Um den Datagridview zu füllen, habe ich eine Funktion, die ich eine Referenz der Datagridview zu übergeben. Wenn das Formular erstellt wird, wird das form.Load -Ereignis ausgelöst und die externe Funktion funktioniert einwandfrei. Wenn ich jedoch die Datenquelle mit der gleichen Funktion neu lade (die tatsächlich von einem Ereignis für das erneute Laden aufgerufen wird), kann die datagridview nicht mit der aktualisierten Liste der Objekte neu geladen werden.

Hier ist der Code für die Update-Funktion:

Public Function UpdateDataGridView(ByRef datagridView As Windows.Forms.DataGridView) As DataGridView 


    'clear the gridview's previous iteration 
    If datagridView Is Nothing Then 
     datagridView = New DataGridView 
    End If 

    datagridView.AutoGenerateColumns = False 

    Dim bindingSource As BindingSource = New BindingSource() 

    If datagridView.DataSource IsNot Nothing Then 
     bindingSource.DataSource = Nothing 
     bindingSource.ResetBindings(False) 
    End If 

    bindingSource.DataSource = masterHopperList 
    datagridView.DataSource = bindingSource 

    Return datagridView 

End Function 

ich verschiedene Arten von Bestücken der Datagridview versucht haben, darunter eine Bindungsquelle verwendet (was ich oben haben), eine verbindliche Liste setzen und bevöl jede Zeile einzeln durch Iteration durch die Liste. Keine von ihnen funktioniert.

Was fehlt mir, damit das funktioniert?

Edit: Hier einige der Code-Snippets für wo ich Objekte in die Liste

es auf Modulebene Hinzufügen Initialisierung:

Public masterHopperList As New List(Of IHopperItem) 

eine temporäre Liste von Objekten Verschmelzung (Objekte werden mit der IList (Of T) .Add-Methode) zur Master-Liste hinzugefügt.

Public Function concatHopperArray(ByVal masterHopperList As List(Of IHopperItem), ByVal hopperListToAdd As List(Of IHopperItem)) As List(Of IHopperItem) 

    'merges two IHopperItem lists together 

    'if the master is empty, then we can just return the "ToAdd" list 
    If masterHopperList.Count = 0 Then 
     Return hopperListToAdd 
    End If 

    'alternatively, if the toAdd array is empty or zero then we can just grab the master and return it 
    If hopperListToAdd.Count = 0 Then 
     Return masterHopperList 
    End If 

    'barring those then we can just merge the two lists 
    masterHopperList.AddRange(hopperListToAdd) 

    Return masterHopperList  

End Function 
+0

Was ist 'MasterHopperList' (welcher Typ)? Warum erstellen Sie dort einen neuen DGV, wenn Sie nur die Datenquelle aktualisieren möchten? – Plutonix

+0

masterHopperList ist eine Liste (Of) eines benutzerdefinierten Objekts. Es enthält im Wesentlichen Eigenschaften, die ich verwende, um den DGV zu füllen. Das Erstellen eines neuen DGV ist da, um eine Null-Referenz-Ausnahme zu vermeiden, die ich früher bekommen habe. Ich habe nur vergessen, es herauszunehmen. – Mwinslett

+0

Worauf genau erfrischst du dich? Ein db oder Code-Objekte? – Plutonix

Antwort

0

Erfolg !! Anstatt eine Liste von Objekten zu erstellen, die ich dann in eine BindingList (Of T) geladen habe, habe ich einfach jedes Code-Objekt direkt in die BindingList geladen und dieses dann auf eine Binding-Quelle gesetzt und damit das DataGridView aufgefüllt. Hier ist meine geänderten Code:

Die Binding Erklärung:

Friend masterHopperList As New BindingList(Of IHopperItem) 

Die Funktion (jetzt ein Unter) an die Binding hinzuzufügen:

Public Sub concatHopperArray(ByRef masterHopperList As BindingList(Of IHopperItem), ByVal hopperListToAdd As List(Of IHopperItem)) 

'folds a List(Of IHopperItem) into a BindingList 


For i = 0 To hopperListToAdd.Count - 1 
    Dim hopperItem As IHopperItem = New HopperItem 
    hopperItem = hopperListToAdd.Item(i) 
    masterHopperList.Add(hopperItem) 
Next   

End Sub 

Und schließlich die UpdateDataGridView Funktion (auch jetzt eine Unter):

Public Sub UpdateDataGridView(ByRef datagridView As Windows.Forms.DataGridView) 


Dim bindingSource As BindingSource = New BindingSource() 

If datagridView.DataSource IsNot Nothing Then 
    bindingSource.ResetBindings(False) 
    datagridView.DataSource = Nothing 
    bindingSource.DataSource = Nothing 
    datagridView.Refresh() 
End If 

bindingSource.DataSource = masterHopperList 
datagridView.DataSource = GetType(List(Of IHopperItem)) 
datagridView.DataSource = bindingSource   

End Sub 

Darüber hinaus, wie @Plutonix in den Kommentaren erwähnt, die o Objekt muss implementiert werden INotifyPropertyChanged

Verwandte Themen