【问题标题】:Windows forms Treeview refresh issueWindows 窗体 Treeview 刷新问题
【发布时间】:2015-09-23 14:25:20
【问题描述】:

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

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

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

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 提供的建议。但没有运气。我暂时通过以编程方式最小化和最大化表单来解决它。

【问题讨论】:

  • 你试过 Suspend/ResumeLayout 方法吗?
  • 代码似乎有效。问题可能出在其他地方。
  • 也许尝试 Invalidate() 而不是 Refresh()?无效重绘整个控件,只刷新客户区。
  • Windows 版本很重要。请尝试通过在对话调用之后移动 BeginUpdate() 调用来限制风险。并完全删除 Begin/EndUpdate() 并在您的问题中说明这是否有任何影响。
  • 尝试了所有这些建议。但没有帮助。暂时,我通过一次以编程方式最小化和最大化窗口来管理它。之后它永远有效。

标签: c# winforms treeview refresh


【解决方案1】:

嗯,很难从提供的代码 sn-p 中找出任何东西,因为很多部分都丢失了。另外我不太明白为什么需要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);
        }
    }
}

【讨论】:

  • 你好伊万。非常感谢您为此付出的努力。正如另一位@Hans 之前通知的那样,这可能是 Windows 版本的问题或系统特定的问题。我检查了您的解决方案,并尝试合并更改。我再次修改了我的代码以适应您提出的方式。但这对我没有帮助。经过大量的试验和错误方法后,我想出了一个解决这个问题的方法。解决方案是添加这样的代码块:treeView1.SelectedNode = NodeToUpdate;这实际上解决了这个问题。再次非常感谢您调查此问题。
  • 还要回答您之前评论中的查询,代码块 TreeNode toUpdate = treeView1.Nodes.Find(e.Node.Name, true).FirstOrDefault();不是强制性的,我们可以使用 e.Node.Nodes.Add 早期的代码(Nodes.Find())是为了使这个事件起作用而演变的。此外,克隆是由另一个网站(我不记得的链接)提出的,作为 Treeview 刷新问题的解决方案以及更新节点的最佳实践。
【解决方案2】:

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

treeView1.SelectedNode = NodeToUpdate;

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

【讨论】:

    猜你喜欢
    • 2016-05-23
    • 2012-09-23
    • 2017-10-23
    • 2010-12-02
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多