这是我一直在问自己的一个问题。
给出一定的事件流,我可以在处理其中一个事件时停止下一个事件吗?
例如,当折叠在树视图(winform)中选择了哪个子节点时,会像这样引发事件:
- 之前折叠
- 选择前
- 后选择
- 折叠后
我可以通过使用类成员来阻止它们,但我想知道是否有一个内置函数或只是另一种方式(一种更优雅的方式)来实现这一点,直接作用于事件队列。
任何的想法?
不容易,不。事件触发的顺序由 TreeView 控件类控制,并且没有内置的方法来阻止事件触发。但是你有几个选择:
bool
属性以防止处理事件。然后你可以BeforeCollapse
在调用之前覆盖等来检查布尔值base.BeforeCollapse
。bool
标志,并检查每个事件中的标志。不,对于那种类型的事件(您要求 TreeView),没有办法做到这一点。
例如,可以通过内置机制管理KeyEventArgs.Handled 。
您可以使用一些实例(布尔?)值来管理流程,
或者您可以取消订阅您不希望收到更多的事件,但在再次订阅之后。听起来很粗糙的解决方案,但有时结果是合理的。
即使引发了事件,如果您不将事件处理程序绑定到它们,也不会发生任何事情。在这种情况下,您可以使用以下代码删除处理程序:
object.Event -= new EventHandlerType(your_Method)
否则,您应该创建自己的自定义控件
根据OnBeforeCollapse你得到一个具有属性的TreeViewCancelEventArgs 。Cancel
将此设置为 true 应该会停止流程,但也不会折叠它。也一样OnBeforeSelect
。
唯一可以轻松“取消”事件的情况是事件处理程序具有CancelEventHandler
委托类型。即使这样,它并没有真正取消它,而是为剩余事件设置一个标志,使其跳过执行所有订阅它的事件。
如果您确实有一个CancelEventHandler
类型(这些没有),您只需Cancel
在处理程序中将事件对象本身设置为 true。
许多其他答案为您提供了您应该做什么的建议。我只是按照你的想法去做:在你的控制类中设置一个“事件取消”标志,然后检查它。当系列中的最后一个事件被调用时,重置它。