我使用以下代码在MDI父表单中显示子表单。如您所知,单击该按钮将显示一个新表单。继续单击按钮,屏幕将填充空白表格。为了防止这种情况发生,我移动了在按钮之外创建表单的代码。
像这样:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Form2 f2 = new Form2();
private void button1_Click(object sender, EventArgs e)
{
f2.MdiParent = this;
f2.Show();
}
但是,当我关闭子表单并想再次打开它时,它不会让我。
请帮我解决这个问题。
答案 0 :(得分:5)
您需要跟踪表单状态,以便了解需要创建新表单状态。像这样:
private Form2 f2;
private void button1_Click(object sender, EventArgs e)
{
if (f2 == null) {
f2 = new Form2();
f2.MdiParent = this;
f2.FormClosed += delegate { f2 = null; };
f2.Show();
}
else {
f2.Activate();
}
}
答案 1 :(得分:1)
您不希望将所有表单(两次)保留为变量。所有mdi表单都会添加到您的MdiChildren集合中。因此,您需要检查是否需要显示您创建的表单。 像这样:
private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.MdiParent = this;
OpenMdiChild(f2);
}
private void OpenMdiChild(Form newForm)
{
bool found = false;
foreach (Form frm in this.MdiChildren)
{
if (frm.GetType() == newForm.GetType())
{
frm.Activate();
frm.Focus();
//frm.BringToFront();
found = true;
break;
}
}
if (!found)
{
frm.Show();
}
}
如果您希望用户只打开1个表单,可以将OpenMdi--方法更改为:
private void OpenMdiChild(Form newForm)
{
bool found = (this.MdiChildren.Length > 0);
if (!found)
{
foreach (Form frm in this.MdiChildren)
{
if (frm.GetType() == newForm.GetType())
{
frm.Activate();
frm.Focus();
//frm.BringToFront();
found = true;
break;
}
}
if (!found)
{
frm.Show();
}
}
}