建立多窗口程序是比较经常面对的一种问题。如果说只是简单的实例化一个窗口类,例如这样
Form2 form2 = new Form2()
form2.show();
这样虽然说程序继续运行,但是有一个潜在的问题就是,原先Application .Run(第一个窗口类)这条语句的第一个窗口依然继续运行,只是不在前台,但更为重要的确实这个窗口类依然可以通过进行用户的交互操作(当然首先要把它调到前台)。这样回产生一些潜在的不稳定因素。例如,这个第一个窗口类中的一个button 事件处理中的代码就是
Form2 form2 = new Form2()
form2.show();
只要你不断的点击这个button,就有很多个form2窗口会出现(每个窗口是不同的对象,虽然属于同一各类)这种情况当然是大家不想见到的。
如何处理呢?
第一种,使用form.showdiaglog()方法.
这样,这个窗口以对话框的方式显现(这里的含义就是,调用这个对话框窗口的窗体不会产生用户交互),虽然是以对话框的方式显示,但只是说这种显示的方式类似于对话框方式,而并不是说这个窗口好像那个普通的MessageBox.Show(..)那样的对话框。这种方法可以放回
DiaglogResult枚举,你可以捕获这些枚举来产生相应处理。
第二种,使用一个更新处理方法,简单的讲是根据不同的情况,动态的生成主窗口中要显示的控件等等,这个方法异常麻烦,不推荐,有兴趣的朋友可以看看微软的IbuySpy这个范例,vs.net自带。不过说来这种方式其实只用到了一个窗口。
第三种,参看代码
MainForm ......//Mainform运行中
.......
要调用Form2了,此时我们将Form2的构造函数写成这种方式
Form2(Form parentForm)
{
this.parentform = parentForm; //parentform是Form2中的一个保存Form的私有变量。
parentForm.Hide();
...........................//自己的其他构造代码
}
这样Form2一旦运行,MainForm自然就不见了( 因为 parentForm.Hide(); )
当然,将MainForm隐藏自然要有把它显示的处理,例如,Form2处理完毕后,可以在
关闭事件中添加如下代码
{
this.parentform.Show();
}
这样,Form2一关后,MainForm自然就出来了。
这种方法适合比较简单的多窗口运行程序,但是整个流程自己要控制清楚。
第四中,建立一个全局静态类,例如一个叫做Global的类。
然后里面有这么些代码
public class Global
{
private static Form2 mform2;
private static Form3 mform3;
private void Global
{//不需实例化}
public static GetForm2
{
get
{
if(mform2 == null)
{
form2 = new Form2
form2.show();
}
else
{
form2.show();
}
}
}



}这样,谁要是调用Form2就直接使用这个Global.GetForm2即可。
这种方法可能比前面几种方法都好一点。
第五种,Form缓存管理类。
主要内容就是一个HashTable,然后进行一些管理Form的缓存,动态创建,动态删除,动态指定现实等等。由于今天时间不够了,过两天我继续说说这个Form缓存管理类。

浙公网安备 33010602011771号