创建新表单的问题

时间:2009-07-19 17:32:30

标签: c# .net winforms visual-studio-2008

在按钮中单击Form1的偶数处理程序,我想创建Form2。这是我的代码,

甚至是Form1的button1的处理程序

// button1 belongs to Form1
private void button1_Click(object sender, EventArgs e)
{
    Form2 form2 = new Form2("www.google.com");
    form2.ShowDialog();
}

Form2构造函数

public Form2 (string str)
{
    InitializeComponent();
    address = str;
    button2.Text = str; // button2 belongs to Form2
}

public Form2()
{
    InitializeComponent();
}

我的问题和关注点是,按钮1事件处理程序由Form1的UI线程执行,如果我在Form1 UI线程内创建新的Form2,并使用UI线程设置Form2的UI元素(button2.Text),那就是法律?我的理解是每个Form都有它的所有者UI线程和UI元素(例如按钮)应该只由表单个体所有者线程处理?如果我的代码是错误的,那么如果有人能告诉我在当前表单的事件处理程序中创建另一个Form并传递参数的优雅方式,那么我们将不胜感激。

我正在使用VSTS 2008 + C#+ .Net 2.0。

6 个答案:

答案 0 :(得分:6)

你的代码非常好。两种形式都将存在于同一个线程中,并且可以相互访问而无需担心线程。除非你特别说明,否则不会产生新的线程。

作为旁注,我想稍微改变Form2的构造函数。我假设Form2也有没有参数的默认构造函数,那个构造函数也调用InitializeComponent?如果是这样,则无需在构造函数中复制该调用;如果你这样设置,它将首先运行默认构造函数,然后添加自定义内容:

public Form2 (string str) : this()
{
    address = str;
    button2.Text = str; // button2 belongs to Form2
}

答案 1 :(得分:2)

在Winforms中,应用程序中的所有UI元素共享相同的UI线程。所以请保证,在这个意义上你的代码没有任何问题。

答案 2 :(得分:1)

这是合法的,应该可以正常工作。

答案 3 :(得分:1)

第二种形式将使用与form1相同的线程

答案 4 :(得分:1)

您的代码完全合法:-)文档只说任何UI控件只能从创建它的线程访问。

答案 5 :(得分:1)

所有表单都将在同一个线程上运行(除非您启动一个新线程并在此线程中创建表单)。