2017-07-17 94 views
0

我有一個WinForms應用程序,它將不同的窗體作爲MDI子窗體處理,並將它們作爲標籤打開。與打開每個表單的一個實例相關的所有內容實際上都是正確處理的,但是當我拋出「配置文件更改事件」時,我遇到了問題。如何在WinForms中獲取MDI Child的原始表單實例?

我想在關閉它之前訪問每個子項的實例上的屬性,但我只是訪問表單,而不是原始對象表單實例本身。

實際代碼:

private void ProfileChanged() 
{ 
    foreach (var child in this.MdiChildren) 
    { 
     child.Close(); 
    } 
} 

所需的代碼:

private void ProfileChanged() 
{ 
    foreach (var child in this.MdiChildren) 
    { 
     child.Status ... 
     child.Close(); 
    } 
} 

任何想法?非常感謝。

回答

3

您應該將child變量轉換爲您自定義的Form類型。我想你有一個基本形式,所有的孩子形式繼承,對嗎?如果不是,你應該有一個基類。

之後,代碼應該很簡單:

private void ProfileChanged() 
{ 
    //if you want to use Linq 
    foreach (var child in this.MdiChildren.Cast<YourCustomBaseClass>) 
    { 
     child.Status ... 
     child.Close(); 
    } 
    //if you don't want to use Linq 
    foreach (var child in this.MdiChildren) 
    { 
     var myCustomChild = child as YourCustomBaseClass; 
     if (myCustomChild == null) continue; //if there are any casting problems 
     myCustomChild.Status ... 
     myCustomChild.Close(); 
    } 

} 
+0

感謝您的回覆。我終於需要做一個this.MdiChildren.Select(frm => frm作爲frmBaseEntity)而不是.Cast :) – Gonzo345

0

你可以投你的孩子Formxxx ...其中Formxxx是每個窗體 的類型。例如:

public partial class Form1 : Form 
{ 
    public int Status { get; set; } 
    public Form1() 
    { 
     InitializeComponent(); 

    } 

    private void ProfileChanged() 
    { 
     foreach (var child in this.MdiChildren) 
     { 
      if (child is Form1) 
      { 
      (child as Form1).Status = 1; 
       child.Close(); 
      } 
     } 

    } 
}