在一个线程上创建的控件不能作为另一个线程上的控件的父级

时间:2013-06-29 20:02:44

标签: c# multithreading winforms user-interface

我知道有类似的另外100个问题,但我似乎无法管理修复我的代码。我有一个返回Control的类,我想将此控件添加到TabControl的Tabpage中。我确定我做了一些迟钝的事情,我没有任何使用线程的经验。 如果我尝试修改此example,它仍然无效。但如果我不修改它,它确实会在我的标签中添加一个标签。

private void RUN()
        {
            document = new TextDocument(inputFile);//fileName
            if (tabControl1.TabPages[0].InvokeRequired)
            {
                tabControl1.TabPages[0].BeginInvoke((MethodInvoker)delegate()
                {
                    System.Windows.Forms.Label l = new System.Windows.Forms.Label(); l.Location = new System.Drawing.Point(12, 10);
                    l.Text = "Some Text";
                    tabControl1.TabPages[0].Controls.Add(l);

                });//but if i have something like tabControl1.TabPages[0].Controls.Add(document.controls.content); i get an error
            }
        }

我也尝试过使用后台工作程序,也失败了。如果我不使用另一个线程它工作,但我需要其余的界面工作,同时创建该控件(我从xls文件读取并创建一个ViewList,然后我添加到tabpage)。

1 个答案:

答案 0 :(得分:0)

不确定问题是什么......

这是一个在不同线程中创建的控件,但是在主UI线程中添加:

public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        System.Threading.Thread T = new System.Threading.Thread(new System.Threading.ThreadStart(RUN));
        T.Start();
    }

    private void RUN()
    {
        // control created in a different thread:
        System.Windows.Forms.Label l = new System.Windows.Forms.Label();
        l.Location = new System.Drawing.Point(12, 10);
        l.Text = "Some Text";

        // control added in the main UI thread:
        if (tabControl1.TabPages[0].InvokeRequired)
        {
            tabControl1.TabPages[0].BeginInvoke((MethodInvoker)delegate()
            {        
                tabControl1.TabPages[0].Controls.Add(l);
            });
        }
    }

}