我想从Form1
更新Form2
的标签。所以这就是我所拥有的:
// Form1
public string Label1
{
get { return this.label1.Text; }
set { this.label1.Text = value; }
}
// Form2
private void button1_Click(object sender, EventArgs e)
{
Form1 frm1 = new Form1();
frm1.Label1 = this.textBox1.Text;
this.Close();
}
所以上面的代码不起作用。但是,当我添加以下内容时:
frm1.Show();
之后
this.Close();
在Form2代码中,Form1显然正在再次打开(两个窗口)。但我希望它在同一窗口中更新,因此我建议this.Close()
是不必要的。
有人有什么想法吗?
答案 0 :(得分:6)
在button1_Click
方法中,您实际上是在创建Form1
的 new 实例并设置该新实例的Label1
属性。这就解释了为什么在添加Form1
时屏幕上会显示{em>第二个 frm1.Show();
实例。如果仔细查看第二个副本,您会看到它的标签显示正确的值,但该表单的原始副本保留其原始值。
相反,我假设您要做的是为屏幕上已显示的Label1
的现有实例设置Form1
属性。为此,您必须获得对现有表单对象的引用。
因此,这成为一个简单的问题“如何在两个对象(表单)之间传递数据”,这在Stack Overflow上已被无数次询问过。请参阅这些相关问题的答案:
答案 1 :(得分:1)
尝试使用单例设计模式,因为我认为问题出在您使用新的
时public class Form1Singleton {
private static final Form1Singleton INSTANCE = null;
// Private constructor prevents instantiation from other classes
private Form1Singleton () {
}
public static Form1Singleton getInstance()
{
if(INSTANCE ==null)
INSTANCE =new Form1Singleton();
return INSTANCE;
}
}
现在您只能轻松使用表单
private void button1_Click(object sender, EventArgs e)
{
Form1Singleton frm1 = Form1Singleton.getInstance();
frm1.Label1 = this.textBox1.Text;
this.Close();
}
我希望能解决你的问题
BR,
Mohammed Thabet Zaky
答案 2 :(得分:0)
最有可能的是:您实际执行的操作是在Form1
范围内创建Form2
的全新实例,而稍后在您的程序的控制流程中,Form1
的另一个实例是创造和展示。当然,在这种情况下,您不能指望您的标签设置正确。
最好是将Form1
和Form2
相互分离,而只是传递程序控制流中的数据。
答案 3 :(得分:0)
当你说this.close时,表示你为该实例设置的所有值都会无效。
您可以在此处使用delegate来设置表单值。
答案 4 :(得分:0)
MVP模式适用于此类场景,也可以分离UI和业务逻辑。
这个帖子很好参考: UI Design Pattern for Windows Forms (like MVVM for WPF)