2015-04-06 97 views
-3

我想使用从其代码(Form2)创建的窗体来编辑主窗体(Form1)。我这样做的方式是,当事件被触发时,新的表单出现,并且一切正常,但我需要它,以便当按下按钮时,原始表单被编辑。我曾尝试的代码是这样的:如何使用从C#中的主窗体创建的窗体编辑主窗体

Form1 form1 = new Form1(); 
    private void button1_Click(object sender, EventArgs e) 
    { 
     form1.startNewGame(); 
     this.Hide(); 
    } 

顺便说一句,我意识到,这是创建窗体的新实例,我想知道如何编辑表格的已经存在的实例。

+0

你能告诉我们使用'Form2'的代码吗? – CoderDennis

+0

单词“编辑”似乎没有多大意义。你的意思是“变得可见”还是“恢复”? –

+0

@HansPassant我的意思是我需要改变表单的一部分。我需要更改一个名为startNewGame的公共类。 – Omar

回答

0

没有Form2的代码很难帮助你,但我会尝试。而不是创建Form1的实例中,增加一个公共属性FORM2 public Form1 PrimaryForm{get;set;},当你舒窗口2设置属性this

+0

另一种选择是将相关数据作为'Form2'上的属性,并在从Form1中显示它作为结果后使用它们。 – SimpleVar

0

一个解决办法是主窗体的引用传递到子窗体时,子窗体被初始化。然后可以通过引用来设置mainform的值。见下面的例子:

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; } 
} 
0

这可能不是最好的做法,但是最简单的方法来做到这一点。这里是步骤;

1)在Form1中添加一个公共方法编辑任何你想要

2)在窗体2添加引用键入Form1

3)实例化窗体2,并在设置InstanceOfForm2.ReferenceToForm1 = this;

4)窗体2的事件处理程序使用参考打电话给你的公共方法像

//inside some event handler 
this.ReferenceToForm1.MyPublicMethodThatEditsTheDisplay(); 

有一点要记住的是,Form1的仅仅是一个对象LIK é任何其他。阻止你在任何你选择的地方进行编辑的唯一因素就是它的属性的访问级别(显然不能触及私有字段)以及缺乏引用。如果你想从任何地方进行编辑,公开该领域/提供公开方法并传递/设置参考,那么除此之外的所有事情都是意见和“最佳实践”的问题。

相关问题