【问题标题】:C# DataGridView throws exception when removing object from BindingListC# DataGridView 从 BindingList 中删除对象时抛出异常
【发布时间】:2011-11-22 14:58:59
【问题描述】:

一切正常,直到我运行这段代码:

TicketLine tl = (TicketLine)dgTicketLines.SelectedRows[0].DataBoundItem;
tl.Items--;
if (tl.Items < 1)
    CurrentTicket.TicketLines.Remove(tl);

CurrentTicket.TicketLines 是 BindingList&lt;TicketLine&gt;

运行上述代码时,DataGridView 中出现多个 IndexOutOfRange 异常。

【问题讨论】:

  • 哪一行抛出异常?我遇到了类似的问题,但是在访问 DataBoundItem 属性时抛出了 IndexOutOfRange 异常。

标签: c# .net winforms datagridview


【解决方案1】:

使用ObservableCollection&lt;TicketLine&gt; 代替 BindingList,它应该可以工作。

【讨论】:

  • BindingList 有什么区别和问题?
  • @OMGKurtNilsen:ObservableCollection 实现了 IObservable 模式并在添加或删除项目时传播事件。 DataGrid 会监听并删除这些行(或添加新行)。
  • 实际上,当我不再刷新列表更改的 DGW 时,问题就消失了。
  • DataGridView 应在 DataSource 发生更改时自行刷新。 (它将与 ObservableCollection)
  • 它也适用于 BindingList。但不知何故,它认为列表中的项目比实际项目多。我使用的集合似乎没有问题。
【解决方案2】:

您需要通过设置BindingList&lt;TicketLine&gt;.RaiseListChangedEvents = false; 来抑制ListChanged 事件,然后在您希望将任何更改传播到DataGridView 时调用BindingList&lt;TicketLine&gt;.ResetBindings();。当然还有其他方法可以做到这一点,但这对我来说一直很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    相关资源
    最近更新 更多