C#利用泛型,避免子窗体重复开启

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值