是否有可用于判断是否已添加或从MDI父窗体中删除子窗体的事件?添加或删除带有子窗体的MDI窗体
回答
不,没有。您必须对Form进行子类化,并公开指定何时添加子项的特定事件,然后通过将子表单连接起来的方法来发送子窗体的所有附件,以及引发事件。
是的。在您的主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();
}
}
而当子窗体是既激活或取消该事件将触发。
连线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);
}
我意识到这是多年为时已晚但作为答案在这里帮我解决这个我虽然我会提到这一点,使用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); }
}
}
我最近想大致确定的时候有开,所以我可以显示有大量的面板“的事情要做”按钮就可以了,只有当没有孩子的形式开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();
}
}
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();
}
}
}
由于之前的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
}
}
}
// ...
}
是的,你可以很容易地检测到添加在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窗体中删除的子窗体。
希望这会帮助你。
- 1. MDI子窗体加载
- 2. Windows窗体中的MDI子窗体
- 3. MDI父窗体面板控件添加子窗体
- 4. C#窗体窗体:Mdi父窗体和子窗体问题
- 5. WinForms MDI子窗体
- 6. MDI子窗体C#
- 7. 需要打开MDI子窗体从非MDI子窗体
- 8. 我如何从子窗体发送数据到父母MDI窗体或父母MDI从C#中的子窗体?
- 9. 如何使用MDI父窗体制作mdi子窗体?
- 10. MDI子窗体不显示
- 11. Mdi子窗体单实例
- 12. Symfony的动态添加或删除子窗体
- 13. MDI窗体对接子窗口
- 14. 如何从另一个MDI子窗体关闭特定的MDI子窗体子窗体
- 15. 下范式创建mdi窗体,并在mdi窗体错误打开MDI子
- 16. MDI子窗体不允许其他子窗体获得焦点
- 17. 在另一个MDI父窗体中的MDI父窗体
- 18. C#将MDI父窗体的值传递给子窗体
- 19. 如何从子窗体更新MDI父窗体中的控件?
- 20. 如何使用主MDI父窗体上的MenuList打开MDI子窗体
- 21. 想从Windows MDI子窗体中删除图标
- 22. 如何在MDI父窗体中激活子窗体时禁用父窗体?
- 23. 如何从MDI子窗体(MDI应用程序)打开窗体对话框
- 24. 的Windows MDI子窗体标题栏
- 25. MDI子窗体的绘画问题
- 26. C中mdi父项中的子窗体#
- 27. MDI子窗体之间的偏移
- 28. .NET 3.5中的MDI窗体
- 29. WPF窗体+ MDI中的Winforms
- 30. 当MDI Child最大化时删除MDI容器窗体的默认MDI菜单
我怎么知道它是来还是去?只需检查孩子的名单,看看发件人是否在那里? – Malfist 2009-02-11 19:10:00
Humm,可能无法正常工作。如果我重新激活/聚焦一个打开的表单,它也会抛出该事件。 – Malfist 2009-02-11 19:11:12
我知道了,它是所有孩子的基类中的一个ID字段。 – Malfist 2009-02-11 19:14:12