当TreeView.SelectedNode为空时,TreeView的 AfterSelect事件被触发

后端开发 2026-07-08

我刚在学习C#,在一个WinForms项目中处理TreeView时遇到困难。根据MSDN,当树节点未被选中时,TreeView.AfterSelect 事件不会发生:

https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.treeview.afterselect?view=windowsdesktop-10.0

我发现它确实会发生。在一个简单的WinForms项目中,只有一个TreeView控件和 TreeView.AfterSelect 事件——给定以下代码——会进入无限循环:

using static System.Windows.Forms.VisualStyles.VisualStyleElement;

namespace WinFormsAppTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            // populate some nodes in treeview
            TreeNode rootNode = new TreeNode();
            rootNode.Text = "Colors1";
            treeView1.Nodes.Add(rootNode);

            TreeNode childNode = new TreeNode();
            childNode.Text = "Red";
            rootNode.Nodes.Add(childNode);

            childNode = new TreeNode();
            childNode.Text = "Yellow";
            rootNode.Nodes.Add(childNode);

            childNode = new TreeNode();
            childNode.Text = "Green";
            rootNode.Nodes.Add(childNode);

            rootNode = new TreeNode();
            rootNode.Text = "Colors2";
            treeView1.Nodes.Add(rootNode);

            childNode = new TreeNode();
            childNode.Text = "Black";
            rootNode.Nodes.Add(childNode);

            childNode = new TreeNode();
            childNode.Text = "Blue";
            rootNode.Nodes.Add(childNode);

            childNode = new TreeNode();
            childNode.Text = "White";
            rootNode.Nodes.Add(childNode);
        }

        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
            test();
        }

        private void test()
        {
            treeView1.SelectedNode = null;
        }
    }
}

如果我把断点放在 treeView1.SelectedNode = null; 上,这就是我的完整测试程序。

我会得到一个无限循环。唯一能让它停止的方法是点击TreeView,但不能点在某个节点上。

解决方案

只有在你放置普通断点时才会发生这种情况,因为触发断点会改变焦点并触发额外的事件。尝试改用动作断点。你可以用它向输出窗口打印内容,这样就不会产生无限循环。

在此处输入图片描述

示例输出窗口:

Selected node: {Text = "Node0"}
Selected node: {Text = "Node0"}
Selected node: {Text = "Node4"}
Selected node: {Text = "Node10"}
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章