C# 对另一个仍处于打开状态的窗体调用方法?

C# 对另一个仍处于打开状态的窗体调用方法?,c#,winforms,visual-studio,C#,Winforms,Visual Studio,所以,我有两个表单——一个是开放的,另一个基本上只是第二个表单上的一个弹出窗口。第二个表单打开时,里面有一个maskedtextbox,还有保存和取消按钮——我想保存以更改第一个表单上的字段 据我所知,我必须使用第二种形式的弹出窗口,因为我想要完成的事情并不像我可以放在MessageBox中的东西那么简单——如果有其他选择,我洗耳恭听 我一直在尝试: 表格1: public partial class Form1 : Form { public void ChangeLabel()

所以,我有两个表单——一个是开放的,另一个基本上只是第二个表单上的一个弹出窗口。第二个表单打开时,里面有一个maskedtextbox,还有保存和取消按钮——我想保存以更改第一个表单上的字段

据我所知,我必须使用第二种形式的弹出窗口,因为我想要完成的事情并不像我可以放在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();
   }
}

显然,这没有起作用。

您需要创建一个新的构造函数来接收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();

第二种形式根本不需要知道第一种形式。让它了解它会使其代码复杂化,并且不必要地将其与该表单绑定。让另一个表单知道主表单的内部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;

您需要获取现有实例。的可能副本