C#中运用集合使窗体不重复被打开

本文介绍如何利用集合来管理并发打开的窗体,确保同一类型窗体仅打开一个实例,实现多对一的高效窗口管理。通过代码示例展示主窗口与子窗口之间的交互与状态维护。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 要想打开的窗体是唯一的,我们一般会考虑到单例模式来解决,其实学习了集合后,我们还可以通过集合来解决。大致方法是这样:将打开的窗体名称列表存储到集合中,如果再打开新的窗体,我们可以到集合里面查询,如果已经有了这个窗体名称就不打开窗体而只是调出相应窗体,没有的话就打开新窗体。这个方法对于解决类似QQ聊天窗体很有效。因为QQ聊天打开的是同一种窗体,如果是单例模式来做的话就不能实现同时和多个人聊天,而用集合就可以做到同时与多个人聊天,但是同一个聊天对象的窗体只打开一个。好了,下面我们来实现这个效果。

刚刚已经说明,使窗体不被重复打开,就要把已经打开的窗体保存下来进行轮寻,我们可以用ArrayList来保存已经打开的窗体实例,当new新的form时,对ArrayList中的Object进行逐个的比较,可以对form的name进行比较,也可以对form的Type进行比较(前者的效率比后者低)。虽然这个方法比较笨,但却十分有效,具体代码见下:

MainForm.cs

public static ArrayList FormList = new ArrayList();

private void button1_Click(object sender, System.EventArgs e)

{

bool OnlyForm = true;

foreach( Form f in FormList )

{

if( f is MyForm )

{

f.Activate();

OnlyForm = false;

}

}

if( OnlyForm )

{

MyForm temp = new MyForm ();

temp.Owner = this;

FormList.Add( temp );

temp.Show();

}

}

MyForm.cs

private void MyForm_Closing(object sender, System.ComponentModel.CancelEventArgs e)

{

MainForm.FormList.Remove( this );

}

首先在MainForm中new一个static的FormList,然后在打开窗体时在FromList中轮寻,找到与此类型相一致的就Activate(),否则就new一个新的form,并且加到FormList中,在form退出时千万别忘记把自己从FormList中退出来,就是用Remove(this)就可以了。

以上这个方法可以使当前不同类型的窗体同时运行,但是相同类型的文件只能打开一次。要是想让相同类型的窗体也可以运行,那么就要指定一个唯一的窗体标识,再轮寻这个标识。代码如下:

private bool CheckFormActivate(string Name )

{

try

{

foreach( Form f in FormList )

if( f.Name.Equals(Name) )

{

f.Location = new Point( 0 , 0 );

f.Activate();

return false;

}

return true;

}

catch( Exception ex )

{

MessageBox.Show( ex.Message );

return true;

}

}

private void button1_Click(object sender, System.EventArgs e)

{

if(CheckFormActivate(“OnlyIdentification”))

{

MyForm temp = new MyForm ();

MyForm.Name = “OnlyIdentification”;

temp.Owner = this;

FormList.Add( temp );

temp.Show();

}

}

其中OnlyIdentification为你自己设定的窗体的唯一标识字符串并且在new窗体时把此字符串赋给form的Name属性。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值