树视图在修改时不会更新.窗口窗体

本文关键字:更新 窗口 窗体 视图 修改 | 更新日期: 2023-09-27 18:31:23

我有一个Windows Forms C#应用程序,它处理TreeView并使用单独的线程来更新它。单击按钮启动更新:

    private void button3_Click(object sender, EventArgs e)
    {
        vc.ChangeTree(treeView1);
    }

ChangeTree() 在单独的线程中启动 UpdateTree() 以异步更新 TreeView。在这里,我只需要为此使用线程:

    public void ChangeTree(TreeView tree)
    {
        Thread thread4 = new Thread(() => { UpdateTreeView(tree); });
        thread4.Name = "Thread 4";
        thread4.IsBackground = true;
        thread4.Start();
    }

UpdateTree() 只是调用 TreeView 并将另一棵树中的节点添加到其中。请注意,没有耗时的操作。GetTree() 只返回另一个 TreeView:

    private void UpdateTreeView(TreeView tree)
    {
        if (tree.InvokeRequired)
        {
            tree.Invoke((MethodInvoker)delegate
            {
                UpdateTreeView(tree);
            });
        }
        else
        {
            tree.Nodes.Clear();
            foreach (var node in GetTree().Nodes)
            {
                tree.Nodes.Add(node as TreeNode);
            }
            //Application.DoEvents(); // doesn't help
        }
    }

问题是它实际上将节点添加到树中,但表单没有显示它。单击按钮后,我检查了treeView1.Nodes。它包含我需要的节点。

Application.DoEvents() 没有帮助,即使它可能,根据我的搜索。treeView1.Refresh() 也没有。

如果我单击该按钮两次,treeView1 将按我的计划更新。但我不知道为什么,显然,我不需要这样的行为。

所以这里有一个问题。如何一键更新?


事实证明,TreeNode不能被多个TreeView使用。

我找到的解决方案是使用 treeNode.Clone():

tree.Nodes.Add((node as TreeNode).Clone() as TreeNode);

但我仍然不明白为什么最初的代码有效,即使它花了两次时间。

树视图在修改时不会更新.窗口窗体

我怀疑一个树节点不能从一个树视图更改为另一个树视图

这是我有效的测试代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button3_Click(object sender, EventArgs e)
        {
            ChangeTree(treeView1);
        }
        public void ChangeTree(TreeView tree)
        {
            Thread thread4 = new Thread(() => { UpdateTreeView(tree); });
            thread4.Name = "Thread 4";
            thread4.IsBackground = true;
            thread4.Start();
        }
        private void UpdateTreeView(TreeView tree)
        {
            if (tree.InvokeRequired)
            {
                tree.Invoke((MethodInvoker)delegate
                {
                    UpdateTreeView(tree);
                });
            }
            else
            {
                tree.Nodes.Clear();
                foreach (var node in GetTree())
                {
                    tree.Nodes.Add(node as TreeNode);
                }
            }
        }
        private List<TreeNode> GetTree()
        {
            var result = new List<TreeNode>();
            result.Add(new TreeNode("changed"));
            return result;
        }
    }
}

如果我将GetTree()函数更改为

    private TreeView GetTree()
    {
        var result = new TreeView();
        result.Nodes.Add(new TreeNode("changed"));
        return result;
    }

并将UpdateTreeView函数恢复为以前的样子,它的行为与您描述的一样

您是否尝试将焦点设置回树视图?使用 TreeView.Focus() 会导致刷新。