我有一个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
答案 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