mscorlib.dll中发生了未处理的"System.StackOverflowException"类型异常

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.


Jim*_*hel 6

TreeView.AfterCheck事件的文档说:

TreeNode.Checked 从事件处理程序BeforeCheck 或AfterCheck事件处理程序中设置属性会导致事件多次引发,并可能导致意外行为.要防止多次引发事件,请向事件处理程序添加逻辑,该事件处理程序仅Action 在TreeViewEventArgs未设置为的属性时才执行递归代码TreeViewAction.Unknown.

每次调用s.Nodes(i)时都会引发事件.检查.