在某些VB6代码中,我有一个TreeView的Collapse事件处理程序:
1
| Private Sub MyTree_Collapse(ByVal Node as MSComCtlLib.Node) |
每当树中的节点折叠时(无论是由用户还是以编程方式),都会调用此方法。 事实证明,通过一些回旋执行,该处理程序可能会结束,告诉节点崩溃,从而导致无限递归。
我可以想到多种方法给这只猫换皮,但是对我来说,最简单的方法是告诉TreeView在一段时间内不要引发事件。 不过,我找不到一个简单的电话让我这样做。 有没有人成功完成此操作,还是我需要以其他方式跟踪状态,以便在出现递归事件时做出适当的响应?
VB6中的另一种方法是具有对控件的备用WithEvents引用:
1
| Private WithEvents alt as TreeView |
并在Form_Load中:
1 2 3
| Private Sub Form_Load()
Set alt=MyTree
End Sub |
现在,alt将收到很多这样的事件:
1 2 3 4 5
| Private Sub alt_Collapse(ByVal Node as MSComCtlLib.Node)
Set alt=Nothing
'DoSomeStuff'
Set alt=MyTree
End Sub |
但是,在DoSomeStuff期间,事件是未挂钩的-这也适用于alt的所有其他事件Sub,而无需进行侵入性更改。
@Phil-我得出了相同的结论。 我的MyTree_Collapse实现现在看起来像这样(其中m_bHandlingCallback是成员变量):
1 2 3 4 5 6 7
| Private Sub MyTree_Collapse(ByVal Node as MSComCtlLib.Node)
If m_bHandlingCallback Then Exit Sub
m_bHandlingCallback = True
DoSomeStuff
m_bHandlingCallback = False
End Sub |
我认为,就像VB中的许多事件一样,无法将其关闭。
只需按照您的建议设置一个布尔标志。
我将在Sub中将flag变量声明为STATIC。 这样可以避免使变量成为全局变量,并使其在两次调用之间保持其值。