在TreeView的AfterCheck事件中添加处理代码,设置其它相关TreeNode的Checked属性。

      问题:

      通过代码改变TreeNode.Checked属性同样会触发TreeView.AfterCheck事件。若节点A的状态改变时需要自动改变节点B的选中状态,且节点B的状态改变时也需要自动改变节点A的选中状态,即A和B互为相关节点时。此实现将导致死循环。

     解决办法:

     AfterCheck的事件中的第二个参数(e As System.Windows.Forms.TreeViewEventArgs)对象具有属性Action,其值标识了是何种行为解决了AfterCheck事件。对于通过代码设置TreeNode.Checked属性所引发的AfterCheck事件,该参数的Action属性值为UnKnow。假若我们希望节点状态的改变不会递归扩散,则可以在AfterCheck的响应代码里判断该属性,在值为Unknow时不进行操作。

 

    举例:

    Private Sub trAuth_AfterCheck(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles trAuth.AfterCheck
        If e.Action <> TreeViewAction.Unknown Then
         '''代码执行

        End If

    End Sub