Winform中大家是用哪种方法实现每个窗体最多打开一次? 我看了一下,传统的是用单例模式,或者用判断窗体状态的方法来实现,我想了一下,觉得这样的话每个窗体都要写一次实现单例模式的代码,然后我就想用一个窗体工厂,在里面控制所有窗体的生成方式。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可以通过Form.Disposed事件来移除静态成员,这些工作可以在类的内部完成,对于外部程序来说根本不用管。 为啥不考虑使用HMutex互斥体呢? 呃,我到目前为止,只用这一个方法:在需要打开的Form2的上级Form1中添加:public static bool Form2Open = false;然后需要打开的Form2的初始化里,添加Form1.Form2Open = true;在关闭Form2的Closing事件里,添加Form1.Form2Open = false;最后在Form1中的打开Form2的Button按钮或者其他打开方式的Click或者Open事件中加入判断:if(FForm2Open == false){//打开Form2}else{//报错代码} FormB fb = null; private void button1_Click(object sender, EventArgs e) { if (fb == null || fb.IsDisposed) { fb = new FormB(); fb.Show(); } else { fb.Activate(); } } 我是这么干的/// <summary> /// 检查当前窗口是否已经存在 /// </summary> /// <param name="TitleText">窗口标题</param> /// <returns></returns> private bool FormExists(string TitleText) { for (int i = 0; i < this.xafTabbedMdiManager.Pages.Count; i++) { if (this.xafTabbedMdiManager.Pages[i].Text == TitleText) { //激活窗口 this.xafTabbedMdiManager.Pages[i].MdiChild.Activate(); return true; } } return false; } /// <summary> /// 这个类是用来产生窗体 /// </summary> public class FormsFactory { private FormsFactory() { } //单例模式 private static object _lock = new object(); private static FormsFactory fac = null; public static FormsFactory GetInstance() { if (fac == null) { lock (_lock) { if (fac == null) { fac = new FormsFactory(); } } } return fac; } private Hashtable ListForms = new Hashtable(4); public object GetForms(string frmName) { object result = null; if (this.ListForms.Contains(frmName) && (this.ListForms[frmName] as Form).IsDisposed) { this.ListForms.Remove(frmName); } if (this.ListForms.Contains(frmName)) { result = this.ListForms[frmName]; } else { result = Assembly.Load("UI").CreateInstance("UI.Sub." + frmName); this.ListForms.Add(frmName, result); } return result; } }调用: private void S001003_Click(object sender, EventArgs e) { Sub.S001003 frm = FormsFactory.GetInstance().GetForms("S001003") as Sub.S001003; frm.MdiParent = this; frm.Show(); frm.WindowState = FormWindowState.Maximized; frm.Activate(); }大家看看这样有没有问题。 private Hashtable ListForms = new Hashtable(4);有问题,每调用一次new一次,不能限制打开窗体吧! /// <summary> /// 这个类是用来产生窗体 /// </summary> public class FormsFactory { private FormsFactory() { } //单例模式 private static object _lock = new object(); private static FormsFactory fac = null; public static FormsFactory GetInstance() { if (fac == null) { lock (_lock) { if (fac == null) { fac = new FormsFactory(); } } } return fac; } private Hashtable ListForms = new Hashtable(4); public object GetForms(string frmName) { object result = null; //假如有该窗体,且已释放 if (this.ListForms.Contains(frmName) && (this.ListForms[frmName] as Form).IsDisposed) { this.ListForms.Remove(frmName); } //假如有该窗体,且未释放 if (this.ListForms.Contains(frmName) && (this.ListForms[frmName] as Form).IsDisposed==false) { return null; } else//没有该窗体,且未释放 { result = Assembly.Load("ConsoleApplication1").CreateInstance("ConsoleApplication1." + frmName); this.ListForms.Add(frmName, result); } return result; } }调用 Form frm=FormsFactory.GetInstance().GetForms("Childform") as Form; if (frm == null) return; Childform chil = frm as Childform; chil.Callevent += (send) => { textBox1.Text = send; }; chil.Show(); 读取异常。 关于DllImport效率问题 C# 开发 WIN CE程序 Label的Font类的存储与读取,求解! 初学.net 那个版本好用! 加载程序时如何让鼠标变成漏斗? 开源:完整的文件管理系统V1.0 C#导出到word 关于用.net remoting传送数组对象的问题 vb.net中的Shell("Notepad.exe", AppWinStyle.NormalFocus),在CS中对应的句子怎么写? C# 绘制十字光标? Winform发生内存错误 请高手指教
可以通过Form.Disposed事件来移除静态成员,这些工作可以在类的内部完成,对于外部程序来说根本不用管。
在需要打开的Form2的上级Form1中添加:
public static bool Form2Open = false;
然后需要打开的Form2的初始化里,添加Form1.Form2Open = true;
在关闭Form2的Closing事件里,添加Form1.Form2Open = false;
最后在Form1中的打开Form2的Button按钮或者其他打开方式的Click或者Open事件中加入判断:
if(FForm2Open == false)
{
//打开Form2
}
else
{
//报错代码
}
private void button1_Click(object sender, EventArgs e)
{
if (fb == null || fb.IsDisposed)
{
fb = new FormB();
fb.Show();
}
else
{
fb.Activate();
}
}
/// 检查当前窗口是否已经存在
/// </summary>
/// <param name="TitleText">窗口标题</param>
/// <returns></returns>
private bool FormExists(string TitleText)
{
for (int i = 0; i < this.xafTabbedMdiManager.Pages.Count; i++)
{
if (this.xafTabbedMdiManager.Pages[i].Text == TitleText)
{
//激活窗口
this.xafTabbedMdiManager.Pages[i].MdiChild.Activate();
return true;
}
}
return false;
}
/// <summary>
/// 这个类是用来产生窗体
/// </summary>
public class FormsFactory
{
private FormsFactory() { } //单例模式
private static object _lock = new object();
private static FormsFactory fac = null;
public static FormsFactory GetInstance()
{
if (fac == null)
{
lock (_lock)
{
if (fac == null)
{
fac = new FormsFactory();
}
}
}
return fac;
} private Hashtable ListForms = new Hashtable(4); public object GetForms(string frmName)
{
object result = null;
if (this.ListForms.Contains(frmName) && (this.ListForms[frmName] as Form).IsDisposed)
{
this.ListForms.Remove(frmName);
} if (this.ListForms.Contains(frmName))
{
result = this.ListForms[frmName];
}
else
{
result = Assembly.Load("UI").CreateInstance("UI.Sub." + frmName);
this.ListForms.Add(frmName, result);
}
return result;
}
}调用:
private void S001003_Click(object sender, EventArgs e)
{
Sub.S001003 frm = FormsFactory.GetInstance().GetForms("S001003") as Sub.S001003;
frm.MdiParent = this;
frm.Show();
frm.WindowState = FormWindowState.Maximized;
frm.Activate();
}
大家看看这样有没有问题。
/// 这个类是用来产生窗体
/// </summary>
public class FormsFactory
{
private FormsFactory() { }
//单例模式
private static object _lock = new object();
private static FormsFactory fac = null;
public static FormsFactory GetInstance()
{
if (fac == null)
{
lock (_lock)
{
if (fac == null)
{
fac = new FormsFactory();
}
}
}
return fac;
} private Hashtable ListForms = new Hashtable(4);
public object GetForms(string frmName)
{
object result = null;
//假如有该窗体,且已释放
if (this.ListForms.Contains(frmName) && (this.ListForms[frmName] as Form).IsDisposed)
{
this.ListForms.Remove(frmName);
} //假如有该窗体,且未释放
if (this.ListForms.Contains(frmName) && (this.ListForms[frmName] as Form).IsDisposed==false)
{
return null;
}
else//没有该窗体,且未释放
{
result = Assembly.Load("ConsoleApplication1").CreateInstance("ConsoleApplication1." + frmName);
this.ListForms.Add(frmName, result);
}
return result;
}
}调用 Form frm=FormsFactory.GetInstance().GetForms("Childform") as Form;
if (frm == null)
return;
Childform chil = frm as Childform;
chil.Callevent += (send) =>
{
textBox1.Text = send;
}; chil.Show();