我无法从从Form1
.
有没有简单的方法可以解决这个问题?
我在网上找到了几个无用的解决方案。
在 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";
}
}
代码隐藏 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'
}
}
这只是一个简单的代码,展示了如何访问另一个表单上的属性。不仅可以获取属性的值,还可以设置(更改)属性的值。这也适用于复杂类型而不是字符串和整数。希望这可以帮助!
您必须将 Form1 的实例传递给 Form2 构造函数
我更喜欢使用这样的简单回调函数:
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 返回它
将 的属性设置Form1
为 public 但请注意,这违反了 OOP 规则