2012-05-22 59 views
2

我有一個MDI父窗口,其中可以包含特定子項的多個實例,將其稱爲frmChild。現在,當從父點擊一個特定的控制,我需要得到有效frmChild和從frmChild調用特定的方法從父項調用特定MDI子項的方法

下面是什麼,我想實現的圖像(獲取活動的MDI子和調用從該類特定方法):

a busy cat http://i47.tinypic.com/aurv7.jpg

現在每個frmChild被實例化:

private void newFileToolStripMenuItem1_Click(object sender, EventArgs e) 
    { 
     frmNewDocument = new frmNewDocument(); 
     frmNewDocument.MdiParent = this; 
     frmNewDocument.Show(); 
    } 

當我想要調用從一個方法活躍frmChild,我想下面和我堅持:

private void saveFileToolStripMenuItem1_Click(object sender, EventArgs e) 
    { 
     /* get active MDI child*/ 
     Form frmActiveNewDocument = this.ActiveMdiChild;   

     /* make sure MDI child is a "New Document" type form */ 
     if (frmActiveNewDocument.GetType() == frmNewDocument.GetType()) 
     { 
      /* invoke a method from active frmChild here */ 
     } 
    } 

我仍然在學習OOP和相信這是一些原則。如果可以在文章中提到,那也會很棒。

**注意:我讀過干擾frmChild是解決此問題的最佳方法,因此主窗體不需要在每個frmChild中進行挖掘,因此我創建了一個frmChild使用的接口,它是:**

public interface NewFileFormInterface 
{ 
    void saveFile(); 
} 

現在,saveFile的()是我想從主,這是在frmChild實現調用的方法。

對這個問題和我可以研究的一些關鍵字的任何幫助將是偉大的。

TIA!

回答

2
frmNewDocument child = ActiveMdiChild as frmNewDocument; 
if (child != null) 
{ 
    child->saveFile(); 
} 

as關鍵字執行運行時間轉換。如果對象(在本例中爲ActiveMdiChild)爲空或不是as類型,則結果將爲空。

http://msdn.microsoft.com/en-us/library/cscsdfbt.aspx

您可能也有興趣閱讀: .Net Naming Convention Guidelines

+0

感謝您的回覆。雖然這有助於解決問題,但有沒有一種方法可以使用界面而不是實際的表單?對不起,如果這沒有意義,但我現在只是困惑。我想盡量保持一切儘可能鬆散。 – brazc0re

+1

是的,假設子窗體實現了該接口,那麼使用'NewFileFormInterface'而不是'frmNewDocument'。 – Tergiver

+0

完美工作。是的所有** frmNewDocument **類實現** NewFileFormInterface **感謝您的鏈接。我會給他們一個閱讀。 – brazc0re

1

試試這個:

if (ActiveMdiChild is frmNewDocument) 
{ 
    (ActiveMdiChild as frmNewDocument).saveFile(); 
} 
1

我知道這是舊的,但是這一直爲我工作。

在子代碼:

public void SaveFile() 
{ 
    // Some code goes here. 
} 

並且父代碼:

frmNewDocument child = this.ActiveMdiChild as frmNewDocument; 
if(child != null) 
{ 
    child.SaveFile(); 
} 

希望這可以幫助其他人誰是尋找一個可行的更簡潔的答案。

+0

這對我來說非常合適。感謝兄弟。 –

相關問題