无法将更新的列表重新加载到datagridview中

时间:2016-03-22 23:38:32

标签: vb.net winforms datagridview

我有一个datagridview,用于显示对象列表。这些对象具有几个属性,用于填充datagridview的列。

要填充datagridview,我有一个函数,我将datagridview的引用传递给。创建表单时,form.Load事件将触发,外部函数将完美运行。但是,当我使用相同的函数(实际上由重新加载的事件调用)重新加载数据源时,datagridview无法使用更新的对象列表重新加载。

以下是更新功能的代码:

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

我尝试了几种不同的填充datagridview的方法,包括使用绑定源(我在上面),设置绑定列表,并通过遍历列表单独填充每一行。他们都没有工作。

我缺少什么让这项工作?

编辑:以下是我将对象添加到列表中的一些代码段

在模块级别初始化它:

Public masterHopperList As New List(Of IHopperItem)

合并临时对象列表(使用IList(Of T).Add方法将对象添加到主列表中。

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

1 个答案:

答案 0 :(得分:0)

成功!!我只是将每个代码对象直接加载到BindingList中,然后将其设置为Binding Source,并使用它来填充DataGridView,而不是创建一个对象列表,然后将其加载到BindingList(Of T)中。这是我改变的代码:

BindingList声明:

Friend masterHopperList As New BindingList(Of IHopperItem)

要添加到BindingList的函数(现在是sub):

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

最后是UpdateDataGridView函数(现在也是一个子):

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

另外,正如上面评论中提到的@Plutonix,该对象需要实现INotifyPropertyChanged