【问题标题】:InvalidOperationException on Databinding when removing last item in list删除列表中的最后一项时数据绑定出现 InvalidOperationException
【发布时间】:2009-04-29 21:46:19
【问题描述】:

当我尝试删除 datagridview 中的最后一项时,我收到以下消息。

DataBinding 在列表中找不到适合所有绑定的行。

我的绑定设置如下。

ExtendedBindingList<MyClass> bl = new ExtendedBindingList<MyClass>(GetDataFromDB());
BindingSource bs = new BindingSource();
bs.DataSource = bl;
dgv.DataSource = bs;

ExtendedBindingList 只是我拼凑起来的一个简单的东西,用于实现排序和过滤以及一些基本的状态持久性。 dgv 是 DataGridView。 GetDataFromDB 返回一个 MyClass 列表。

仅当我尝试使用以下方法从 datagridview 中删除最后一项时才会出现此问题:

bs.RemoveCurrent();

在所有其他时间都有效。我对解决方案的唯一提示是删除所有绑定并重新应用它们,但这似乎不是一个理想的解决方案。

编辑 只有在 BindingList 成功删除最后一个有问题的项目后,才会引发异常。它是在外部代码中抛出的,所以我无法确切知道是什么抛出它。

所以,我在这里,向 SO 寻求帮助:)。

提前致谢, 贾斯汀

【问题讨论】:

    标签: c# winforms data-binding bindingsource bindinglist


    【解决方案1】:

    这是我从网格中删除选定行的方法:

    private void btnDelete_Click(object sender, EventArgs e)
    {
      if (grid.CurrentRow == null) return;
      var selectedItem = grid.CurrentRow.DataBoundItem as PartGroup;
      if (selectedItem != null && 
        UIHelper.ShowQuestion("Are you sure you want to delete selected row?") == System.Windows.Forms.DialogResult.Yes)
      {
        groups.Remove(selectedItem);
      }
    }

    groups 是我的 BindingListEx(Of T)。

    希望对你有帮助。

    【讨论】:

    • 我使用的是 DataGridView 而不是 Grid,但这本质上也是我正在使用的。它每次都有效,除非我删除最后一项。
    • 在我的示例中它是一个 DataGridView。也使用了 BindingSource,但我从 BindingListEx 中删除,而不是从 BindingSource 中删除。试试这个代码。我还认为您的问题在某种程度上与用于快速添加行的最后一行有关(AllowUserAddNewRows = true)。我记得我遇到了问题,然后我决定将其关闭(将 AllowUserAddNewRows 设置为 false)。
    • 完全相同的错误。它发生在 CurrencyManager.FindGoodRow() 中。在调用堆栈中被标记为“外部代码”。我也将 AllowUserAddNewRows 设置为 false。
    • 尝试在删除行之前调用 bs.SuspendBinding(),在删除行之后尝试调用 bs.ResumeBinding()。
    • 一些,是的。表单设置在主从设计中。有一些组合框是从另一个数据源填充的,我需要对它们进行手动绑定。
    【解决方案2】:

    [对不起,不是真正的答案,但我觉得这很有价值,因为没有给出答案。]

    我在使用 .NET Compact Framework 2.0 时遇到了完全相同的情况。测试将其跟踪到使用 NumericUpDown.DataBindings.Add() 将控件绑定到源的点。此后,如果该项是源中的最后一项,则使用 RemoveCurrent() 将产生错误。在该绑定之前(或者如果它被跳过),错误将永远不会出现。

    其他控件绑定到同一个源 - TextBox 和 ComboBox - 但它们不会导致此行为。只有 NumericUpDown 控件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-14
      • 2010-09-15
      • 1970-01-01
      • 2013-11-12
      • 2013-08-12
      • 2019-09-10
      • 2012-10-10
      • 2020-12-18
      相关资源
      最近更新 更多