在C#中解决窗体重复创建的问题

文章目录

一、问题描述

在C#Windows窗体应用中,我们经常遇到这样的问题

当我们触发一个窗口命令时,比如下方:

我连续点击其中一个命令,会出现多个同样的窗口:

我们的目标是,不管点击多少次,都只出现一次;

二、具体程序说明

第一步我们将该窗体(多从点击重复出现的窗体)名称定义为公共全局变量:

复制代码
public static 窗体名称a1 随意变量名称b1= null;

这行代码表示创建了一个可以公共访问的静态变量b1 ,可以在应用程序的任何地方通过 a1.b1来访问,最开始这个变量没有引用任何实例,所以它的值是 null。

第二步就是写触发窗体弹出的按钮的命令:

复制代码
 private void 按钮名称_Click(object sender, EventArgs e)
        {
            if (b1== null)  //如果窗体不存在,创建新的窗体
            {
                b1 = new a1();
               b1.Show();
            }
            else    //如果窗体已经存在,适使用原来的窗体,不创建新窗体
            {
                b1.Activate();//激活智能在最小化的时候其作用
                b1.WindowState = FormWindowState.Normal;
            }

        }
  1. if (b1 == null) { ... }:

    这是一个条件判断,检查静态变量 b1 是否为 null。如果是 null,说明之前没有创建过 a1 窗体的实例。

  2. b1 = new a1();:

    如果 b1 是 null,这行代码创建 a1 类的一个新实例,并将其赋值给变量 b1。

  3. b1.Show();:

    显示 b1 窗体。如果之前窗体没有被创建,现在将其显示出来。

  4. else { ... }:

    如果 b1 不是 null,则进入这个 else 块,说明窗体已经创建过了。

  5. b1.Activate();:

    这行代码调用 b1 窗体上的 Activate 方法。如果窗体已经存在但不是当前激活的窗口,这将使它成为活动窗口。如果窗体被最小化或者被其他窗口覆盖了,这个方法将确保用户注意到这个窗体。

  6. b1.WindowState = FormWindowState.Normal;:

    设置 objFrmAddStudent 窗体的 WindowState 属性为 FormWindowState.Normal。这确保窗体是在正常的状态下显示而不是最小化或最大化。

    当用户点击这个菜单项时,这个事件处理程序会检查是否已经存在一个 a1 窗体实例。如果不存在,则创建一个新的实例并显示它。如果已经存在,那么它将确保窗体被激活并且显示在正常状态下。这样可以避免打开多个相同的窗体实例,并且确保窗体对用户可见且可用。

但是这样仍然有一个问题,那么就是当我们关闭这个窗口时,这个窗体并没有完全消失,只不过是我们看不到了,于是我们需要在这个窗体的属性页找到FormClosed双击:

编写以下程序:

复制代码
  a1.b1 = null;//当窗体关闭时,将窗体对象清理掉
相关推荐
xiaoye-duck8 小时前
《C++ 项目:手写大模型接入 SDK》Gemini接口设计(上):初始化、全量响应实现和测试
开发语言·网络·c++·语言模型
nice_lcj52010 小时前
Java Lambda 表达式入门:怎么写、怎么用、常用方法有哪些
java·开发语言·后端·面试
码农小河6610 小时前
基于SSM+JSP+MySQL的在线医疗服务系统的设计与实现
java·开发语言·mysql
nice_lcj52015 小时前
ThreadLocal 入门:它是怎么隔离数据的、为什么会导致内存泄漏
java·开发语言·后端·面试·并发编程·内存泄漏·threadlocal
紧跟先前的步伐15 小时前
Go AI Agent 实战 28|Agent 的预算、超时与停止条件
开发语言·人工智能·后端·ai·golang
bksczm16 小时前
InnoDB 行格式详解:DYNAMIC / COMPACT / COMPRESSED / REDUNDANT
java·开发语言·数据库
春涧草茶16 小时前
慢就是快16-1协程
开发语言·前端·python
Dovis(誓平步青云)17 小时前
启元 T1 Pro 人机相声搭档:语音-触摸双通道的启元机器人节奏引擎设计
开发语言·前端·javascript·microsoft·交互
做科研的周师兄17 小时前
【R语言实战】MixSIAR 氢氧同位素水源解析全流程:从混合空间校验到贝叶斯 MCMC 收敛诊断(后附完整代码)
java·大数据·开发语言
.痞老板.18 小时前
java ee--计算机是如何工作的
java·开发语言·java-ee