怎么让子窗体只启动一次?

Helsing 2010-11-11 11:07:55
详细描述: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();
}
...全文
188 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
龍月 2010-11-16
  • 打赏
  • 举报
回复
用一个hashtable 记录窗体的打开记录
打开一个窗体后,记录窗体name 到hashtable里面
每次打开前遍历这个hashtable 看有没有存在的记录
关闭窗体就 删除里面的记录
Helsing 2010-11-16
  • 打赏
  • 举报
回复
到现在也没解决,最后一问:谁能给讲下Singleton的用法,做个单例模式的窗体。没人回答就结贴了。
gohappy2008 2010-11-12
  • 打赏
  • 举报
回复
1、判断子窗体是否被打开
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;

}
让爱延续 2010-11-12
  • 打赏
  • 举报
回复
Application.openforms
Helsing 2010-11-12
  • 打赏
  • 举报
回复
各位高手,不吝赐教啊!
whrspsoft3723 2010-11-11
  • 打赏
  • 举报
回复
若是用new 来调用,建议冲在下构早函数。
whrspsoft3723 2010-11-11
  • 打赏
  • 举报
回复
1楼的 Form myMDIChild = null;
改成 static Form myMDIChild = null;
yangqizhong 2010-11-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fywindmoon 的回复:]
额,忘记说了,我不用Mdi来实现,因为我改不了主窗体,我做的子窗体是一个类,我只能修改baseCommand里的代码,来实现这个功能。
[/Quote]


子窗体是一个类,就对了, 建议你看一下设计模式中的单例模式。
大概设计类的思路是这样的:

Class SingleClass
{
private static SingleClass instance = null;
private SingleClass()
{}

public static SingleClass GetInstance()
{
if(instance == null)
{
instance = new SingleClass();
}
return instance;
}
}
tyi001 2010-11-11
  • 打赏
  • 举报
回复
这个这个
Helsing 2010-11-11
  • 打赏
  • 举报
回复
额,忘记说了,我不用Mdi来实现,因为我改不了主窗体,我做的子窗体是一个类,我只能修改baseCommand里的代码,来实现这个功能。
flyerwing 2010-11-11
  • 打赏
  • 举报
回复
创建型模式:标记创建状态
莫名其 2010-11-11
  • 打赏
  • 举报
回复
声明一个全局变量
Form2 f=null;
在Button1的click事件中写

if (f == null)
{
f = new Form2();
f.Show();
}
四更山吐月 2010-11-11
  • 打赏
  • 举报
回复
给你一段代码,编程要注意总结。
#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);
}
Helsing 2010-11-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yangqizhong 的回复:]
子窗体是一个类,就对了, 建议你看一下设计模式中的单例模式。
大概设计类的思路是这样的:

Class SingleClass
{
private static SingleClass i……
[/Quote]
好像是这么回事,能仔细讲讲吗,或给个例子,网上没看到好的资料
Helsing 2010-11-11
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 icanner 的回复:]
上面打错了
Public static Form1 frm;

public void CheckFormShow() //判断界面是否打开
{
if ((frm == null) || (frm.IsDisposed))
{
frm= new Form1();
frm.Show();
}
else
{
frm.Acti……
[/Quote]

这必须在主窗体里声明Form1为全局变量啊,问题是我没有办法操作主窗体,都是别人封装好的,调用方法都固定思路,我只能写子类。
ICANNER 2010-11-11
  • 打赏
  • 举报
回复
上面打错了
Public static Form1 frm;

public void CheckFormShow() //判断界面是否打开
{
if ((frm == null) || (frm.IsDisposed))
{
frm= new Form1();
frm.Show();
}
else
{
frm.Activate(); //激活
}
}
窗口关闭时 让frm = null;
ICANNER 2010-11-11
  • 打赏
  • 举报
回复
Public static Form1 frm;

public void CheckFormShow() //判断界面是否打开
{
if ((frm == null) || (frm.IsDisposed))
{
frm= new FrmRptQuery();
frm.Show();
}
else
{
frm.Activate(); //激活
}
}
窗口关闭时 让frm = null;

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧