重复创建窗体问题的引出

  连续单击添加窗体按钮,通过普通的在按钮事件方法中创建窗体,显示窗体的后果是,我们会发现,相同的窗体会重复不断的弹出。代码如下:

        //添加窗口事件方法
private void tsmiAddStudent_Click(object sender, EventArgs e)
{
FrmAddStudent objFrmAddStudent = new FrmAddStudent();
objFrmAddStudent.Show();
}

  问题分析:事件单击,会动态的创建窗体,每次单击,都会新建窗体并显示,不关闭,则一直显示存在。

  解决办法:将创建的窗体设置为静态,使之在内存中唯一存在,每次单击都调用内存中存在的对象。

    解决代码如下:

 //显示添加窗口
public static FrmAddStudent objFrmAddStudent = null;//设置为全局变量,以便其他窗体可以调用
private void tsmiAddStudent_Click(object sender, EventArgs e)
{
if (objFrmAddStudent == null)//没有窗体对象
{
objFrmAddStudent = new FrmAddStudent(); //创建窗体对象,new实例化对象
objFrmAddStudent.Show();//显示窗体
}
else//窗体已经存在了
{
objFrmAddStudent.Activate();//激活窗体,只能在最小化的时候起作用
objFrmAddStudent.WindowState = FormWindowState.Normal;//设置窗体为正常大小状态
}
}

  通过上述方法,调试运行确实解决了重复创建窗体的问题,但是当关闭窗体后,再次单击按钮,发现窗体不能显示,端点调试没有问题,问题在哪呢?

  虽说窗体已经关闭,但因为对象是静态的,窗体关闭,程序没退出前,此窗体对象一直存在内存中,只是显示不出来。为此,需要在窗体关闭的时候,将静态窗体对象手动设置为空。对该窗体添加FormClosed事件:该窗体UI→属性→事件→找到FormClosed→双击添加事件并进入事件方法。

  代码如下:

 //窗体关闭完执行的事件
private void FrmAddStudent_FormClosed(object sender, FormClosedEventArgs e)
{
FrmMain.objFrmAddStudent = null;//objFrmAddStudent对象在主窗体中声明
}

  注意对objFrmAddStudent对象为全局静态对象的理解。

c#桌面应用程序--窗体重复创建问题的更多相关文章

  1. Android应用程序窗体设计框架介绍

    在Android系统中,一个Activity相应一个应用程序窗体.不论什么一个Activity的启动都是由AMS服务和应用程序进程相互配合来完毕的.AMS服务统一调度系统中全部进程的Activity启 ...

  2. WPF简介:VS创建桌面应用程序

    1.简介 1/ 什么是WPF WPF,Windows Presentation Foundation也,译过来就是"Windows呈现基础",你看它的目的非常明确,就是用来把数据& ...

  3. C#入门---2、C#装备知识(C#创建桌面程序的时候创建的是什么应用程序)

    C#入门---2.C#装备知识(C#创建桌面程序的时候创建的是什么应用程序) 一.总结 一句话总结: WPF应用程序:来替代 WindowsFroms 来创建桌面应用程序 1.什么是控制台程序 Con ...

  4. Android应用程序窗体View的创建过程

    View类是android中非常重要的一个类.view是应用程序界面的直观体现,我们看到的应用程序界面就能够看作是View(视图)组成的. 那么我们应用程序的界面是怎么创建的呢,也就是应用程序的Vie ...

  5. Android 在安装完成界面,点击打开应用程序。在应用程序点击home键,再从桌面打开程序导致产生多个实例或者说程序被重复打开

    Android 在安装完成界面,点击打开应用程序.在应用程序点击home键,再从桌面打开程序导致产生多个实例或者说程序被重复打开. etong_123的专栏 - 博客频道 - CSDN.NET htt ...

  6. nodejs+chromium 创建桌面应用程序

    直接用nodejs+javascript+html+css也可以创建桌面应用程序啦,前端开发的同学应该都比较感兴趣. 生成的应用程序自带nodejs环境和chrome浏览器环境. github的ato ...

  7. Cocos2dx集成于windows桌面窗口程序的步骤

    2D游戏需要做编辑器,而编辑器总是希望可以复用游戏中的逻辑来运行场景试看效果. 对于cocos2dx开发的程序,这个需求可以描述为: 实现一种方法,在桌面窗口程序中的某个控件上显示cocos2dx的场 ...

  8. VS生成桌面应用程序

    1.简介 1/ 什么是WPF WPF,Windows Presentation Foundation也,译过来就是"Windows呈现基础",你看它的目的非常明确,就是用来把数据& ...

  9. Visual C++ Windows 桌面应用程序样例(摘抄)

    //================================== //Windows应用程序框架结构(例子) //参考:<Visual C++宝典>陈国建等编著 //======= ...

随机推荐

  1. python第八篇:十分钟学会Flask

    什么是Flask Flask是一个基于Python并且依赖于Jinja2模板引擎和Werkzeug WSGI服务的一个微型框架 Flask中包含一个轻量级的web 服务器主要用于在开发阶段测试使用 F ...

  2. POJ 1679 The Unique MST:次小生成树【倍增】

    题目链接:http://poj.org/problem?id=1679 题意: 给你一个图,问你这个图的最小生成树是否唯一. 题解: 求这个图的最小生成树和次小生成树.如果相等,则说明不唯一. 次小生 ...

  3. Android退出应用最优雅的方式(改进版)

    Android退出应用最优雅的方式(改进版)(转) 我们先来看看几种常见的退出方法(不优雅的方式) 一.容器式 建立一个全局容器,把所有的Activity存储起来,退出时循环遍历finish所有Act ...

  4. Python--基础文件读写操作

    1,open(),对文件进行读写操作之前,要先打开文件,获取文件的句柄: 懒人专用方法,文件打开后不用关闭 with open(r'somefile.txt','r+',encoding='utf8' ...

  5. Android多点触控技术

    1 简介 Android多点触控在本质上需要LCD驱动和程序本身设计上支持,目前市面上HTC.Motorola和Samsung等知名厂商只要使用电容屏触控原理的手机均可以支持多点触控Multitouc ...

  6. [原]NYOJ-公约数和公倍数 -40

    大学生程序代写 //http://acm.nyist.net/JudgeOnline/problem.php?pid=40 公约数和公倍数 时间限制:1000 ms  |  内存限制:65535 KB ...

  7. bzoj 3572: [Hnoi2014]世界树 虚树

    题目: Description 世界树是一棵无比巨大的树,它伸出的枝干构成了整个世界.在这里,生存着各种各样的种族和生灵,他们共同信奉着绝对公正公平的女神艾莉森,在他们的信条里,公平是使世界树能够生生 ...

  8. HDOJ1022(模拟栈)

    Train Problem I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  9. mysql基础之三:char与varchar区别,varchar(M)能存多少

    char与varchar区别 char (13)长度固定, 如'1234567890' 存储需要空间 10个字符; varchar(13) 可变长 如'1234567890' 需要存储空间 11字符; ...

  10. java注解的基本知识

    1: 注解:Annotation是一种应用于类.方法.参数.变量.构造器及包生命中的特殊修饰符,是一种由JSR-175标准选择用来描述代码的元数据. Java中如下的4种注解,专门负责新注解的创建: ...