如何让MDI子窗体只能实例化一个(用一个函数实现)

softwareCRAZY 2004-12-21 08:52:51

我这么写提示错误!

private ShowMdiForm(Form FormName)
{
foreach(Form f in this.MdiChildren)
{
if (f.GetType()=typeof(FormName))
{

ff.MdiParent = this;
ff.Show();.
}
else
{
FormName ff = new FormName();
ff.MdiParent = this;
ff.Show();.

}
}

}
...全文
222 点赞 收藏 11
写回复
11 条回复
xiyun 2004年12月22日
bool IsShowed = false;
foreach(Form frm in this.MdiChildren)
{
if(frm.GetType()== typeof(FormName))
{
frm.Active();
IsShowed = true;
break;
}
}
if(!IsShowed)
{
FormName ff = new FormName();
ff.MdiParent = this;
ff.Show();
}
回复 点赞
wyarrant 2004年12月22日
我一般是这么做
在子窗体类中添加以下代码,并且原构造函数由public -> protected

窗体类中的代码:

private static frmEditMap mInstance = null;
//单例模式创建以及维护窗体类,mInstance为其单一实例,通过Instance属性得到该实例对象
//在窗体的closed事件中将mInstance重置
//原构造函数由public -> protected
public static frmSample Instance
{
get
{
if( mInstance == null )
{
mInstance = new frmSample();
}
return mInstance;
}
}

然后通过以下代码调用:

frmSample frm = frmSample.Instance;
frm.ShowDialog();

最后在close事件中
Instance = null;
回复 点赞
lyvvvv 2004年12月22日
试试下面我得代码
private void menuItemAdviceSent_Click(object sender, System.EventArgs e)
{
if(FormIsOpen("frmAdviceSend"))return;
frmAdviceSend frm=new frmAdviceSend();
frm.ShowDialog();
}

private bool FormIsOpen(string sFormName)
{
bool bFormIsOpen=false;
for(int k=0;k<this.MdiChildren.Length ;k++ )
{
if (this.MdiChildren[k].Name.ToString()==sFormName)
{
this.MdiChildren[k].Activate();
bFormIsOpen=true;
break;
}
}
if(bFormIsOpen)
{
this.ActiveMdiChild.WindowState =System.Windows.Forms.FormWindowState.Normal ;
this.ActiveMdiChild.Activate();
return bFormIsOpen;
}
else return false;

}
回复 点赞
Alden 2004年12月22日
路过
回复 点赞
softwareCRAZY 2004年12月22日
xian现在仍然没有一个答案符合条件:

解决的方案也只是将窗体显示;

如何 写一个通用的show函数只创建一个窗体的实例那 ?

如何 写一个通用的show函数只创建一个窗体的实例那 ?
如何 写一个通用的show函数只创建一个窗体的实例那 ?
回复 点赞
egxsun 2004年12月22日
if (f.Name.ToString() == FormName)或
if(f.GetType().ToString()==FormName.GetType().ToString())试试

回复 点赞
softwareCRAZY 2004年12月22日
我的程序改了一下还是不对啊 :
提示:找不到类型或命名空间名称“FormName”(是否缺少 using 指令或程序集引用?)

private void ShowMdiForm(Form FormName)

{
if (this.MdiChildren.Length==0)
{

FormName ff = new FormName();
ff.MdiParent = this;
ff.Show();
return;
}
foreach(Form f in this.MdiChildren)
{
if (f.GetType()==typeof(FormName))
{

//f.MdiParent = this;
f.Show();
}
else
{
FormName ff = new FormName();
ff.MdiParent = this;
ff.Show();

}
}

}
回复 点赞
kqh0319 2004年12月22日
UP UP UP UP UP ...
回复 点赞
nga96 2004年12月22日
研究一下,呵
回复 点赞
raulredondo 2004年12月21日
逻辑大有问题
if (f.GetType()=typeof(FormName))
如果f是主窗口的mdichildren,那么f的mdiparent必然是主窗口,下面的语句多此一举
如果不是,而主窗口有n个类型不是FormName的子窗口的话,else语句会创建n个类型是FormName的子窗口,搞不好会死循环也说不定

应该在foreach里面对类型是FormName的窗体计数,如果是0则添加一个类型是FormName的子窗体,否则就什么也不作
回复 点赞
syczx 2004年12月21日
我看到两个错误:
1、if (f.GetType()=typeof(FormName))这是一个付值语句,而这里应该是条件语句,少个“=”;
2、ff.MdiParent = this;这里的ff没有定义,是不是应该是f.MdiParent = this;
回复 点赞
发动态
发帖子
C#
创建于2007-09-28

8.4w+

社区成员

64.0w+

社区内容

.NET技术 C#
社区公告
暂无公告