详细描述:MainForm中有个按钮Button1,点击之后弹出Form1。如果我多次点Button1则,Form1会被多次实例化,这是我们所需要避免的。
问题:如果Form1已打开,则不实例化,如果没有打开则实例化。
问题很简单,但我找不到好的办法。在网上看到有用Mutex的方法,但并不好用,混乱的。不要告诉我ShowDialog,我就是要做交互的窗体的。谢谢各位了! Form1 fdc = new Form1(); bool createdNew;
System.Threading.Mutex instance = new System.Threading.Mutex(true, fdc.Name, out createdNew);
if (createdNew)
{
fdc.Show();
instance.ReleaseMutex();
}
else
{
fdc.Close();
}
问题:如果Form1已打开,则不实例化,如果没有打开则实例化。
问题很简单,但我找不到好的办法。在网上看到有用Mutex的方法,但并不好用,混乱的。不要告诉我ShowDialog,我就是要做交互的窗体的。谢谢各位了! Form1 fdc = new Form1(); bool createdNew;
System.Threading.Mutex instance = new System.Threading.Mutex(true, fdc.Name, out createdNew);
if (createdNew)
{
fdc.Show();
instance.ReleaseMutex();
}
else
{
fdc.Close();
}
#region MDI函数
private bool ContainMDIChild(string ChildTypeString)
{
bool res = false;
Form myMDIChild = null;
foreach (Form f in this.MdiChildren)
{
if (f.GetType().ToString() == ChildTypeString)
{
myMDIChild = f;
break;
}
}
if (myMDIChild != null)
{
myMDIChild.WindowState = FormWindowState.Normal;
myMDIChild.Show();
myMDIChild.BringToFront();
res = true;
}
return res;
} private void setMdiChild(Form frm)
{
frm.Owner = this;
frm.MdiParent = this;
frm.MaximizeBox = false;
} private void showForm(Form frm)
{
frm.Show();
frm.BringToFront();
frm.Height = frm.Parent.Height - 5;
frm.Width = frm.Parent.Width - 5;
frm.Top = 0;
frm.Left = 0;
} #endregion调用时候:
string fullName = strNamespace + "." + frmName;//命名空间+窗体名
if (!ContainMDIChild(fullName))
{
object objType = Assembly.Load(strNamespace).CreateInstance(fullName);
Form frm = (Form)objType;
setMdiChild(frm);
showForm(frm);
}
Form2 f=null;
在Button1的click事件中写if (f == null)
{
f = new Form2();
f.Show();
}
大概设计类的思路是这样的:Class SingleClass
{
private static SingleClass instance = null;
private SingleClass()
{}
public static SingleClass GetInstance()
{
if(instance == null)
{
instance = new SingleClass();
}
return instance;
}
}
改成 static Form myMDIChild = null;
public void CheckFormShow() //判断界面是否打开
{
if ((frm == null) || (frm.IsDisposed))
{
frm= new FrmRptQuery();
frm.Show();
}
else
{
frm.Activate(); //激活
}
}
窗口关闭时 让frm = null;
Public static Form1 frm;
public void CheckFormShow() //判断界面是否打开
{
if ((frm == null) || (frm.IsDisposed))
{
frm= new Form1();
frm.Show();
}
else
{
frm.Activate(); //激活
}
}
窗口关闭时 让frm = null;
这必须在主窗体里声明Form1为全局变量啊,问题是我没有办法操作主窗体,都是别人封装好的,调用方法都固定思路,我只能写子类。
public bool checkchildFrmExist(string childFrmName)
{
foreach (Form childFrm in this.MdiChildren)
{
if (childFrm.Text.ToString() == childFrmName)
{
if (childFrm.WindowState == FormWindowState.Minimized)
{
childFrm.WindowState = FormWindowState.Normal; }
childFrm.Activate(); return true; }
}
return false;
}2、子窗体调用
private void barButtonItem1_ItemClick(object sender, ItemClickEventArgs e)
{
if (checkchildFrmExist("用户管理") == true) { return; }
Frm_userAdd form1 = new Frm_userAdd();
form1.MdiParent = this;
form1.Show();
form1.WindowState = FormWindowState.Maximized;
}
打开一个窗体后,记录窗体name 到hashtable里面
每次打开前遍历这个hashtable 看有没有存在的记录
关闭窗体就 删除里面的记录