我知道标题可能看起来很傻,想不出更好的东西,对不起。
我有2个表单(C#),主表单包含第二个表单的实例。 有没有办法...从form2的实例访问Form1(入口点)和他的属性的运行实例?
每个人都告诉我要学习OOP。 很久很久以前,我做到了,但我仍然没有得到它。
答案 0 :(得分:9)
当主窗体实例化第二个窗体时,它可以将对自身的引用传递给第二个窗体的构造函数。
因此,第二种形式可以访问第一种形式的公共成员。
修改强>
在Form1中,您在某处实例化Form2并在ctor中传递对Form1的引用:
Form2 f2 = new Form2(this);
在Form2的类定义中添加一个字段:
private Form1 m_form = null;
在第二个表单的构造函数中设置该字段:
public Form2(Form1 f)
{
m_form = f;
}
然后,在Form2中的任何地方,您都可以通过m_form
访问Form1答案 1 :(得分:6)
您可能从Form1中实现了Form2。在实例化之后,在显示它之前,您可以在Form2上设置一个属性,引用Form1,如下所示:
Form2 f2 = new Form2();
f2.TheParent = this;
f2.Show();
当然,您必须将TheParent属性添加到Form2类才能够执行此操作。
警告:虽然这种方式可行,但更好的解决方案可能是创建一个包含所有必需/共享数据的单独对象,并以类似的方式将该对象传递给每个表单。这样可以防止代码过于耦合。
答案 2 :(得分:0)
一种解决方法是建立所有者关系。
// Create a form and make this form its owner
Form ownedForm = new Form();
ownedForm.Owner = this;
ownedForm.Show();
或者作为一种快捷方式,您可以将所有者表单作为参数传递给Show
方法的重载,该方法也带有IWin32Window参数
ownedForm.Show(this); // established owner-owned relationship
然后您可以像这样访问主要表单属性
((MainForm)this.Owner).ownerVariable;
要访问此变量/方法,它必须具有internal
保护修饰符。