C#MDI窗体避免重复打开子窗体的问题

本文介绍了一种在WinForm应用中使用MDI窗体时,如何避免子窗体重复打开的方法。通过检查已打开的子窗体实例并激活它们,而不是创建新的实例,从而提高应用程序的效率。

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

在做winform程序的时候,需要用到MDI窗体,在网上看了一些避免子窗体重复打开的问题。

现在我有一个MDI窗体formfather以及两个子窗体form1和form2。
在父窗体上弄两个按钮,点击按钮1的时候显示form1,点击按钮2的时候显示form2,再一次点击的时候显示form1,而不是一个新的form1。
下面是我的代码

private void toolStripButton1_Click(object sender, EventArgs e)
        {
			Form1 f1 = new Form1();
            bool isOpened = false;//定义子窗体打开标记,默认值为false
            foreach (Form f in this.MdiChildren)//循环MDI中的所有子窗体
            {
                 if (f1.Name == f.Name)//若该子窗体已被打开
                 {
                      f.Activate();//激活该窗体
                      isOpened = true;//设置子窗体的打开标记为true
                      f1.Dispose();//销毁formChild实例
                      break;
                 }
            }
            if (!isOpened)//若该子窗体未打开,则显示该子窗体
            {
                f1.MdiParent = this;
                f1.FormBorderStyle = FormBorderStyle.None;//设置子窗体无边框
                f1.Dock = DockStyle.Fill;//设置子窗体填满MDI窗体
                f1.Show();
      }

private void toolStripButton2_Click(object sender, EventArgs e)
        {
            Form2 df = new Form2 ();
           
            bool isOpened = false;//定义子窗体打开标记,默认值为false
            foreach (Form f in this.MdiChildren)//循环MDI中的所有子窗体
            {
                if (df.Name == f.Name)//若该子窗体已被打开
                {
                    f.Activate();//激活该窗体
                    isOpened = true;//设置子窗体的打开标记为true
                    df.Dispose();//销毁formChild实例
                    break;
                }
            }
            if (!isOpened)//若该子窗体未打开,则显示该子窗体
            {
                df.MdiParent = this;
                df.FormBorderStyle = FormBorderStyle.None;
                df.Dock = DockStyle.Fill;
                df.Show();
            }
        }

看别人的代码在代码块写激活窗体时用的是f1.Activate,这样是无法成功再次激活得窗体的,后来想了下,可能因为f1是new的窗体,而我们要打开的应该是已经是已经存在的f1窗体,即是我们foreach到的f窗体才是。

自己的想法,不知道对不对,记录在此供自己以后查看,也希望大家指正

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值