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

时间:2010-12-26 10:49:55

标签: c# .net winforms forms

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

有人有什么想法吗?

5 个答案:

答案 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的另一个实例是创造和展示。当然,在这种情况下,您不能指望您的标签设置正确。

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

这个帖子很好参考: UI Design Pattern for Windows Forms (like MVVM for WPF)