【问题标题】:removed event but still firing删除事件但仍在触发
【发布时间】:2009-03-25 02:01:49
【问题描述】:

我遇到了一个奇怪的错误,即触发了不需要的事件。我可以跟踪代码并看到“onRowLeave”事件处理程序正在使用 -= 语法被删除,然后下一行 DataSource 被更改,这导致“OnRowLeave”处理程序被触发!

所以看来删除不起作用。

我可以说它没有以某种方式再次被添加,因为我在所有用 += 添加它的地方都有一个断点,而且它没有命中那些。

我在想,也许它被添加了两次,并且只删除了一次……这会导致它吗?有什么方法可以让我在调试器中看到处理程序?

【问题讨论】:

  • 是的,这会导致它。注意 OnRowLeave() 是一个方法,而不是一个事件。
  • 那么两次添加同一个handler有效果吗?
  • 如果是这样,我该如何避免呢?在添加之前将其删除?

标签: c# winforms events


【解决方案1】:

->> 我在想它可能被添加了两次,并且只删除了一次......会这样吗? 导致它?

没错。

->> 有什么方法可以让我在调试器中看到处理程序?

我认为这是不可能的。此外,如果您不知道添加事件处理程序的次数,那么将其删除并不是一项简单的任务。我想你可以使用反射来实现这一点。

我建议您研究代码并了解在哪里为什么您有多个事件注册,以便您可以在需要时手动删除它们。

(您可能需要注意(如 nobugz 所建议),OnRowLeave 是 DataGridView 的一种方法,而不是事件。此方法不向用户公开,而是负责引发 RowLeave 事件用户可以捕获的。我不太清楚你为什么使用术语 OnRowLeave)

【讨论】:

    【解决方案2】:

    当我遇到此类挥之不去的事件处理程序问题时,我通常会提供自己的事件添加/删除方法,并在我自己的容器中跟踪事件处理程序以及其他调试数据(如果它看起来有用的话)。这允许在调试器中检查集合,如果它为以这种方式添加的每个事件关联一个 System.Diagnostics.StackTrace 对象,附加数据会非常有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多