簡體   English   中英

C#MDI父級檢測MDI Child何時關閉?

[英]C# MDI Parent detect when MDI Child is closing?

我試圖在MDI父級上檢測到我的MDI子窗體何時關閉,並做出相應的反應。 在MDI子女關閉之前,MDI家長不應做任何事情。 這是我的代碼,我不確定我做錯了什么,但我添加的表單關閉事件方法永遠不會被調用...

如果不明顯,則以下代碼位於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;
        }
    }

謝謝你的幫助!

雖然這並沒有真正解決您所指的問題,但從用例來看,您可能需要考慮將驗證表單打開為模式對話框而不是MDI子對象。

您可以使用表單的ShowDialog()方法執行此操作,您現在可以使用Show() 請記住, ShowDialog()如果將它們分配給另一個表單上的按鈕,也可以返回DialogResult

通過將IsMdiContainer設置為true將ParentForm標記為MdiContainer時,會引發ParentForm.ControlAdded事件以將“MdiClient”控件添加到父窗體。 因此,當將MdiClient添加到父MDI表單時, 我們可以為MdiClient控件引發ControlAdded事件,如下所示,

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

我們需要像下面一樣提高MdiClient.ControlAdded,

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

      }

默認情況下, MDI子窗體將以父窗體的形式添加到MdiClient的控件集合中 因此,當將ChildForm.MdiParent值設置為Parent表單時, MdiClientControlAdded事件將引發

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;
        }
}

在上面的內容中,當子表單添加到父MDI表單中時,會引發MdiClient_ControlAdded方法。 因此,通過為子表單引發FormClosing和FormClosed事件,您可以輕松檢測子表單是否已關閉。

也許,只是也許,你有一個兒童形式隱藏不關閉。 嘗試掛鈎VisibleChanged,看看會發生什么。

此外,FormClosing將允許您取消關閉,並且FormClosed不會為您提供該選項。

當您可以調用MDI Parent到MDI Child的事件處理程序時,為什么要執行這么多操作?

假設我的孩子被激活或停用時我想做某些事情。 您只需要聲明一些MDI Parent的事件處理程序(例如SetupToolStripMenu_PlantMasterRecipe )並在其中提及您想要執行的操作。 通過這種方式,您可以從MDI Parent控制MDI Child的每個對象行為。

這里objB是我的Child表單,我在MDI Parent中編寫這段代碼:

objB.MdiParent = this;

objB.Activated += SetupToolStripMenu_PlantMasterRecipe;

objB.Deactivate += DisposeToolStripMenu;

objB.Show();

在mdiparent上做一個公共功能

public void MakeMenuVisible()
{
MainMenu.visible = true;
}

然后在childform上你可以像這樣運行這個函數

private void ChildForm_FormClosed(object sender, FormClosedEventArgs e)
{
//Cast MdiParent to Mainform
((mainform)this.MdiParent).MakeMenuVisible();  
}

不要使用Closed活動。 而是使用FormClosing事件:

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;
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM