如何让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();.

}
}

}
...全文
269 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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;

111,094

社区成员

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

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

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