在另一个仍然打开的表格上调用方法?

时间:2013-12-19 20:48:09

标签: c# winforms visual-studio

所以,我有两种形式 - 一种是开放的,另一种基本上只是第二种形式的弹出窗口。第二个表单打开,里面有一个maskedtextbox,另外还有Save和Cancel按钮 - 我想保存以更改第一个表单上的字段。

据我所知,我必须为我的弹出窗口使用第二种形式,因为我想要完成的事情并不像我可以放在MessageBox中那么简单 - 如果还有其他选项,我都是耳朵。

我一直在尝试:

表格1:

public partial class Form1 : Form
{
   public void ChangeLabel()
   {
       label1.Text = StaticVariables.labelString;
   }
}

表格2:

public partial class Form2 : Form
{
   private void changeForm1_Click(object sender, EventArgs e)
   {
      StaticVariables.labelString = textBox.Text; 
      Form1 frm = new Form1();
      frm.ChangeLabel();
   }
}

显然,这没效果。

2 个答案:

答案 0 :(得分:6)

第二种形式根本不需要知道第一种形式。让它知道它使代码变得复杂,并且不必要地将它与该形式联系起来。知道主要表单的内部UI组件的另一种形式更糟糕;如果你这样做,那么改变主表单显示数据的方式会破坏另一个表单。只需让弹出窗口具有一个属性,该属性表示允许在外部设置/获取它的值:

public partial class Form2 : Form
{
    public string Result //TODO give better name
    {
        get { return textBox.Text; }
    }
    public string DisplayText //TODO give better name
    {
        get { return label.Text; }
        set { label.Text = value; }
    }
}

然后主窗体可以设置显示值,显示窗体,并获取结果值:

Form2 popup = new Form2();
popup.DisplayText = "asdf";
popup.ShowDialog();
myField = popup.Result;

答案 1 :(得分:3)

您需要创建一个接收Form1实例的新构造函数,并将其存储为Form2中的字段。然后,当你想要更改标签时,请使用传入的实例。我正在通过手机接听,所以当我到达我的办公桌时,我可以详细说明代码。

但是这里发生的是你正在创建一个新的Form1并设置值。

private Form1 _form1;

...

public Form2(Form1 form1)
{
    _form1 = form1;
}

...

private void changeForm1_Click(object sender, EventArgs e)
{
    StaticVariables.labelString = textBox.Text; 
    _form1.ChangeLabel();
}

然后最后,当您启动Form2时:

var form2 = new Form2(this);
form2.Show();