如何通过线程c#将节点添加到TreeView中?

时间:2014-05-14 12:31:41

标签: c# multithreading treeview

我希望在多层次中使用> 30000个节点填充我的树视图。

我使用此代码填充它,但是树视图需要超过30秒的时间来填充它。

如何使用多线程来提高速度来填充它?

//在我的窗体中:

private void ThesaurusFrm_Load(object sender, EventArgs e)
        {
            TreadPopulateTree();
        }

private void TreadPopulateTree()
        {
            System.Threading.Thread TrPopulateTree = new System.Threading.Thread(new System.Threading.ThreadStart(PopulateTree));
            TrPopulateTree.Start();
        }

        private void PopulateTree()
        {
            FillTree.TvTrees = TvThesaurusNodes;
            FillTree Ft = new FillTree();
            var TreeItems = Db.LoadThesaurusTrees();

            if (TvThesaurusNodes.InvokeRequired)
                TvThesaurusNodes.BeginInvoke(new MethodInvoker(() =>
                {
                    Ft.LoadTrees(TreeItems);
                }));
        }

//在我的FillTree类

public static TreeView TvTrees;

List<TreesFieldSet> TreeItems = new List<TreesFieldSet>();
public void LoadTrees(List<TreesFieldSet> TreeItems)
{
    this.TreeItems = TreeItems;

    TvTrees.Nodes.Clear();
    TvTrees.ShowPlusMinus = true;
    TvTrees.FullRowSelect = true;

    TvTrees.Nodes.Clear();
    TvTrees.BeginUpdate();
    LoadBaseNodes();
    TvTrees.EndUpdate();
    TvTrees.Refresh();
}

private void LoadBaseNodes()
{
    if (TreeItems != null)
    {
        int BaseParent = 0;
        TreeNode Node;
        foreach (TreesFieldSet Tfs in TreeItems)
        {
            if (Tfs.ParentId < BaseParent)
                BaseParent = Tfs.ParentId;
        }
        foreach (TreesFieldSet Tfs in TreeItems)
        {
            if (Tfs.ParentId == BaseParent)
            {
                Node = TvTrees.Nodes.Add(Tfs.Title);
                Node.Tag = Tfs.TreeId;
                GetChildren(Node);
            }
        }
    }
}

private void GetChildren(TreeNode Node)
{
    TreeNode ChNode = null;
    Int32 nodeCat = (Int32)Node.Tag;
    foreach (TreesFieldSet Tfs in TreeItems)
    {
        if (Tfs.ParentId == nodeCat)
        {
            ChNode = Node.Nodes.Add(Tfs.Title);
            ChNode.Tag = Tfs.TreeId;
            GetChildren(ChNode);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

永远不会使用UI进行多线程处理,在某些情况下,阅读不是问题,但写作总是一个问题。

您可以推迟加载,即仅加载用户可以看到的内容,然后仅在用户单击节点时加载子项。我回答了similar question here,看看是否有帮助。

通常,您只加载“节点”及其“直接子节点”不会少于此。

希望这有帮助。