我想使用从代码(Form2)创建的表单来编辑主表单(Form1)。我这样做的方式是,当事件被触发时,新表单出现,一切正常,但我希望它能在按下按钮时编辑原始表单。我尝试过的代码是:
Form1 form1 = new Form1();
private void button1_Click(object sender, EventArgs e)
{
form1.startNewGame();
this.Hide();
}
顺便说一句,我意识到这是在创建一个新的表单实例,我想知道如何编辑已经存在的表单实例。
没有Form2的代码很难帮助你,但我会尽力的。不创建Form1的实例,而是向form2添加一个公共属性public Form1 PrimaryForm{get;set;}
,当您在form2中显示时,将该属性设置为this
解决方案是在初始化子窗体时将主窗体的引用传递给子窗体。然后,您可以通过引用设置主窗体的值。参见以下示例:
public class ChildForm1 : Form
{
// Fields
private MainForm _mainForm;
private bool _value1;
private bool _value2;
// Default constructor
public ChildForm1()
{
}
// Overloaded constructor that accepts a container of values
public ChildForm1(ValuesContainer values, MainForm mainForm)
{
_mainForm = mainForm;
_value1 = values.Value1;
_value2 = values.Value2;
//Set a main form value
_mainForm.Value = "This value was changed by ChildForm1."
}
}
public class ChildForm2 : Form
{
// Field
private bool _value3;
// Default constructor
public ChildForm2()
{
}
// Overloaded constructor that accepts a container of values
public ChildForm2(ValuesContainer values)
{
_value3 = values.Value3;
}
}
public class MainForm : Form
{
public string Value { get; set; }
// Default constructor
public MainForm()
{
}
// Simulated - Event method called when button is clicked for child form 1
public void CallChildForm1()
{
ValuesContainer values = new ValuesContainer();
// Set the values from the main form
values.Value1 = true;
values.Value2 = true;
// Call the child form while passing in the container of values that we just populated.
ChildForm1 childForm = new ChildForm1(values);
childForm1.Show();
}
// Simulated - Event method called when button is clicked for child form 2
public void CallChildForm2()
{
ValuesContainer values = new ValuesContainer();
// Set the value from the main form
values.Value3 = true;
// Call the child form while passing in the container of values that we just populated.
ChildForm2 childForm = new ChildForm2(values);
childForm2.Show();
}
}
// Simple data object or container used to transfer information between complex objects such as forms and controls.
// These are also known as data classes or data transfer objects (DTOs)
public class ValuesContainer
{
public bool Value1 { get; set; }
public bool Value2 { get; set; }
public bool Value3 { get; set; }
}
这可能不是最佳实践,但却是最简单的方法;
1) 在Form1中添加一个公共方法来编辑您想要的
2) 在Form2中添加对Form1 类型的引用
3) 实例化Form2并设置InstanceOfForm2.ReferenceToForm1 = this;
4) 在Form2的事件处理程序中,使用引用调用公共方法,如
//inside some event handler
this.ReferenceToForm1.MyPublicMethodThatEditsTheDisplay();
需要记住的一件事是Form1和其他对象一样只是一个对象。唯一阻止你在任何地方编辑它的是它的属性的访问级别(显然不能访问私有字段)和缺乏引用。除此之外的一切都是意见和"最佳实践"的问题——如果你想在任何地方编辑,请公开字段/提供公共方法并传递/设置引用。