2010-10-02 106 views
0

問題是我需要從其他窗體訪問不同的窗體元素,或者例如從某些子窗口訪問MdiContainer窗體菜單並使用它進行一些操作。如何正確實現這樣的功能?我現在正在使用Windows窗體。從MDI中的子項訪問父窗體的元素

下面的一些示例代碼演示了我是如何嘗試去做的。

Form1的(是MDI容器)

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void menu2ToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     Form2 chWin = new Form2(this); 
     chWin.Show(); 
    } 

    public void disableMenu() 
    { 
     menuStrip1.Enabled = false; 
    } 
} 

窗體2(是Form1的孩子)

public partial class Form2 : Form 
{ 
    private Form1 parent; 

    public Form2(Form1 parent) 
    { 
     InitializeComponent(); 
     MdiParent = parent; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     parent.disableMenu(); 
    } 
} 

和異常:未設置爲實例 對象引用一個對象

試過google上它,但其實nothi對我的場合很有幫助。

提前致謝!

回答

5

您正試圖訪問尚未初始化的成員。在Form2的構造函數中你只需設置的MdiParent屬性,但是你忘記了此行:

this.parent = parent; 

而且,你不必到Form1傳遞到窗體2的構造。

private void menu2ToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    Form2 chWin = new Form2(this); 
    chWin.MdiParent = this; 
    chWin.Show(); 
} 

然後在窗體2可以通過鑄造的MdiParent到Form1調用Form1的方法:

private void button1_Click(object sender, EventArgs e) 
{ 
    ((Form1)MdiParent).disableMenu(); 
} 

雖然,而不是這樣做,你可以通過顯示窗體2之前設置的MdiParent避免這種可能應該先創建一個接口:

public interface IMenuHandler 
{ 
    void DisableMenu(); 
} 

然後讓Form1實現此接口並將其傳遞給Form2的構造函數。那麼整個實施的Form2應該是這樣的:

public partial class Form2 : Form 
{ 
    private IMenuHandler menuHandler; 

    public Form2(IMenuHandler handler) 
    { 
     InitializeComponent(); 
     this.menuHandler = handler; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     menuHandler.DisableMenu(); 
    } 
} 

這樣,你的窗體2不直接依賴於Form1上,它是更容易爲你改變任何的形式。

0

您還可以得到父窗體的方法是這樣的:

((MyClass)ParentForm).foo(); 

從子窗體的方法

相關問題