c# - 窗体 : navigate TreeView in BackgroundWorker thread

标签 c# treeview backgroundworker

我有一个带有 TreeView 控件的简单 WinForms 应用程序。 我正在尝试创建 ExpandAll 函数。它调用获取选定节点并运行递归函数

private void expandNode2(TreeNode tn)
{
    if (tn == null) return;

    tn.TreeView.BeginUpdate();
    Application.DoEvents();
    tn.Expand();
    tn.TreeView.EndUpdate();
     foreach (TreeNode tnChild in tn.Nodes)
    {
        expandNode2(tnChild);
    }
 }

如果树很大,表格就会被卡住。如何在后台工作线程中扩展树?当我调用此函数时,我收到跨线程错误。

最佳答案

由于主线程拥有 treeView,因此您需要调用 invoke 来更新树。但这会将节点的扩展放回主线程,从而锁定您的 UI。

虽然你可以克隆你的根节点并将其传递给后台 worker (bw) 展开该节点及其子节点,然后将其传回并将您的 root = 设置为 bw 结果(这可以在 bw 完成方法中完成)。这会将所有扩展移动到 bw,但可能会占用大量资源,因为我们必须先克隆您的节点

    private void btnExpandR_Click(object sender, EventArgs e)
    {
        BackgroundWorker bw = new BackgroundWorker();
        TreeNode tempnode = treeView.Nodes[0].Clone() as TreeNode;
        bw.DoWork += bw_DoWork;
        bw.RunWorkerCompleted += NodeCopy;
        bw.RunWorkerAsync(tempnode);
    }

    private void NodeCopy(object sender, RunWorkerCompletedEventArgs e)
    {
        treeView.Nodes[0] = e.Result as TreeNode;
    }

    void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        TreeNode tempNode = e.Argument as TreeNode;
        Exp(tempNode);
        e.Result = tempNode;
    }

    private void Exp(TreeNode tn)
    {
        tn.Expand();

        foreach(TreeNode t in tn.Nodes)
        {
            if(t.Nodes.Count > 0)
            {
                exp(t);
            }
        }
    }

你也可以用

展开
    private void Exp(TreeNode tn)
    {
        tn.ExpandAll();
    }

关于c# - 窗体 : navigate TreeView in BackgroundWorker thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34905717/

相关文章:

c# - 将 XDocument 绑定(bind)到 TreeView - 属性不显示

c# - 一个窗口中的 WPF 应用程序

c# - 创建两个实现相同接口(interface)的单例服务

c# - DataGridView AllowUserToAddRow 属性不起作用

c# - 通过代码更改 Telerik WPF 按钮颜色

c# - 使用 backgroundworker 手动停止调试

c# Windows 窗体无法响应单击操作

c# - 具有重复条目的多对多关系

sql - 如何从 SQL 查询构建对象层次结构? (对于 WPF TreeView )

jQuery 展开折叠定义列表 (DL) 中的所有 DT 标签