Vb.net 具有对象集合的datagridview的索引超出范围
vbnet上的超级新手 所以在一个简单的代码上有一个问题,但我不知道为什么 我在表单上有一个datagridview,一个在表单中定义的对象列表,我使用它作为数据源。 因此,希望在表单加载中显示列,因此执行以下操作:Vb.net 具有对象集合的datagridview的索引超出范围,vb.net,datagridview,Vb.net,Datagridview,vbnet上的超级新手 所以在一个简单的代码上有一个问题,但我不知道为什么 我在表单上有一个datagridview,一个在表单中定义的对象列表,我使用它作为数据源。 因此,希望在表单加载中显示列,因此执行以下操作: Public Class Form1 Dim l As New List(Of Entities.Product) Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Public Class Form1
Dim l As New List(Of Entities.Product)
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.DataGridView1.AutoGenerateColumns = True
Me.DataGridView1.DataSource = l
End Sub
End class
它是有效的
之后,我加载列表中的对象并将其指定为数据源:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
For Each r As DataRow In d.Tables("table").Rows
Dim p As New Entities.Product
p.ID = r.Item("id")
p.name = r.Item("name")
p.prize = r.Item("prize")
l.Add(p)
Next
Me.DataGridView1.AutoGenerateColumns = True
Me.DataGridView1.DataSource = Nothing
Me.DataGridView1.DataSource = l
End Sub
一切按预期进行。。。。直到我单击Datagridview中的一行。
然后我得到这个:
An unhandled exception of type 'System.IndexOutOfRangeException' occurred in System.Windows.Forms.dll
Additional information: Index -1 does not have a value.
我还没有任何处理点击的代码。。。这就像它丢失了对绑定集合的引用一样
我发现,如果我在加载事件中删除这些行,我就没有问题了
有人能解释为什么会这样吗?这是虫子吗
如果我将数据源分配为nothing,然后重新分配,则应该重新加载它,而不管它之前分配到哪里,对吗
谢谢你们的意见,伙计们
Daniel如果/当数据可以更改时,作为数据源,通用列表(T)
是次优的
选项0
最初包含数据的数据表
将成为一个功能完善的数据源
。我不确定将数据复制到类型化列表的目的是什么
选项1-绑定列表(共T个)
如果您没有更多的英雄事迹,添加到列表中的内容将自动显示在DGV中:
请注意,这仅监视列表内容的更改,而不监视列表项。如果更改其中一个对象的名称
或值
,更改将不会自动显示。这将需要类型(类)实现INotifyPropertyChanged
。当属性更改时,BindingList
将把更改转发给它绑定到的控件
选项2-绑定源
使用BindingSource
只需一个额外步骤,就可以得到相同的结果
Private NamePairs As List(Of NVP)
Private BSPairs As BindingSource
Sub FormLoad.....
NamePairs = New List(Of NVP)
BSPairs = New BindingSource(NamePairs, Nothing)
dgv.AutoGenerateColumns = True
dgv.DataSource = BSPairs
End Sub
在单击事件中添加到列表:
NamePairs.Add(New NVP("ziggy", 42))
NamePairs.Add(New NVP("zacky", 11))
NamePairs.Add(New NVP("zoey", 2))
BSPairs.ResetBindings(False)
为什么要将数据从数据表移动到列表中?啊,这只是他们给我们的任务。他们希望我们这样做。如果这回答了问题,请单击复选标记,以便将其从未回答列表中删除。
NamePairs.Add(New NVP("ziggy", 42))
NamePairs.Add(New NVP("zacky", 11))
NamePairs.Add(New NVP("zoey", 2))
BSPairs.ResetBindings(False)