【发布时间】:2014-01-05 07:31:51
【问题描述】:
当点击form1的登录按钮时,会打开form2,当点击form2的Go Form 3按钮时,会进入Form3。我想要做的是当单击 Form3 中的注销按钮时,Form3 和 Form2 将被关闭,以便我只能显示 Form1。我只知道如何关闭当前表单 this.Close();
【问题讨论】:
当点击form1的登录按钮时,会打开form2,当点击form2的Go Form 3按钮时,会进入Form3。我想要做的是当单击 Form3 中的注销按钮时,Form3 和 Form2 将被关闭,以便我只能显示 Form1。我只知道如何关闭当前表单 this.Close();
【问题讨论】:
一种简单的方法是在Form2 上订阅FormClosed event 或Form3,然后在处理程序内部(在Form2 内部)只需编写this.Close()。
如果你用ShowDialog()打开Form3作为模态,在LogoutButton的Click事件处理器下你可以将Form3的DialogResult设置为OK,这样会导致模态要关闭的表单,然后在Form2 上,您可以检查DialogResult,如果是“DialogResult.OK”,您可以关闭Form2。此外,您可以在VisualStudio 设计器中使用属性窗口简单地设置logoutBottun 的DialogResult 属性,而不是设置Form3 的DialogResult。这样您就不必手动设置Form3 的DialogResult,并且您根本不需要LogoutButton_Click 事件处理程序。
这是第二种方法的代码示例:
在Form3 上,这将在LogoutButton_Click 事件处理程序下:
private void LogoutButtonOnForm3_Click(object sender, EventArgs e)
{
DialogResult = System.Windows.Forms.DialogResult.OK;
}
然后在Form2,你打开Form3 的地方你应该写st。像这样:
Form3 f3 = new Form3();
if (f3.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
this.Close(); // this will close the form2
}
【讨论】:
通常的挂断是跟踪所有现有的表单对象。注销功能是应用程序的全局功能,因此将其设为静态方法是合适的。 Application.OpenForms 属性对于查找表单实例很有用。静态方法可能如下所示:
public static void Logout() {
for (int ix = Application.OpenForms.Count - 1; ix >= 0; --ix) {
var frm = Application.OpenForms[ix];
if (frm.GetType() != typeof(Form1)) frm.Close();
}
}
注意像这样向后迭代 OpenForms 集合是多么重要,关闭表单会改变集合。现在注销按钮很简单:
private void LogoutButton_Click(object sender, EventArgs e) {
Form1.Logout();
}
请重命名 Form 类以保持代码可读性。 “Form1”应该是“MainWindow”。
【讨论】: