做了个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;
}

C#WinForm 窗体单例模式 反射单例的更多相关文章

  1. python使用__new__创建一个单例模式(单例对象)

    #单例模式:使一个类只产生一个对象.他们的id地址都指向同一个内存地址 第一步:理解谁创建了对象 # 单例模式# 首先明白,我们在创建一个类的对象的时候,其实是调用的这个类的父类,即继承object, ...

  2. Python:Day25 成员修饰符、特殊成员、反射、单例

    一.成员修饰符 共有成员 私有成员,__字段名,__方法 - 无法直接访问,只能间接访问 class Foo: def __init__(self,name,age): self.name = nam ...

  3. GOF设计模式之1:单例设计模式

    1.单例设计模式核心作用: 保证一个类只有一个实例,并且提供了访问该实例的全局访问点 2.常见应用场景: window的任务管理器 项目中读取配置文件一般也是一个单例模式 数据库连接池的设计也是采用单 ...

  4. 【Java】设计模型-五种单例模型

    一. 什么是单例模式 只需要某个类同时保留一个对象,不希望有更多对象,此时,我们则应考虑单例模式的设计. 单例模式的主要作用是保证在Java程序中,某个类只有一个实例存在. 单例模式有很多好处,它能够 ...

  5. Java 单例(Singleton)模式

    一.什么是单例模式: 单例模式是一种确保了一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.被实例化的类称为单例类. 二.单例模式的特点: 单例类只有一个实例. 单例类必须自行创建自己唯一的 ...

  6. javaWeb项目中到底什么是单例,多例

    你用杯子喝可乐,喝完了不刷,继续去倒果汁喝,就是单例.你用杯子喝可乐,直接扔了杯子,换个杯子去倒果汁喝,就是多例. 数据库连接池就是单例模式,有且仅有一个连接池管理者,管理多个连接池对象. 1. 什么 ...

  7. DevExpress Winform使用单例运行程序方法和非DevExpress使用Mutex实现程序单实例运行且运行则激活窗体的方法

    原文:DevExpress Winform使用单例运行程序方法和非DevExpress使用Mutex实现程序单实例运行且运行则激活窗体的方法 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA ...

  8. Winform 窗体单例

    有窗体Form1和窗体Form2,单击Form1上按钮,只弹出一个Form2. Form2里自定义一个方法,里面判断是否弹出Form2,没有时弹出Form2. public static Form2 ...

  9. C# 单例模式和窗体的单例打开方法

    第一种最简单,但没有考虑线程安全,在多线程时可能会出问题,不过俺从没看过出错的现象,表鄙视我…… public class Singleton{    private static Singleton ...

随机推荐

  1. python学习笔记:网络请求——requests模块

    上面讲过的urllib模块太麻烦了,还有一个比较方便的模块,就是requests模块,好用到你怀疑人生·^_^,一定要会哦 需要安装,pip install requests即可,下面是request ...

  2. Django框架(三十)—— 使用Vue搭建前台

    目录 vue的使用 一.创建vue项目 二.pycharm开发vue项目 1.安装vue.js插件 2.运行vue项目 三.vue项目的目录结构 四.vue的使用 1.创建新的组件 2.显示数据 3. ...

  3. 转 loadrunner11 录制 chrome 浏览器

    chrome不设置代理的原始状态 图1 [LoadRunner]解决LR11无法录制Chrome浏览器脚本问题   LoadRunner录制脚本时,遇到高版本的IE.FireFox,或者Chrome浏 ...

  4. 15-python基础-元组

    1.元组的定义 Tuple(元组)与列表类似,不同之处在于元组不能修改. 元组表示多个元素组成的序列. 元组在python开发中,有特定的应用场景. 用于存储一串信息,数据之间使用,分割 元组用()定 ...

  5. TurtleBOT3

    ubuntu更换源 sudo cp /etc/apt/sources.list /etc/apt/sources_backup.list sudo gedit /etc/apt/sources.lis ...

  6. url传送图片的base64编码给web客户端

    base64编码图片: #python3.6 import base64 with open("./aa.jpg", "rb") as f: data = ba ...

  7. 函数高阶(函数,改变函数this指向,高阶函数,闭包,递归)

    一.函数的定义方式 1.函数声明方式 function  关键字(命名函数) 2.函数表达式(匿名函数) 3.new  Function( ) var  fn = new  Function(‘参数1 ...

  8. 2、Python 接口框架

    common:存放通用的工具类 config:存放配置文件信息 result:存放result.html run_suite.py:最后执行的文件 1.excel_util:利用 openpyxl 进 ...

  9. cmake README.TXT

    { cmake .//在当前路径下构建项目 cmake --build .//在当前路径下生成项目(默认为debug)//cmake --build . --config release//在当前路径 ...

  10. redis常用命令建议

    1. Redis查看当前所有的key KEYS * 2. 查看当前redis的配置信息 CONFIG GET * 3. MISCONF Redis is configured to save RDB ...