树视图在修改时不会更新.窗口窗体
本文关键字:更新 窗口 窗体 视图 修改 | 更新日期: 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() 会导致刷新。