2010-12-06 6 views
4

MDIの子フォームが閉じられたときに、MDIの親を検出しようとしています。 MDIの親が閉じるまで、MDIの親は何もしないでください。ここで私のコードですが、私は間違って何をしているのか分かりませんが、私が追加したフォーム閉鎖イベントメソッドは、決して呼び出されていません...C#MDI親がMDI Childを閉じるときに検出しますか?

次のコードはMDI親クラスにあります明らかだ。

private void keyValidation() 
    { 
     if (Properties.Settings.Default.Unlock == true) 
      return; 
     else 
     { 
      menu.Enabled = false; 
      statusStrip.Enabled = false; 

      ValidationForm vf = new ValidationForm(); 
      vf.MdiParent = this; 
      vf.Show(); 
      vf.FormClosed += new FormClosedEventHandler(validationForm_FormClosed); 
     } 
    } 

    void validationForm_FormClosed(object sender, FormClosedEventArgs e) 
    { 
     MessageBox.Show("Got here"); 
     if (Properties.Settings.Default.Unlock == true) 
     { 
      menu.Enabled = true; 
      statusStrip.Enabled = true; 
     } 
    } 

ありがとうございました!

+0

また、誰かが実行して違いを説明できますか?そして私はこれを上記のために使うべきですか? – CODe

+0

'Form Closing'イベントは' Closed 'の前に呼び出されます。 'Closing'イベントを使って、例えば文書を保存する必要があるかどうかを知ることができます。 –

+0

明確化のおかげで、私はそれがフォームを保持していたものを保存する最後の溝の努力だと思います。 – CODe

答えて

1

これは、実際にあなたが参照している問題には対処していませんが、ユースケースから判断すると、MDI子ではなくモーダルダイアログとして検証フォームを開くことを検討することができます。

Show()のフォームのShowDialog()メソッドを使用してこれを行うことができます。 ShowDialog()は、他のフォームのボタンに割り当てる場合は、DialogResultを返すこともできます。

0

多分、あなたは閉じていない隠れた子供のフォームを持っているかもしれません。 VisibleChangedをフックして何が起こるかを見てください。

また、FormClosingは閉じる処理をキャンセルし、FormClosedはそのオプションを提供しません。

0

イベントを使用しないでください。Closedイベント。その代わり、FormClosingイベントを使用します。MdiContainerとしてParentFormをマークするとtrueにIsMdiContainerを設定することにより、

private void frmMain_FormClosing(object sender, FormClosingEventArgs e){ 
    if (MessageBox.Show("Are you sure you want to Exit", "Confirmation", MessageBoxButtons.YesNo,MessageBoxIcon.Information) == System.Windows.Forms.DialogResult.No) { 
    e.Cancel = true; 
    } 
} 
0

を、ParentForm.ControlAddedイベントは、親フォームに「MDICLIENT」コントロールを追加するための提起します。だから、私たちは以下のようなようMdiClient.ControlAddedを調達する必要がある、私たちは以下のようなようMDICLIENT制御ためControlAddedイベントを発生させることができ、親MDIフォームに

void Form1_ControlAdded(object sender, ControlEventArgs e) 
     { 
      if(e.Control is MdiClient) 
       e.Control.ControlAdded += MdiClient_ControlAdded; 

     } 

public ParentForm() 
    { 
    InitializeComponent(); 
    this.ControlAdded += Form1_ControlAdded; 
    this.IsMdiContainer = true; 

をMDICLIENTを追加するとき

既定では、MDI子フォームは、親フォームのMdiClientのコントロールコレクションに追加されます。したがって、ChildForm.MdiParent値を親フォームとして設定すると、MdiClientのControlAddedイベントはになります。

void MdiClient_ControlAdded(object sender, ControlEventArgs e) 
{ 
    if (e.Control is Form) 
     { 
      var form = e.Control as Form; 
      form.FormClosing += form_FormClosing; 
      form.FormClosed += form_FormClosed; 
     } 
} 

上記のMdiClient_ControlAddedメソッドは、子フォームが親MDIフォームに追加されるときに発生します。子フォームのFormClosingイベントとFormClosedイベントを呼び出すことで、子フォームが閉じられているかどうかを簡単に検出できます。

0

なぜMDI ParentのイベントハンドラをMDI Childに呼び出すことができるのですか?

子供が有効または無効になるときに、特定のことをしたいとします。 MDI Parentのイベントハンドラを宣言するだけで(たとえばSetupToolStripMenu_PlantMasterRecipeなど)、その中にいくつかのロジックを記述する必要があります。このようにして、MDI ParentのMDI Childの各オブジェクト動作を制御することができます。ここで

objBは私の子フォームであると私はMDI親の内部で、このコードを書いています:フォームを使用して、フォームを閉じる対閉じたとき

objB.MdiParent = this; 

objB.Activated += SetupToolStripMenu_PlantMasterRecipe; 

objB.Deactivate += DisposeToolStripMenu; 

objB.Show(); 
関連する問題