如何使用从C#中的主窗体创建的窗体编辑主窗体



我想使用从代码(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和其他对象一样只是一个对象。唯一阻止你在任何地方编辑它的是它的属性的访问级别(显然不能访问私有字段)和缺乏引用。除此之外的一切都是意见和"最佳实践"的问题——如果你想在任何地方编辑,请公开字段/提供公共方法并传递/设置引用。

最新更新