2009-02-11 82 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窗体中删除的子窗体。

希望这会帮助你。