我写了一个为我填写树视图的课程。在我的项目中,我需要多次这个树视图而且我不想复制粘贴我的代码,所以我决定为我创建一个填充树视图的类。
在某些表单上,我想使用一个线程来填充树视图。这是因为有时加载数据并填充树视图可能需要一些时间。
在我的treeview-class中,我在构造函数中传递了treeview。目前我想填写树视图,我调用LoadTreeview()
方法。
我想在一个线程上调用LoadTreeview
方法,但是当我这样做时,我得到了另一个线程上创建树视图的异常。这偏离逻辑。但我想知道,创建一个使用控件的自定义类的最佳方法是什么,并且你想在一个线程中使用这个类?
我是否需要在每个'GUI-action'上编写此代码?
treeview.Invoke((MethodInvoker)delegate
{
treeview.Nodes.Add(MyNode);
})
还是有其他(更智能)的方法吗?
答案 0 :(得分:2)
您和Levisaxos的解决方案都可以防止崩溃,但您应该真正对此运行时性能进行基准测试。问题是,如果向树视图中插入大量节点,并且每个节点都是通过Control.Invoke插入的,那么除了与UI线程同步之外,您的代码不会做太多工作。如果是这种情况,您应该考虑从实际插入节点中单独加载为树视图创建节点所需的数据。而是异步加载数据,然后同时插入所有节点。
答案 1 :(得分:0)
public delegate TreeView updateLabelDelegate(TreeView view);
private TreeView InvokeTreeView(TreeView view)
{
if (view.InvokeRequired)
{
view.Invoke(new updateLabelDelegate(InvokeTreeView), new object[] { view });
return null;
}
else
{
return view;
}
}
我希望这会对你有所帮助。这就是我处理异步操作的方式。 [编辑] 取决于您想要如何使用它。 在一个帖子中:
public TreeView thistreeviewsucks;
void SomeThread()
{
TreeView tv = new TreeView();
tv.Items.Add("something");
//upon completion
this.thistreeviewsucks = InvokeTreeView(tv);
}
据我所知,这将有效。