Datagridview error系统.IndexOutOfRangeException:索引0没有值

本文关键字:索引 error 系统 IndexOutOfRangeException Datagridview | 更新日期: 2023-09-27 18:11:06


当我试图填充绑定源时,我得到一个错误。例外情况如下:

System.IndexOutOfRangeException: Index 0 does not have a value.
   at System.Windows.Forms.CurrencyManager.get_Item(Int32 index)
   at System.Windows.Forms.DataGridView.DataGridViewDataConnection.GetError(Int32 rowIndex)

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

foreach (listItem)
  {
      BindingSource.Add(listItem);
  }

我尝试重置数据源属性,但仍然是相同的问题。

请帮我解决这个问题

Datagridview error系统.IndexOutOfRangeException:索引0没有值

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

myBindingSource.DataSource = listItem;

可以。

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

你可以这样做:

myDataGridView.DataSource = myBindingList;

如果myBindingList上的项目属性发生了变化,默认情况下结果将反映在datagridview上,如果集合发生了变化(有些东西被添加或删除),您可以使用:

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

下面的代码已经解决了这个问题:

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

当列表不再与DataGridView同步时发生错误。

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

myBindingSource.CurrencyManager.Refresh();

我在黑暗中拍摄,但假设这是伪代码,那么你需要将UI元素的数据源设置为绑定源。同样,这样做可能更容易:

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

关于BindingSource的更多信息可以在这里找到:http://msdn.microsoft.com/en-us/library/system.windows.forms.bindingsource.aspx

我刚刚设置了ItemsBindingSource。DataSource = Nothing("Items"是表的名称),就在我关闭表单之前。所以我有…

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

可能不正确,但我不知道错误。