在按钮中单击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。
答案 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)
所有表单都将在同一个线程上运行(除非您启动一个新线程并在此线程中创建表单)。