重复创建窗体问题的引出
连续单击添加窗体按钮,通过普通的在按钮事件方法中创建窗体,显示窗体的后果是,我们会发现,相同的窗体会重复不断的弹出。代码如下:
//添加窗口事件方法 private void tsmiAddStudent_Click(object sender, EventArgs e) { FrmAddStudent objFrmAddStudent = new FrmAddStudent(); objFrmAddStudent.Show(); }
问题分析:事件单击,会动态的创建窗体,每次单击,都会新建窗体并显示,不关闭,则一直显示存在。
解决办法:将创建的窗体设置为静态,使之在内存中唯一存在,每次单击都调用内存中存在的对象。
解决代码如下:
1 //显示添加窗口 2 public static FrmAddStudent objFrmAddStudent = null;//设置为全局变量,以便其他窗体可以调用 3 private void tsmiAddStudent_Click(object sender, EventArgs e) 4 { 5 if (objFrmAddStudent == null)//没有窗体对象 6 { 7 objFrmAddStudent = new FrmAddStudent(); //创建窗体对象,new实例化对象 8 objFrmAddStudent.Show();//显示窗体 9 } 10 else//窗体已经存在了 11 { 12 objFrmAddStudent.Activate();//激活窗体,只能在最小化的时候起作用 13 objFrmAddStudent.WindowState = FormWindowState.Normal;//设置窗体为正常大小状态 14 } 15 }
通过上述方法,调试运行确实解决了重复创建窗体的问题,但是当关闭窗体后,再次单击按钮,发现窗体不能显示,端点调试没有问题,问题在哪呢?
虽说窗体已经关闭,但因为对象是静态的,窗体关闭,程序没退出前,此窗体对象一直存在内存中,只是显示不出来。为此,需要在窗体关闭的时候,将静态窗体对象手动设置为空。对该窗体添加FormClosed事件:该窗体UI→属性→事件→找到FormClosed→双击添加事件并进入事件方法。
代码如下:
1 //窗体关闭完执行的事件 2 private void FrmAddStudent_FormClosed(object sender, FormClosedEventArgs e) 3 { 4 FrmMain.objFrmAddStudent = null;//objFrmAddStudent对象在主窗体中声明 5 }
注意对objFrmAddStudent对象为全局静态对象的理解。