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

时间:2011-10-12 08:41:28

标签: c# datagridview bindingsource indexoutofboundsexception


当我尝试填充绑定源时出现一个错误。例外情况如下;

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

我尝试重置数据源属性,但问题仍然存在。

请帮我解决此问题。

5 个答案:

答案 0 :(得分:5)

据我了解,您不必填充BindingSource,只需填充它所绑定的列表即可。这就是绑定的整个想法。使用bindingsource将控件绑定到数据。

然后

myBindingSource.DataSource = listItem;

会这样做。

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

你可以这样做:

myDataGridView.DataSource = myBindingList;

如果myBindingList上的项属性发生变化,默认情况下结果将反映在datagridview上,如果集合发生变化(添加或删除了一些内容),您可以使用以下命令刷新它:

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

答案 1 :(得分:1)

此代码解决了这个问题:

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

答案 2 :(得分:0)

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

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

有关BindingSource的更多信息,请访问:http://msdn.microsoft.com/en-us/library/system.windows.forms.bindingsource.aspx

答案 3 :(得分:0)

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

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

myBindingSource.CurrencyManager.Refresh();

答案 4 :(得分:0)

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

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

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