zoukankan      html  css  js  c++  java
  • C#WinForm 窗体单例模式 反射单例

    做了个mdi窗体 原以为指定一下MDIParent就可以了

    没想到多次点击会出现多个窗体的现像 所以用到了单例模式

    做法是这样的(学习出处:连接)

    1.在子窗体声明一个子窗体类型的私有静态变量 并把子窗体构造函数设为 私有 不私有也行不过单例调用时不要用new方法

    private static frmAACar fc = null;
    private frmAACar()
          {
              InitializeComponent();
    
           }

    2.声明一个public 静态函数 判断变量fc。不存在或只是关掉了 就new出来 

       public static frmAACar CreateSingle()
            {
                if (fc == null || fc.IsDisposed)
                {
                    fc = new frmAACar();
                }
    
                return fc;
            }

    3.调用

     frmAACar f = frmAACar.CreateSingle();
                f.Show();

    4.多个窗体使用泛型 (约定了 必须有个无参的构造函数 调用时对应的窗体构造函数应为public )

    //这里窗体是dotnetBar里的窗体继承来的,普通窗体继承Form就可以了  
    public class GenericSingleton<T> where T : DevComponents.DotNetBar.Metro.MetroForm, new()
        {
            private static T t = null;
    
            public static T CreateSingleton()
            {
                if (t == null || t.IsDisposed)
                { t = new T(); }
    
                return t;
            }
        
        }

    调用

    frmAACar fc=  GenericSingleton<frmAACar>.CreateSingleton();
                fc.MdiParent = this;
                fc.Show();

    反射单例

     /// <summary>
            ///通过反射创建子窗体
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void button1_Click(object sender, EventArgs e)
            {
                Type t = Assembly.Load("TestForm").GetType("TestForm.Form4");
                Form fc = (Activator.CreateInstance(t) as Form);
                if (!ShowChildForm(fc.Text, this))//通过name判断会更好一些 毕竟name不会重名
                {
                    fc.MdiParent = this;
                    fc.Show();
                }
                else
                {
                    fc.Dispose();
                }
            }
    
            /// <summary>
            /// 判断子窗体是不是存在
            /// </summary>
            /// <param name="sonText"></param>
            /// <param name="MdiParentForm"></param>
            /// <returns></returns>
            public static bool ShowChildForm(string sonText, Form MdiParentForm)
            {
    
                foreach (var mdic in MdiParentForm.MdiChildren)
                    if (mdic.Text == sonText)
                    {
                        mdic.BringToFront();
                        return true;
                    }
    
                return false;
            }
  • 相关阅读:
    Oracle Time Model Statistics(时间模型统计)
    IBAction:IBOutlet:注意事项
    函数何时值传递,何时指针,何时引用传递总结
    更新客户配置文件
    UML的通用机制(三)
    数学之路-数据分析进阶-区间预计与如果检验(2)
    android应用开发-从设计到实现 3-3 Sketch静态原型设计
    测试MongoDB的自动分片
    详解MongoDB中的多表关联查询($lookup) (转)
    mongodb移除分片和添加分片(转)
  • 原文地址:https://www.cnblogs.com/SoftWareIe/p/8709618.html
Copyright © 2011-2022 走看看