C# Datagridview错误System.IndexOutOfRangeException:索引0没有值

C# Datagridview错误System.IndexOutOfRangeException:索引0没有值,c#,datagridview,bindingsource,indexoutofboundsexception,C#,Datagridview,Bindingsource,Indexoutofboundsexception,我在尝试填充绑定源时遇到一个错误。例外情况如下:; 我使用泛型列表来填充绑定源。代码看起来像 foreach (listItem) { BindingSource.Add(listItem); } 我尝试重置datasource属性,但仍然存在相同的问题 请帮助我解决这个问题。我在这里是瞎说,但假设这是伪代码,那么您需要将UI元素的数据源设置为绑定源。此外,这样做可能更容易: var binding = new BindingSource(); binding.DataS


我在尝试填充绑定源时遇到一个错误。例外情况如下:;

我使用泛型列表来填充绑定源。代码看起来像

foreach (listItem)
  {
      BindingSource.Add(listItem);
  }
我尝试重置datasource属性,但仍然存在相同的问题


请帮助我解决这个问题。

我在这里是瞎说,但假设这是伪代码,那么您需要将UI元素的数据源设置为绑定源。此外,这样做可能更容易:

var binding = new BindingSource();
binding.DataSource = listItem;
DataGridView.DataSource = binding;

关于BindingSource的更多信息可以在这里找到:

据我所知,您不必填充BindingSource,只需填充它绑定到的列表即可。这就是绑定的全部思想。使用bindingsource将控件绑定到数据

然后

myBindingSource.DataSource = listItem;
我会的

另外,您可以将datagridview绑定到BindingList,而不是将datagridview绑定到BindingSource,将BindingSource绑定到list。它类似于List,但也实现了IBindingList接口(当您将BindingList对象设置为List时,它将返回一个实现IBindingList的对象,因此非常类似)

你能做什么

myDataGridView.DataSource = myBindingList;
如果myBindingList上项目的属性发生更改,默认情况下,结果将反映在datagridview上。如果集合发生更改(某些内容已添加或删除),您可以使用以下方法刷新它:

 CurrencyManager cm = (CurrencyManager)this.myDataGridView.BindingContext[myBindingList];
 if (cm != null)
 {
    cm.Refresh();
 }

当列表不再与DataGridView同步时,会发生此错误

更改列表后,可以手动刷新绑定,以确保绑定再次同步:

myBindingSource.CurrencyManager.Refresh();

此代码已解决此问题:

grdOrders.DataSource = null;
grdOrders.DataSource = this._controller.OrderActionData;

我只是在关闭表单之前设置ItemsBindingSource.DataSource=Nothing(“Items”是表的名称)。所以我

Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click
    ItemsBindingSource.DataSource = Nothing
    Me.Close()
End Sub

可能不正确,但我没有得到错误。

在清除绑定到DataGridView的列表时,我遇到了相同的错误。在清除用作数据源的列表之前,将数据源设置为null,然后重新绑定会阻止DataGridView抛出此错误。这应该是可接受的解决方案。将列表分配给一个新的列表,然后重新绑定它可以工作,但这是有难度的。这正确地解决了问题。虽然这里的另一个人也提出了同样的建议——它缺乏一个好的解释和完整的代码示例+1.
Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click
    ItemsBindingSource.DataSource = Nothing
    Me.Close()
End Sub