我有两个表单(
Form1
和Form2
),在Form1
中我创建了Form2
的实例并显示它。
public void buttonFrom1_Click(object sender, EventArgs e)
{
Form2 frm2 = new Form2();
frm2.Show();
}
如何从
ComboBox
访问 Form1
中的 Form2
?我尝试从以另一种形式创建的 From1
实例进行访问,但收到错误:"cs0103 the name "frm1" does not exist in the current context"
。
public void buttonForm2_Click(object sender, EventArgs e)
{
string item = frm1.BanksComboBox.SelectedItem.ToString();
MessageBox.Show(item);
}
这是一个“紧密耦合”的解决方案,与“松散耦合”相反,这是 jmcilhinney 在评论中正确建议的。
这是通过表单的
Owner
属性完成的,您可以在调用 Show()
时设置该属性:
public partial class Form1 : Form
{
private void button1_Click(object sender, EventArgs e)
{
Form2 frm2 = new Form2();
frm2.Show(this); // <-- pass in this Form1 instance as the "Owner".
}
}
然后,在 Form2 中,将
Owner
投射回 Form1 并访问 ComboBox(假设其 Modifiers
属性是公共的):
public partial class Form2 : Form
{
private void button1_Click(object sender, EventArgs e)
{
Form1 frm1 = this.Owner as Form1;
if (frm1 != null)
{
string item = frm1.BanksComboBox.SelectedItem.ToString();
MessageBox.Show(item);
}
}
}
我喜欢这种方法,因为它非常容易理解并且无需更改太多代码即可实现。仅当 Form2 仅与 Form1 结合使用时才使用此方法。换句话说,如果没有 Form1,Form2 就毫无用处,那么这种方法可能是一个合理的选择。如果 Form2 本质上更通用,并且将与 Form1 之外的其他 Form 一起使用,那么松散耦合的方法会更有意义。