Vb.net 具有对象集合的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

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
        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)