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 é任何其他。阻止你在任何你選擇的地方進行編輯的唯一因素就是它的屬性的訪問級別(顯然不能觸及私有字段)以及缺乏引用。如果你想從任何地方進行編輯,公開該領域/提供公開方法並傳遞/設置參考,那麼除此之外的所有事情都是意見和「最佳實踐」的問題。

相關問題