c#判断打开的窗体:MDI和非MDI

简介:

1,MDI类型

在打开事件中直接检测是否已经打开此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();
}

 

2,非MDI

利用.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,成功!!!


本文转自 huohe2009 51CTO博客,原文链接:http://blog.51cto.com/zhaojie/904565


相关文章
|
6月前
|
Java 数据库 C#
C#winforms实现windows窗体人脸识别
C#winforms实现windows窗体人脸识别
|
关系型数据库 MySQL C#
C# winform 一个窗体需要调用自定义用户控件的控件名称
给用户控件ucQRCode增加属性: //二维码图片 private PictureBox _pictureBoxFSHLQrCode; public PictureBox PictureBoxFSHLQrCode {   get { return _pictureBoxFSHLQrCode; }   set { this.pictureBoxFSHLQrCode = value; } } 在Form1窗体直接调用即可: ucQRCode uQRCode=new ucQRCode(); ucQRCode.PictureBoxFSHLQrCode.属性= 要复制或传给用户控件上的控件的值
71 0
|
1月前
|
设计模式 程序员 C#
C# 使用 WinForm MDI 模式管理多个子窗体程序的详细步骤
WinForm MDI 模式就像是有超能力一般,让多个子窗体井然有序地排列在一个主窗体之下,既美观又实用。不过,也要小心管理好子窗体们的生命周期哦,否则一不小心就会出现一些意想不到的小bug
109 0
|
1月前
|
API C# Windows
【C#】在winform中如何实现嵌入第三方软件窗体
【C#】在winform中如何实现嵌入第三方软件窗体
95 0
|
4月前
|
开发框架 数据可视化 C#
|
6月前
|
C#
C#如何实现窗体最小化到托盘
C#如何实现窗体最小化到托盘
76 0
|
6月前
|
JavaScript Linux C#
【傻瓜级JS-DLL-WINCC-PLC交互】1.C#用windows窗体控件创建.net控件
【傻瓜级JS-DLL-WINCC-PLC交互】1.C#用windows窗体控件创建.net控件
143 0
|
6月前
|
C# Windows
C#安装“Windows 窗体应用(.NET Framework)”
C#安装“Windows 窗体应用(.NET Framework)”
192 0
|
11月前
|
C# 数据安全/隐私保护
C# 窗体之间参数互相传递的两种方法与使用
C# 窗体之间参数互相传递的两种方法与使用
|
11月前
|
C# Kotlin
C#is、as关键字及获取当前活动窗体的实例
这篇日志记录一下C#中is关键字及as关键字的用法。 Is :判断检查对象是否与给定类型兼容 As :将对象转换为指定类型(强转),就跟(int )这样的用法是一样的。 获取当前窗体的活动子窗体。
56 0