2009-02-11 79 views

回答

2

不,沒有。您必須對Form進行子類化,並公開指定何時添加子項的特定事件,然後通過將子表單連接起來的方法來發送子窗體的所有附件,以及引發事件。

6

是的。在您的主MDI表格上,連接到MdiChildActivated事件。

像這樣:

public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      this.MdiChildActivate += new EventHandler(Form1_MdiChildActivate); 
     } 

     void Form1_MdiChildActivate(object sender, EventArgs e) 
     { 
      MessageBox.Show("Activated"); 
     } 

     private void addToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
      Form form2 = new Form2(); 
      form2.MdiParent = this; 
      form2.Show(); 
     } 
    } 

而當子窗體是既激活或取消該事件將觸發。

+0

我怎麼知道它是來還是去?只需檢查孩子的名單,看看發件人是否在那裏? – Malfist 2009-02-11 19:10:00

+0

Humm,可能無法正常工作。如果我重新激活/聚焦一個打開的表單,它也會拋出該事件。 – Malfist 2009-02-11 19:11:12

+0

我知道了,它是所有孩子的基類中的一個ID字段。 – Malfist 2009-02-11 19:14:12

4

連線MdiChildActivate事件並保留一個已識別孩子的列表。當一個新表格被激活時,還會連接FormClosed事件。

private List<Form> ChildFormList = new List<Form>(); 

private void MyForm_MdiChildActivate(object sender, EventArgs e) 
{ 
    Form f = this.ActiveMdiChild; 

    if (f == null) 
    { 
     //the last child form was just closed 
     return; 
    } 

    if (!ChildFormList.Contains(f)) 
    { 
     //a new child form was created 
     ChildFormList.Add(f); 
     f.FormClosed += new FormClosedEventHandler(ChildFormClosed); 
    } 
    else 
    { 
     //activated existing form 
    } 
} 

private void ChildFormClosed(object sender, FormClosedEventArgs e) 
{ 
    //a child form was closed 
    Form f = (Form)sender; 
    ChildFormList.Remove(f); 
} 
1

我意識到這是多年爲時已晚但作爲答案在這裏幫我解決這個我雖然我會提到這一點,使用MdiChildren陣列工作正常.NET 4,你需要做的唯一的事情就是檢查如果表格正在處理或處置以告知是否關閉。

即:

private void frmContainer_MdiChildActivate(object sender, EventArgs e) 
    { 
     tabWindows.RefreshLayout(this.MdiChildren.ToList()); 
    } 

    public void RefreshLayout(List<Form> forms) 
    { 
     this.nextButtonLeft = 1; 
     panel1.Controls.Clear(); 
     foreach (Form frm in forms) 
     { 
      if (!(frm.Disposing || frm.IsDisposed)) { addButton(frm); } 
     } 
    } 
-2

我最近想大致確定的時候有開,所以我可以顯示有大量的面板「的事情要做」按鈕就可以了,只有當沒有孩子的形式開NO MDIchildren 。 (只是探索一個設計理念)。

我最終的解決方案非常簡單 - 只要MdiChildActivate事件確定有一個子窗體打開,就向父窗體添加一個計時器並啓動計時器。

private void MyForm_MdiChildActivate(object sender, EventArgs e) 
    { 
     this.panel_Tools.Visible = false; 
     if (this.MdiChildren.Count() == 1) 
     { 
      this.timer_WindowsCounter.Start(); 
     } 
     else 
     { 
      this.timer_WindowsCounter.Stop(); 
     } 

    } 


    private void timer_WindowsCounter_Tick(object sender, EventArgs e) 
    { 
     if (this.MdiChildren.Count() == 0) 
     { 
      this.panel_Tools.Visible = true; 
      this.timer_WindowsCounter.Stop(); 
     } 
    } 
0
private void closeToolStripMenuItem1_Click(object sender, EventArgs e) 
    { 
     List<Form> fm = this.MdiChildren.ToList(); 
     if(fm!=null && fm.Count>0) 
     { 
      foreach(Form lfm in fm) 
      { 
       lfm.Close(); 
      } 
     } 
    } 
0

由於之前的MDI子窗體實際上被關閉,因此沒有足夠的信息來檢測,如果MDI子窗體實際上是激活或關閉MdiChildActivate事件被激發,我選擇了不同的方法解決問題。

我發現ParentChanged事件在MDI子窗體關閉時觸發。

public class MdiParentForm : Form 
{ 
    // ... 

    private Form CreateMdiChildForm() 
    { 
     var form = new MdiChildForm 
     form.ParentChanged += MdiFormParentChangedHandler; 
     form.MdiParent = this; 
     return form; 
    } 

    private void MdiFormParentChangedHandler(object sender, EventArgs args) 
    { 
     var form = sender as Form; 
     if (form != null) 
     { 
      if (form.MdiParent != null) 
      { 
       // MDI child form will activate 
       // ... your code here 
      } 
      else 
      { 
       // MDI child form will close 
       form.ParentChanged -= MdiFormParentChangedHandler; 
       // ... your code here 
      } 
     } 
    } 

    // ... 
} 
1

是的,你可以很容易地檢測到添加在MDI窗體中的表單。

當由的IsMdiContainer設置爲true標記ParentForm作爲MdiContainer,所述ParentForm.ControlAdded凸起,用於將「MDICLIENT」控制到母體形式事件。因此增加MDICLIENT於母公司MDI形式,我們可以提高ControlAdded事件的MDICLIENT控制像下面,

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值設置爲父窗體時,MdiClient的控件添加事件將增加

void MdiClient_ControlAdded(object sender, ControlEventArgs e) 
{ 

} 

因此,通過使用上面的方法,你可以知道加入MDI形成父子MDI形式。像這樣,您可以爲MdiClient控件添加ControlRemoved事件,以瞭解從MDI窗體中刪除的子窗體。

希望這會幫助你。