所以,我有两种形式 - 一种是开放的,另一种基本上只是第二种形式的弹出窗口。第二个表单打开,里面有一个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();
}
}
显然,这没效果。
答案 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();