Windows 表单 Treeview 刷新问题

Windows forms Treeview refresh issue

我正在使用 TreeView 来显示文件夹结构。我在 NodeMouseClick 事件中动态创建节点。

但是即使填充了子节点,它们在树视图中也不可见。

但是,最小化 window 并再次最大化它可以解决此问题。请让我知道我在这里做错了什么。请在下面找到我正在使用的代码:

private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
    {
        if (treeView1.SelectedNode != null && e.Node.IsExpanded)
        {
            treeView1.BeginUpdate();
            TreeNode node = e.Node;
            while (node.Parent != null)
            {
                node = node.Parent;
            }
            VcDetailsEntity detailsEntity = connectedVCs.Where(c => c.VCName == node.Name).FirstOrDefault();
            detailsEntity.VCBrowserPath = e.Node.Name;
            FolderBrowser cosmosBrowser = new FolderBrowser();
            List<FolderStreamEntity> folderStreams = folderBrowser.GetVcContentDetails(detailsEntity);
            e.Node.Nodes.Clear();
            foreach (var stream in folderStreams)
            {
                if (stream.IsDirectory)
                {
                    TreeNode treeNode = new TreeNode();
                    treeNode.Name = stream.StreamName;
                    treeNode.Text = stream.QualifiedName;
                    treeNode.ToolTipText = stream.QualifiedName;
                    TreeNode dummyNode = new TreeNode();
                    treeNode.Nodes.Add((TreeNode)dummyNode.Clone());
                    TreeNode toUpdate = treeView1.Nodes.Find(e.Node.Name, true).FirstOrDefault();
                    toUpdate.Nodes.Add((TreeNode)treeNode.Clone());
                }
            }
            treeView1.EndUpdate();
            treeView1.Refresh();
        }
    }

我已经在下面尝试了 Gnial0id、wpfnoop 和 LarsTech 提供的建议。但没有运气。我暂时通过以编程方式最小化和最大化表单来解决它。

好吧,很难从提供的代码片段中找出任何内容,因为缺少许多部分。我也不太明白为什么需要 TreeNode toUpdate = treeView1.Nodes.Find(e.Node.Name, true).FirstOrDefault(); 以及为什么要克隆刚刚创建的节点等。所以我准备了一个示例测试,它正在做类似的事情,但 没有 遇到您描述的问题。检查它并将其与您的代码进行比较以找出问题所在。

using System;
using System.Windows.Forms;

namespace Samples
{
    static class Test
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            var form = new Form();
            var treeView = new TreeView { Dock = DockStyle.Fill, Parent = form };
            for (int i = 1; i <= 10; i++)
            {
                var parent = new TreeNode { Text = "Parent#" + i };
                treeView.Nodes.Add(parent);
                for (int j = 1; j <= 10; j++)
                {
                    var child = new TreeNode { Text = "Child#" + i };
                    var dummy = new TreeNode();
                    child.Nodes.Add(dummy);
                    parent.Nodes.Add(child);
                }
            }

            var random = new Random();
            int addCount = 0;
            treeView.NodeMouseClick += (sender, e) =>
            {
                if (treeView.SelectedNode == e.Node && e.Node.IsExpanded)
                {
                    treeView.BeginUpdate();
                    e.Node.Nodes.Clear();
                    int count = random.Next(20) + 1;
                    for (int i = 1; i <= count; i++)
                    {
                        var child = new TreeNode { Text = "AddChild#" + (++addCount) };
                        var dummy = new TreeNode();
                        child.Nodes.Add(dummy);
                        e.Node.Nodes.Add(child);
                    }
                    treeView.EndUpdate();
                }
            };

            Application.Run(form);
        }
    }
}

在添加新节点的代码之后立即添加以下代码块对我来说很神奇。

treeView1.SelectedNode = NodeToUpdate;

这里的NodeToUpdate是新添加子节点的节点。