单件模式+打开窗体+窗体构造函数参数

利用单件模式避免重复打开窗体,窗体为无参数构造函数模式。

注:该博客中有自动关闭窗体的方法

http://www.cnblogs.com/zfanlong1314/p/3567308.html

为了打开窗体时传入参数,可以改变方法的传递参数,本人修改后代码如下

///
<summary>
///
泛型实现窗体实例单件化
///
</summary>
///
<typeparam name="T">窗体类</typeparam>
public static class Singleton<T>
where T : Form//, new()

{
private static T
instance = default(T);

private static readonly object lockHelper = new
object();

///
<summary>
///
获取窗体的唯一实例
///
</summary>

/// <param name="args">构造函数参数</param>
///
<returns></returns>

public static T Instance(object[] args)
{

if (instance == null)

{

lock (lockHelper)

{

if (instance == null)

{

instance =
(T)Activator.CreateInstance(typeof(T), args);

//加上实例关闭事件,窗体就会自动回收,即instance=null;
instance.FormClosed
+= new FormClosedEventHandler(DestroyForm);

}

}

}
return
instance;

}
///
<summary>
///
当窗体关闭时将Instance置空
///
</summary>

/// <param name="sender"></param>

/// <param name="e"></param>
private static void
DestroyForm(object sender, FormClosedEventArgs e)
{

instance = default(T);

}

这样修改可以避免重复打开窗体,且能传递参数。但是如果一个窗体有多个构造函数时就只能打开一个实例。

搜到如下解决方案,但是对func<T>
方法不熟悉,不知道如何用,待后续研究

http://bbs.csdn.net/topics/360165634

该帖子的最后解决方法是:将你的G_<T>的构造函数中传入一个匿名委托Fun<T>参数,由外部的匿名委托来返回一个对象的实例,这样你就不必关心构造函数是否带参数的情况。代码如下

public class SingletonGenerator<T>
{

private object locker;
private bool initialized =
false;
private Func<T> func;
private T
instance;

public SingletonGenerator(Func<T> funcParam)

{
initialized = false;
func =
funcParam;
locker = new object();
}

public T Value
{
get

{
if (!this.initialized)

{
lock (this.locker)

{
if (!this.initialized)

{
this.instance =
this.func();
this.initialized =
true;
}
}

}

return this.instance;
}

}
}

单件模式+打开窗体+窗体构造函数参数

时间: 2024-11-09 00:53:31

单件模式+打开窗体+窗体构造函数参数的相关文章

winform修改、打开窗体、构造函数传值

制作登录窗体: 制作一个登陆窗体,实现点击按钮关闭此窗体并打开另一个窗体 直接在按钮点击事件中,实例化一个想要打开的窗体 使用show方法打开,并把登陆窗体的visible属性改为false Form1 f1 = new Form1(); f1.Show(); this.Visible = false; 另:这样写的话再关闭第二个窗口的时候,程序并没有完全结束,第一个登陆窗口仍然存在,虽然不显示 因此我们用到构造函数传值,并且这样可以实现打开唯一窗口(不重复打开同一个窗口) 构造函数传值: 构造

winform打开唯一窗体、构造函数传值

制作登入窗体: 制作一个登陆窗体,实现点击按钮关闭此窗体并打开另一个窗体 直接在按钮点击事件中,实例化一个想要打开的窗体 使用show方法打开,并把登陆窗体的visible属性改为false Form1 f1 = new Form1(); f1.Show(); this.Visible = false; 另:这样写的话再关闭第二个窗口的时候,程序并没有完全结束,第一个登陆窗口仍然存在,虽然不显示 因此我们用到构造函数传值,并且这样可以实现打开唯一窗口(不重复打开同一个窗口) 构造函数传值: 构造

【2017-04-27】布局及容器控件、打开多窗体、构造函数传值、打开唯一窗口

一.布局和容器控件 1.布局属性 - Anchor  控件定位锁死在那个位置,根据哪个位置锁死. - Dork     填充满.填充上下左右. - Location  位置. 2.容器控件 - Panel  相当于html中的div. - FlowLayoutPanel  继承自Panel,多了流式布局功能 - GroupBox    继承自Panel,多了一个标题,有小虚线. - TabControl  选项卡 选项卡修改标题,用选项卡的TabPages属性,在每个选项卡标题对应的Text属性

构造函数传值 和仅打开唯一窗体

登陆窗体: 制作一个登录窗口Form1,要求登陆后打开一个新窗口,隐藏该窗口(注:关闭新窗口时,该窗口不会关闭,程序未结束,需要用到构造函数传值来关闭新窗口的同时,关闭该登录窗口.) Form2 f2 = new Form2(this, user);//横线部分与下方讲的传值相对应 f2.Show(); this.Visible = false; 构造函数传值 将登陆窗口中输入的用户名传值给Form2窗体,Form2关闭时同时将Form1关闭 Form1 F1 = null; Users Use

对话框控件 MessageBox.Show()用法补充 打开新窗体的3中模式

(一)对话框控件 1.fontcolor 字体设置 属性:showcolor 可以调节字体颜色 showApply 控制显示应用按钮 例:设置一个文本框,点击按钮,文本框中的颜色字体发生改变 DialogResult dr = fontDialog1.ShowDialog(); if (dr == DialogResult.OK) { //设置文本框中的字体属性 richTextBox1.Font = fontDialog1.Font; //设置文本框中字体的颜色 richTextBox1.Fo

AB窗体互传参数

一.找了好几个,都不靠谱,不是说不靠谱,自己感觉太繁琐 二.父窗口传子窗口好传,有两种方法(自己认为比较简单的方法哈), 1第一种方法:在子窗口中新建一个属性:再新建一个方法,当然方法就是把属性个窗体控件(例如textbox)显示出来: 然后在父窗口中实例化子窗口,然后调用用实例化的子窗口属性,给属性赋值:然后再调用实例化子窗口的方法:然后显示子窗口 2 第二种方法 因为你要传递参数,必须要有动作,及运行程序,在父窗口打开子窗口的时候就可以在初始化中给子窗口赋值(WORD中的搜索功能,你选中一段

多窗体、窗体传值、打开唯一窗体操作

一.打开多子窗口 在控件中实例化要打开的窗体,再调方法show 例:在按钮中打开f2窗体 form2 f2=new form2() f2.show() 二.构造函数传值 1.在实例化中添加参数,展示信息类型,打开窗体类型 2.要打开窗体中构造函数接受 三.打开窗口唯一 1.实例化要打开窗口,并放到类型集合中 2.判断窗口是否在集合中,不在打开 3.构造函数传父级窗口 4.子级窗口关闭时调删除集合中子级窗口方法 例:

Winform 主窗体更换 构造函数传值

制作登录窗体: 制作一个登陆窗体,实现点击按钮关闭此窗体并打开另一个窗体 直接在按钮点击事件中,实例化一个想要打开的窗体 使用show方法打开,并把登陆窗体的visible属性改为false Form1 f1 = new Form1(); f1.Show(); this.Visible = false; 登陆界面 namespace WindowsFormsApplication1 { public partial class Login : Form { public string usern

modalDialog的使用,图片切换,点击图片时打开一个窗体,并显示信息

//主窗体 //与open的区别:1.参数二是传递的参数 2.属性设置格式:属性=属性值; 3.dialogHeight与dialogWidth没有单位,即需要自己加上px //window.showModalDialog //("modalDialog.html",window,"dialogHeight=300px;dialogWidth=300px;scroll=yes;status=yes;dialogTop=100;dialogLeft=100;resizable=