C# 已移除事件,但仍处于激发状态

C# 已移除事件,但仍处于激发状态,c#,winforms,events,C#,Winforms,Events,我有一个奇怪的错误,一个不希望发生的事件正在发生。我可以跟踪代码,看到正在使用-=语法删除“onRowLeave”事件处理程序,然后数据源的下一行被更改,从而导致“onRowLeave”处理程序启动 因此,似乎移除不起作用 我知道它不会再被添加进去了,因为我在所有添加了+=的地方都有一个断点,而且它没有命中这些断点 我在想也许它被添加了两次,只被删除了一次。。。这会导致它吗?有什么方法可以在调试器中看到处理程序吗?->>我想它可能被添加了两次,而只被删除了一次。。。那会吗 原因是什么 这是正确的

我有一个奇怪的错误,一个不希望发生的事件正在发生。我可以跟踪代码,看到正在使用-=语法删除“onRowLeave”事件处理程序,然后数据源的下一行被更改,从而导致“onRowLeave”处理程序启动

因此,似乎移除不起作用

我知道它不会再被添加进去了,因为我在所有添加了+=的地方都有一个断点,而且它没有命中这些断点


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

->>我想它可能被添加了两次,而只被删除了一次。。。那会吗 原因是什么

这是正确的

->>有没有办法在调试器中查看处理程序

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

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


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

->>我在想,也许它被添加了两次,只被删除了一次。。。那会吗 原因是什么

这是正确的

->>有没有办法在调试器中查看处理程序

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

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


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

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

当我遇到类似这样的事件处理程序问题时,我通常提供自己的事件添加/删除方法,并在自己的容器中跟踪事件处理程序以及其他调试数据(如果有用)。这允许在调试器中检查集合,如果以这种方式添加的每个事件都与System.Diagnostics.StackTrace对象关联,则附加数据将非常有用。

是,这将导致它。请注意,OnRowLeave()是一个方法,而不是一个事件。因此,添加两次相同的处理程序会产生效果?如果是,我如何避免这种情况?在添加之前删除它?是的,这会导致它。请注意,OnRowLeave()是一个方法,而不是一个事件。因此,添加两次相同的处理程序会产生效果?如果是,我如何避免这种情况?在添加之前删除它?