如何创建和调用MDI窗口

yafengluatmsn 2008-01-31 03:01:47
做了一个主窗口FormMain
做了二个子窗口Form1和Form2
想调用Form1,调用的时候如果Form1已经创建,则显示它,不要重新创建一个Form1窗口,怎么实现?

我在实现的时候的代码:
private void fundToolStripMenuItem_Click(object sender, EventArgs e)
{
Form1 frm1 = new Form1();
frm1.MdiParent = this;
frm1.Show();
}
每次调用都重复创建一模一样的Form1,郁闷啊,请高手指点!
...全文
77 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yilanwuyu123 2008-01-31
  • 打赏
  • 举报
回复
传递一个参数,是FORM1独有的,在创建里面加入判断语句,IF这个存在,则return。
yafengluatmsn 2008-01-31
  • 打赏
  • 举报
回复
受asdf311 指点:

做了一个主窗口FormMain
做了一个子窗口FormFund
想调用FormFund,调用的时候如果FormFund已经创建,则显示它,不要重新创建一个FormFund窗口,实现如下,看看有没有什么不妥的地方?
我试了几下没有报错。

public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}

private void fundToolStripMenuItem_Click(object sender, EventArgs e)
{
FormFund frmFund = FormFund.getInstance();
frmFund.MdiParent = this;
frmFund.Show();
}
}



public partial class FormFund : Form
{
static public FormFund m_instance = null;

public FormFund()
{
InitializeComponent();
}

public static FormFund getInstance()
{
if (m_instance == null)
{
m_instance = new FormFund();
}
return m_instance;
}

private void FormFund_FormClosed(object sender, FormClosedEventArgs e)
{
m_instance = null; //关闭子窗口FormFund后要把m_instance置空,否则报错,???
}

}










jinning13 2008-01-31
  • 打赏
  • 举报
回复
public bool checkChildFrmExist(string childFrmName)
{
foreach (Form childFrm in this.MdiChildren)
{
if (childFrm.Name == childFrmName)
{
if (childFrm.WindowState == FormWindowState.Minimized)
{
childFrm.WindowState = FormWindowState.Normal;
}
childFrm.Activate();
return true;
}
}
return false;
}

private void fundToolStripMenuItem_Click(object sender, EventArgs e)
{
if (this.checkChildFrmExist("Form1"))
{
return;
}
Form1 frm1 = new Form1();
frm1.MdiParent = this;
frm1.Show();
}
wheeler 2008-01-31
  • 打赏
  • 举报
回复
在Form1中实现静态构造方法。(即设计模式中的单例模式)


class Form form1
{
private static form1 m_instance;

private form1()
{
//TODO...
}
public static Form getInstance()
{
if (m_instance == null)
{
m_instance = new form1();
}
return m_instance;
}
}



private void fundToolStripMenuItem_Click(object sender, EventArgs e)
{
Form1 frm1 = Form1.getInstance();
frm1.MdiParent = this;
frm1.Show();
}



下面说一下你的代码的问题。
这里应该不适合使用单例模式,因为在frm1.Show();后面应该写上frm1.Dispose();即frm1被关闭后应该释放而不是保留在内存中。
qgmzhfj 2008-01-31
  • 打赏
  • 举报
回复
可以在Form1里写一个方法 ,创建实例,然后就不用每次都new了 ,
Form1 frm1 = 实例,
这样就行了
yuan731 2008-01-31
  • 打赏
  • 举报
回复
HANDLE

111,116

社区成员

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

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

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