为了使用ThreadPool用多线程加载TREEVIEW,代码作如下更改,未成功原代码片断:
private void bind_tree(string ChildNodes, TreeNode tn )
{
    DataTable dt = acesSql.getTreeCatalog(ChildNodes).Tables[0];
    foreach (DataRow dr in dt.Rows)
    {
        TreeNode Node = new TreeNode();
        if (tn == null)
        {  //添加根节点
            Node.Text = dr["menuText"].ToString();
            this.treeView1.Nodes.Add(Node);
            bind_tree(dr["nodeId"].ToString(), Node);    //再次递归
        }
        else
        {   //添加当前节点的子节点
            Node.Text = dr["menuText"].ToString();
            tn.Nodes.Add(Node);
            bind_tree(dr["nodeId"].ToString(), Node); //再次递归
        }
    }
}
更改后:
private  void bind_tree(object obj)
{
    string ChildNodes = ((MyState)obj).Info;
    TreeNode tn = ((MyState)obj).Number;
    DataTable dt = acesSql.getTreeCatalog(ChildNodes).Tables[0];
    foreach (DataRow dr in dt.Rows)
    {
        TreeNode Node = new TreeNode();
        if (tn == null)
        {   Node.Text = dr["menuText"].ToString();
            treeView1.Nodes.Add(Node);            MyState aa = new MyState(dr["nodeId"].ToString(),Node);
            object bb=(object) aa;
            bind_tree(bb);
        }
        else
        { 
            Node.Text = dr["menuText"].ToString();
            tn.Nodes.Add(Node);            MyState aa = new MyState(dr["nodeId"].ToString(), Node);
            object bb = (object)aa;
            bind_tree(bb);
        }
    }
}
错误:在该控件上执行的操作正从错误的线程调用。使用 Control.Invoke 或 Control.BeginInvoke 封送到正确的线程才能执行此操作更改后的代码是否正确,如何更正

解决方案 »

  1.   

    WinForm吧?在WinForm中想对控件使用线程时,必须使用Invoke()或者是BeginInvoke()的,不然会报线程占用异常。
    首先你要定义一个委托,用来存放你加入树节点的方法,然后把那个委托Invoke起来就行了。
      

  2.   

    没人回答啊,哭死private  void bind_tree(object obj)
    {
        string ChildNodes = ((MyState)obj).Info;
        TreeNode tn = ((MyState)obj).Number;
        DataTable dt = acesSql.getTreeCatalog(ChildNodes).Tables[0];
        foreach (DataRow dr in dt.Rows)
        {
            TreeNode Node = new TreeNode();
            if (tn == null)
            {   Node.Text = dr["menuText"].ToString();
                treeView1.Nodes.Add(Node);            MyState aa = new MyState(dr["nodeId"].ToString(),Node);
                object bb=(object) aa;
                bind_tree(bb);
            }
            else
            { 
                Node.Text = dr["menuText"].ToString();
                tn.Nodes.Add(Node);            MyState aa = new MyState(dr["nodeId"].ToString(), Node);
                object bb = (object)aa;///这里递归该怎么写啊?
                bind_tree(bb);////这里递归该怎么写啊?
            }
        }
    }
      

  3.   

    二楼正解。可以把TreeNode异步传进来,当返回主线程TreeView控件时,就需要委托一个函数,Invoke。