1

这是我一直在问自己的一个问题。

给出一定的事件流,我可以在处理其中一个事件时停止下一个事件吗?

例如,当折叠在树视图(winform)中选择了哪个子节点时,会像这样引发事件:

  • 之前折叠
  • 选择前
  • 后选择
  • 折叠后

我可以通过使用类成员来阻止它们,但我想知道是否有一个内置函数或只是另一种方式(一种更优雅的方式)来实现这一点,直接作用于事件队列。

任何的想法?

4

5 回答 5

1

不容易,不。事件触发的顺序由 TreeView 控件类控制,并且没有内置的方法来阻止事件触发。但是你有几个选择:

  1. 创建您自己的继承自基类的 TreeView 类,然后添加一个bool属性以防止处理事件。然后你可以BeforeCollapse在调用之前覆盖等来检查布尔值base.BeforeCollapse
  2. 只需创建一个bool标志,并检查每个事件中的标志。
于 2012-05-23T13:09:43.027 回答
0

不,对于那种类型的事件(您要求 TreeView),没有办法做到这一点。

例如,可以通过内置机制管理KeyEventArgs.Handled 。

您可以使用一些实例(布尔?)值来管理流程,

或者您可以取消订阅您不希望收到更多的事件,但在再次订阅之后。听起来很粗糙的解决方案,但有时结果是合理的。

于 2012-05-23T13:06:42.510 回答
0

即使引发了事件,如果您不将事件处理程序绑定到它们,也不会发生任何事情。在这种情况下,您可以使用以下代码删除处理程序:

object.Event -= new EventHandlerType(your_Method)

否则,您应该创建自己的自定义控件

于 2012-05-23T13:07:19.303 回答
0

根据OnBeforeCollapse你得到一个具有属性的TreeViewCancelEventArgs 。Cancel将此设置为 true 应该会停止流程,但也不会折叠它。也一样OnBeforeSelect

于 2012-05-23T13:10:29.247 回答
0

唯一可以轻松“取消”事件的情况是事件处理程序具有CancelEventHandler委托类型。即使这样,它并没有真正取消它,而是为剩余事件设置一个标志,使其跳过执行所有订阅它的事件。

如果您确实有一个CancelEventHandler类型(这些没有),您只需Cancel在处理程序中将事件对象本身设置为 true。

许多其他答案为您提供了您应该做什么的建议。我只是按照你的想法去做:在你的控制类中设置一个“事件取消”标志,然后检查它。当系列中的最后一个事件被调用时,重置它。

于 2012-05-23T13:11:36.760 回答