欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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的构造函数不能含有参数,按照有参数写的话会报错。

相关标签: c#桌面开发 c#

上一篇: 百度地图

下一篇: C# 窗体控件