在打开事件中直接检测是否已经打开此MDI窗体
// 是否已经打开了?(用循环来判断) foreach (Form childrenForm in this.MdiChildren) { //检测是不是当前子窗体名称 if (childrenForm.Name == "子窗体名称") { //是的话就是把他显示 childrenForm.Visible = true; //并激活该窗体 childrenForm.Activate(); return; } } //下面是打开子窗体 Form1 childrenForm = new Form1(); childrenForm.MdiParent = this; childrenForm.Show(); childrenForm.WindowState = FormWindowState.Maximized;-------------------------------------------------------
这样也行: frmPurvey frmp = new frmPurvey();//创建要打开的窗体对象 bool isOpen = true; foreach (Form frm in this.MdiChildren)//遍历已打开的MDI { if (frm.Name == frmp.Name) { frmp.Activate();//赋予焦点 frmp.WindowState = FormWindowState.Maximized;//设置窗体最大化 isOpen = false; break; } } if (isOpen)//如果没有找到相同窗体则打开新窗体 { frmp.MdiParent = this;//设置父窗体 frmp.Show(); }
利用.net Framework 2.0新加的Application.OpenForms集合解决:
bool isOpen = false; //初始为未打开状态 Form2 frm2= new Form2(); foreach (Form frm in Application.OpenForms) //遍历已打开窗口 { if (frm.name == frm2.name) { //如果此窗口已打开 isOpen = true; break; } } if (!isOpen) //如果窗体未打开,显示窗体 { frm2.Show(); } 开心了一会儿,又发现:当打开其它窗体后,再想使用这个Form2时,按按钮无法激活它了,郁闷。 加上 else { frm2.Activate(); } 没用,还是无法激活,又在网上找了好久,还是没找到合用的。没法了,不能偷懒了。 分析一下发现,我在 foreach 之前创建了窗体对象:Form2 frm2= new Form2(); 然后下面代码再进行判断。那不就成了每次Activate()时都是对一个新建的对象进行激活吗,这样肯定与原来已经打开的窗体无关啊,原因应该在这儿。 修改代码为: bool isOpen = false; //初始为未打开状态 foreach (Form frm in Application.OpenForms) //遍历已打开窗口 { if (frm is Form2) { //如果此窗口已打开,则激活 frm.Activate(); isOpen = true; break; } } if (!isOpen) //如果窗体未打开,创建窗体对象并显示 { Form2 frm2= new Form2(); frm2.Show(); } OK,成功!!!