我无法访问我的主要表单的属性或从Form1
打开的辅助表单的对象属性。
有一种简单的方法可以解决这个问题吗?
我在网上找到了几个无用的解决方案。
答案 0 :(得分:0)
将Form1
的属性设置为公开,但请注意,这会破坏OOP规则
答案 1 :(得分:0)
在MainForm中设置一个或多个公共属性。打开第二个表单时,将该表单的所有者设置为MainForm。这样,您可以以第二种形式访问MainForm的属性。示例代码:
代码隐藏Form1:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public String SomeProperty { get; set; }
//Event of a normal button with name 'OpenFormButton'
private void OpenFormButton_Click(object sender, EventArgs e)
{
var secondForm = new Form2
{
Owner = this
};
secondForm.Show();
}
private void Form1_Load(object sender, EventArgs e)
{
SomeProperty = "HELLO WORLD";
}
}
Code-behind Form2:
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
var owner = this.Owner as Form1;
var val = owner.SomeProperty;
MessageBox.Show(val); //Shows a MessageBox with 'HELLO WORLD'
}
}
这只是一个简单的代码,用于说明如何访问其他表单上的属性。您也可以设置(更改)属性的值,而不仅仅获取属性的值。这也适用于复杂类型而不是字符串和整数。希望这有帮助!
答案 2 :(得分:0)
您必须将Form1的实例传递给Form2构造函数
答案 3 :(得分:0)
我更喜欢使用像这样的简单回调函数:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public String SomeProperty { get; set; }
private void OpenFormButton_Click(object sender, EventArgs e)
{
var secondForm = new Form2()
{
GetSomeProperty = () => { return SomeProperty ;};
};
secondForm.Show();
}
private void Form1_Load(object sender, EventArgs e)
{
SomeProperty = "HELLO WORLD";
}
}
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
public Func<string> GetSomeProperty
{
get;
set;
}
private void Form2_Load(object sender, EventArgs e)
{
MessageBox.Show(GetSomeProperty.Invoke());
}
}
每次打电话 GetSomeProperty.Invoke(); Func将调用get访问器并从第一个Form
返回它