-1

我有一个主表单。我想从它启动另一个表单并从启动的表单启动另一个表单。我想确保在显示子表单时主表单不可编辑,所以我使用showdialog()

Mainform>(Showdialog)>form1>(showDialog+dispose)>form2(dispose)>Mainform

从 Mainform 我调用 form2.ShowDialog() 然后从 form2 我使用以下代码启动另一个表单

this.visible=false;
form3.showdialog();
this.dispose();

但这有一些问题。有没有更好的方法来实现我正在寻找的东西?

edit:more description

我有一个主窗体,用户单击主窗体上的按钮 > 启动 Form1 > 用户单击 Form1 中的按钮 > 关闭窗体 2 后启动窗体 2(处理/隐藏窗体 1) 主窗体应放在前面并使其可编辑,直到那时所有其他表单都应该在 Mainform 之上,并且 Mainform 应该是不可编辑的

4

4 回答 4

2

问题是您必须将 MainForm 指定为(两者)form2 和 form3 的父级。当你使用 ShowDialog 的无参数重载时,WinForms 使用活动窗体作为父级,因此 form3 的父级自动变为 form2。然后,您尝试关闭/处置 form2 导致 form3 成为孤立的。

有几种方法可以获取 MainForm 的引用,但最简单的是使用:

form2/3.ShowDialog(Application.OpenForms["MainForm"]);

假设您已将 MainForm 上的 Name 属性设置为“MainForm”。

于 2012-06-29T18:09:02.730 回答
0

在您的代码中, this.dispose() 仅在 form3 关闭后执行。我认为您想要的是在 form3 关闭后关闭 form2,因此您可以调用 this.Close() 而不是 this.Dispose()。

this.visible=false;
form3.showdialog();
this.Close();

或者,也许在 form3 出现后,您不再需要 form2。这意味着:

this.visible=false;
//show instead of showdialog so it wont wait until form3 is closed
form3.show();
this.Close();
于 2012-06-29T17:41:44.517 回答
0

看起来您正在尝试实现类似向导的东西。最好的解决方案是在主窗体中按顺序启动所有子窗体。

如果您需要沿序列传递数据,则应将其从每个对话框传递到主窗体,然后将其传递到下一个对话框。

于 2012-06-29T18:25:18.290 回答
0

主窗体:

Form1 f = new Form1();
if (f.ShowDialog(this) == DialogResult.OK) {
    Form2 f2 = new Form2();
    f2.ShowDialog(this);
}

Form1(单击将打开表单 2 的按钮):

button1_click(object sender, EvengArgs e) {
    this.DialogResult = DialogResult.OK;
    Close();   
}
于 2012-06-29T20:28:12.740 回答