2012-09-09 44 views
2

我有我的用户控件。我将这些用户控件(100个或更多)的集合添加到面板。而这个面板又被添加到主表单中。所有这些都是在运行时完成的。 由于有太多的用户控件,我的主表单无法响应,直到添加了这些用户控件。从其他线程添加UserControl

我想知道如果我可以在面板,然后再从一个单独的线程添加到窗体创建我的用户控件,并将它们添加到相同的面板,所以我的主要形式是始终提供给用户。我所有的努力导致:

'跨线程操作无效'错误。

我将是伟大的充分,如果有人能帮助我。

这里就是我现在

void main(){ 
    MyPanel pnlObj = new MyPanel(); 
    this.Controls.Add(pnlObj); 
} 

Class MyPanel{ 

    public void Panel() 
    { 
     MyUserControl uc1 = new MyUserControl(); 
     MyUserControl uc2 = new MyUserControl(); 
     this.Add(uc1); 
     this.Add(uc2); 
    } 
} 

回答

5

你不能在一个非UI线程的视觉元素,对不起,这项工作做。

但是你可以做的是建立在非UI线程的所有必要的数据,并委托建立的UI元素和更新UI到UI线程。

这应该是这样的:

// in background thread 
ComputeDataSlowly(); 
MainForm.Invoke(() => 
{ 
    var control = CreateNewControlFromData(); 
    MainForm.Add(control); 
}); 
+0

谢谢,但一个例子会更有帮助。 – Zubair

+0

@Zubair:好的,也许你可以举一个你将要实现的例子吗? – Vlad

+0

我编辑了我原来的文章,因此它可能会给你一个大概的想法,我现在正在做这件事。 – Zubair

3

我不知道是否有你的问题的解决方案。只有GUI线程可以更新控制,所以即使你使用一个额外的线程,你仍然必须转发创建/通过Invoke/BeginInvoke,从而导致回你原来的问题添加控件到GUI线程的工作。