2017-07-17 9 views
0

私は、さまざまなフォームをMDI子として扱い、それらをタブとして開くWinFormsアプリケーションを持っています。各フォームのインスタンスを1つだけ開くことに関連するすべては、実際には正しく処理されますが、私は「プロファイル変更イベント」を発行するときに問題に直面しています。WinFormsでMDI子の元のフォームインスタンスを取得するにはどうすればよいですか?

私はそれぞれの子のインスタンス上のプロパティにアクセスしたいと思いますが、それを閉じる直前にですが、元のオブジェクトフォームインスタンス自体ではなくフォームにアクセスしています。

実際のコード:

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 as 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(); 
      } 
     } 

    } 
} 
関連する問題