Jacob Thomas
Jacob Thomas

Reputation: 41

Windows forms Treeview refresh issue

I am using a TreeView to show a folderstructure. I dynamically create nodes in the NodeMouseClick event.

But even though the child nodes are populated, they are not visible in the treeview.

However, minimizing the window and maximizing it again solves this issue. Please let me know what I am doing wrong here. Please find below the code that I am using:

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();
        }
    }

I have tried the suggestions provided by Gnial0id, wpfnoop and LarsTech here below. But no luck. Temporarily I have resolved it by minimizing and maximizing the form programatically.

Upvotes: 1

Views: 9512

Answers (2)

Jacob Thomas
Jacob Thomas

Reputation: 41

Adding below code bloc immediately after the code to add a New Node did the magic for me.

treeView1.SelectedNode = NodeToUpdate;

Here the NodeToUpdate is the node where the new child nodes are added.

Upvotes: 1

Ivan Stoev
Ivan Stoev

Reputation: 205849

Well, it's hard to figure out anything from the provided code snippet because many parts are missing. Also I don't quite understand why TreeNode toUpdate = treeView1.Nodes.Find(e.Node.Name, true).FirstOrDefault(); is needed and then why you are cloning the node you just created etc. So I've prepared a sample test which is doing something similar and it does not experience the problem you are describing. Check it out and compare it to your code to find out what is wrong.

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);
        }
    }
}

Upvotes: 1

Related Questions