为了使用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 封送到正确的线程才能执行此操作更改后的代码是否正确,如何更正
首先你要定义一个委托,用来存放你加入树节点的方法,然后把那个委托Invoke起来就行了。
{
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);////这里递归该怎么写啊?
}
}
}