her*_*iod 1 .net treeview winforms
我有以下sub,它检查节点时检查Windows窗体树视图中的所有节点的子节点.每当我点击它时,我都会收到主题中所述的错误,但这只会在设置checked属性时发生.如果我只是运行注释掉的MsgBox行,它可以正常工作,没有错误.
Private Sub TreeView1_AfterCheck(ByVal sender As System.Object, ByVal e As _
TreeViewEventArgs) Handles TreeView1.AfterCheck
For Each s As TreeNode In TreeView1.Nodes
If s.Checked = True Then
For i As Integer = 0 To s.Nodes.Count - 1
MsgBox(s.Nodes(i).Text)
s.Nodes(i).Checked = True
Next
End If
Next
End Sub
Run Code Online (Sandbox Code Playgroud)
由于这是一个StackOverflow异常,这似乎是最好的问题!
小智 8
发生的事情是,在AfterCheck事件中你正在'检查'一个树节点,它触发AfterCheck事件,你在其中'检查'一个节点,它触发AfterCheck事件,你在其中'检查'一个节点,它会触发AfterCheck事件,在其中"检查"一个节点,该节点触发AfterCheck事件,在该节点中"检查"一个节点,该节点触发AfterCheck事件,在该事件中,您"检查"一个节点,该节点将触发AfterCheck事件,您"检查"一个节点,该节点触发AfterCheck事件,在该节点中,您"检查"一个节点,该节点触发AfterCheck事件,在该节点中您"检查"一个节点,该节点将触发AfterCheck事件,您将在该节点中"检查"一个节点,它触发AfterCheck事件,在其中"检查"一个节点,该节点触发AfterCheck事件,在该节点中"检查"一个节点,该节点触发AfterCheck事件,在该事件中,您"检查"一个节点,该节点将触发AfterCheck事件,在其中"检查"一个节点,导致堆栈溢出.
要修复,请不要在AfterCheck事件处理程序中设置Checked.
TreeView.AfterCheck事件的文档说:
TreeNode.Checked从事件处理程序BeforeCheck或AfterCheck事件处理程序中设置属性会导致事件多次引发,并可能导致意外行为.要防止多次引发事件,请向事件处理程序添加逻辑,该事件处理程序仅Action在TreeViewEventArgs未设置为的属性时才执行递归代码TreeViewAction.Unknown.
每次调用s.Nodes(i)时都会引发事件.检查.