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