如何在C#中从另一个表单更新一个表单上的标签?

我想从Form2更新Form1标签。 所以这就是我所拥有的:

 // 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()是不必要的。

有人有主意吗?

button1_Click方法中,您实际上是在创建Form1实例并设置该新实例的Label1属性。 这就解释了为什么在添加frm1.Show();时屏幕上会显示Form1第二个实例frm1.Show(); 。 如果仔细查看第二个副本,您会看到它的标签显示正确的值,但该表单的原始副本保留其原始值。

相反,我假设您要做的是为已经显示在屏幕上的Form1现有实例设置Label1属性。 为了做到这一点,您将不得不获得对现有表单对象的引用。

因此,这成为一个简单的问题“如何在两个对象(表单)之间传递数据”,这在Stack Overflow上已被无数次询问过。 查看这些相关问题的答案:

  • 在C#中的两个窗体之间进行通信
  • 在两个窗体之间传递值
  • C#beginner help,如何将子项中的值传递回父表单?
  • 在c#winforms应用程序中将值从一个表单发送到另一个表单

尝试使用单例设计模式,因为我认为问题出在你使用new时

 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; } } 

现在您只需1个表单即可轻松使用表单

 private void button1_Click(object sender, EventArgs e) { Form1Singleton frm1 = Form1Singleton.getInstance(); frm1.Label1 = this.textBox1.Text; this.Close(); } 

我希望能解决你的问题

BR,

Mohammed Thabet Zaky

最有可能的:你实际做的是在Form2的范围内创建一个全新的Form1实例,稍后在程序的控制流程中创建并显示另一个Form1实例。 当然,在这种情况下,您不能指望您的标签设置正确。

最好的方法是将Form1Form2相互分离,而只是传递程序控制流程中的数据。

当你说this.close时,表示你为该实例设置的所有值都会无效。

您可以在此处使用委托来设置表单值。

MVP模式适用于此类型的senario,也可以分离UI和业务逻辑。

这个线程是很好的参考: Windows窗体的UI设计模式(如WPF的MVVM)