嗨,每个程序员都在这里: 我是编程方面的新手 我有两种形式
我制作此代码只能同时打开一个注册表单。
问题是,当我关闭注册表单并单击NewRegToolStripMenuItem_Click
再次打开它时,它无效。如何修复它,以便每次关闭表单然后单击它再次打开按钮?
非常感谢。
Customer_Regisration_Form cf;
private void NewRegToolStripMenuItem_Click(object sender, EventArgs e)
{
if (cf == null | IsDisposed)
{ cf = new Customer_Regisration_Form();
cf.MdiParent = this;
cf.Show();
}
}
答案 0 :(得分:1)
如果您一次只打开一个实例,也许您应该考虑使用Form.ShowDialog。这将显示您的RegistrationForm
作为模态对话框。
var registrationForm = new RegistrationForm();
registrationForm.ShowDialog();
这将要求用户在他/她可以做任何其他事情之前退出此对话框。如果您要引用RegistrationForm
的同一个打开实例而不使其成为正式对话框,请使用MainForm
上的Form.MdiChildren属性,看看它是否包含目标实例形式。
var registrationForm = mainForm.MdiChildren.OfType<RegistrationForm>().SingleOrDefault();
if (registrationForm == null) {
registrationForm = new RegistrationForm();
registrationForm.MdiParent = this;
registrationForm.Show();
} else if (registrationForm.WindowState == FormWindowState.Minimized)
registrationForm.WindowState = FormWindowState.Normal;
else
registrationForm.Activate();
以上内容应该确认RegistrationForm
的孩子中是否已经开启MainForm
,并且如果可以找到则坚持下去。然后它恢复其正常状态,如果它先前已被最小化并且应用程序给它焦点调用Form.Activate方法。
否则,它只是创建一个新实例并显示它。
答案 1 :(得分:0)
我相信你有几个问题:
IsDisposed
,这是MDI的一个属性,并且与此if语句无关。尝试更新您的代码,如下所示:
Customer_Regisration_Form cf;
private void NewRegToolStripMenuItem_Click(object sender, EventArgs e)
{
if (cf == null || cr.IsDisposed)
{ cf = new Customer_Regisration_Form();
cf.MdiParent = this;
}
cf.Show();
}
请注意,我已将您的|
更改为||
,这是short circuiting logical or,一旦失败,将不会继续评估语句中的其他条件。这将阻止if语句的第二个条件上的空引用异常。我基本上再也不会使用|
了。
答案 2 :(得分:0)
确保您将表单作为全局变量。
private frmForm frm = new frmForm();
然后
private void btnSomeButton_Click(object sender, EventArgs e)
{
if (frm.Visible == true)
{
frm.MdiParent = this;
frm.Show();
return;
}
if (frm.IsDisposed)
{
frm = new frmForm ();
frm.MdiParent = this;
frm.Show();
return;
}
frm.MdiParent = this;
frm.Show();
}