C#利用泛型,避免子窗体重复开启
程序员文章站
2022-03-04 12:34:39
...
private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.ShowDialog();
}
这样写会导致打开from2界面时,from1操作不了
private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.Show();
}
使用Show()可以打开子窗口,同时也可以操作父窗口,但是这样写同时也会导致,在父窗口多次点击产生多个窗口的情况,所以这个时候就要判断
1、在主界面的类中定义内部全局变量
private static Form1 newF;
2、在button函数中定义
private void button1_Click(object sender, EventArgs e)
{
if (newF == null || newF.IsDisposed)
{
newF = new Form1();
newF.Show();
}
else
{
newF.WindowState = FormWindowState.Normal;
newF.Activate();
}
}
即如果检测到Form1窗体不存在的话就new一个,这样的话就能保证最多存在一个Form1的实例。
但是如果每个button再写一个这样的函数的话就很麻烦而且冗余。
于是想到了泛型,便有了下面的代码,定义一个泛型函数
public static void Formshow<T>(ref T newForm) where T : Form,new()
{
if (newForm == null || newForm.IsDisposed)
{
newForm = new T();
newForm.Show();
}
else
{
newForm.WindowState = FormWindowState.Normal;
newForm.Activate();
}
}
使用
private void button1_Click(object sender, EventArgs e)
{
Formshow<Form1>(ref newF);
}
注意ref,如果没加ref标识符会导致newF无法赋值,就会每点一次都实例化一个窗体。
然后要注意的是Form1的构造函数不能含有参数,按照有参数写的话会报错。
推荐阅读