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);
}
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
}
}
}
// ...
}
private void Form1_MdiChildActivate(object sender, EventArgs e)
{
//form is new mdi child
Form form = this.MdiChildren.Last();
form.FormClosed += SenderForm_Close;
}
private void SenderForm_Close(object sender, EventArgs e)
{
//form is new closed mdi child
Form form = sender as Form;
}
9条答案
按热度按时间mzmfm0qo1#
是。在主MDI窗体上,连接到MdiChildActivated事件。
就像这样:
并且该事件将在激活或停用子窗体时激发。
gmol16392#
连接
MdiChildActivate
事件并保留一个已识别子级的列表。当激活新窗体时,也连接FormClosed
事件。omtl5h9j3#
不,没有。您必须建立Form的子类别(Subclass),并公开特定的事件,以指出子表单何时加入,然后透过连接子表单的方法来传送子表单的所有附件,并引发事件。
1wnzp6jl4#
我意识到这已经晚了很多年,但是,由于这里的答案帮助我解决了这个问题,我想我会提到,使用.net 4中的MdiChildren数组可以很好地工作。您唯一需要做的事情是检查表单是否正在处理或正在处理,以判断它是否关闭。
例如:
r55awzrz5#
是的,你可以很容易地检测到MDI表单中添加的表单。
当通过将IsMdiContainer设置为true将ParentForm标记为MdiContainer时,将引发ParentForm.ControlAdded事件,以便将“MdiClient”控件添加到父窗体。因此,当将MdiClient添加到父MDI窗体时,**我们可以引发MdiClient控件的ControlAdded事件,**如下所示:
我们需要像下面这样引发MdiClient.controlAdded,
默认情况下,MDI子窗体被添加到MdiClient的控件集合中的父窗体中。因此当将ChildForm.MdiParent值设置为父窗体时,MdiClient的ControlAdded事件将引发。
因此,通过使用上述方法,您可以了解添加到父MDI窗体中的子MDI窗体。类似地,您可以为MdiClient控件添加ControlRemoved事件,以了解从MDI窗体中删除的子窗体。
希望这对你有帮助。
cnjp1d6j6#
ztyzrc3y7#
由于MdiChildActivate事件是在MDI子窗体实际关闭之前触发的,因此没有足够的信息来检测MDI子窗体是否实际被激活或关闭,因此我选择了一种不同的方法来解决该问题。
我发现当MDI子窗体关闭时,它会触发ParentChanged事件。
4xrmg8kj8#
我有你的答案:D
首先检测到新的
MdiChild
处于活动状态,然后:dced5bon9#
我最近想确定大约什么时候没有打开MDI子窗体,以便只有在没有打开子窗体的情况下才能显示一个面板,上面有许多“要做的事情”按钮。(只是探索一个设计思想)。
我最终的解决方案非常简单--向父窗体添加一个计时器,并在MdiChildActivate事件确定有1个子窗体打开时启动计时器。