我有一个窗口表单项目,我有一个登录屏幕,一个菜单和其他几种表单,我在它们之间切换:
this.Hide();
frm.FormClosed += new FormClosedEventHandler(subFormClosed);
frm.Show();
和FormClosedEventHandler(subFormClosed);
private void subFormClosed(object sender, FormClosedEventArgs e)
{
this.Close();
}
所以这样做的目的是当用户关闭子窗体时关闭它。
但是有一个问题,我想回到菜单,问题是我有两种可能性中的一种,我可以看到:
我可以通过引用将菜单表单传递给subForm,然后显示它并隐藏子表单 - 这似乎是一种非常好的方式,但它可以工作。
我可以打开菜单表单的新版本 - 这会在过度使用时导致巨大的内存问题(更多实例被创建,然后在程序关闭之前永远不会被销毁,例如30个菜单表单子表单)< / p>
我试图使用CloseReason检查子表单是否已被用户关闭,或者是否已从代码中关闭,但退出按钮和this.Close()
都返回CloseReason.UserClosing
。因此,我无法区分两种类型的退出。
所以基本上我要求的是有更好的方法来做到这一点,我已经读过有关MDI和SDI的内容,而且我无法确定哪些适用,或者如果kludgy选项1是这样做的最佳方式。
答案 0 :(得分:2)
您可以使用ShowDialog并将菜单页面作为所有者传递。像这样:
在菜单中:
// on menu navigation button click
this.hide();
SubForm sub = new SubForm();
sub.ShowDialog(this); // open as a dialog with this form as the owner
在子表格中:
// on subform's back button click or better, in the FormClosing event
this.Owner.show();
this.Close(); // this line is not needed if implemented in FormClosing event
答案 1 :(得分:1)
虽然ShowDialog解决方案的答案是非常好的,但如果由于某种原因不想使用ShowDialog,这是另一种方法:
在菜单表单的构造函数中,以这种方式使用子表单的FormClosed
和Shown
事件:
subForm1.FormClosed += (s, e) => showMenu();
subForm1.Shown+= (s, e) => hideMenu();
subForm2.FormClosed += (s, e) => showMenu();
subForm2.Shown+= (s, e) => hideMenu();
...
void showMenu()
{
this.Show();
}
void hideMenu()
{
this.Hide();
}
然后你可以自由地使用subForm1.Show()并按照你想要的方式关闭它们:事件将被相应地触发。