我有一个主表单。我想从它启动另一个表单并从启动的表单启动另一个表单。我想确保在显示子表单时主表单不可编辑,所以我使用showdialog()
< / p>
的MainForm&GT;(ShowDialog的)GT; form1中&GT;(+的ShowDialog处置)GT;窗口2(处置)GT;的MainForm
从Mainform我调用form2.ShowDialog()然后从form2我使用以下代码启动另一个表单
this.visible=false;
form3.showdialog();
this.dispose();
但是这里有一些问题。有没有更好的方法来实现我想要的东西?
edit:more description
我有一个主窗体,用户单击主窗口上的按钮&gt; Form1被激活&gt;用户单击Form1中的按钮&gt;窗体2在form2关闭后被激活(浸入/隐藏form1)Mainform应该被带到前面并且可以编辑,在此之前,所有其他表格应位于Mainform之上,而Mainform应该是不可编辑的
答案 0 :(得分:2)
问题是您必须将MainForm指定为(两者)form2和form3的父级。当您使用没有参数的ShowDialog的重载时,WinForms使用活动表单作为父表单,因此form3的父表单自动变为form2。然后你试图关闭/处理form2,导致form3成为孤儿。
有几种方法可以获得对MainForm的引用,但最简单的方法是使用:
form2/3.ShowDialog(Application.OpenForms["MainForm"]);
假设您已将MainForm上的Name属性设置为“MainForm”。
答案 1 :(得分:0)
在代码中,只有在关闭form3后才会执行this.dispose()。我想你想要的是在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();
答案 2 :(得分:0)
看起来你正试图实现类似向导的东西。最好的解决方案是以主窗体顺序启动所有子窗体。
如果需要沿序列传递数据,则应将其从每个对话框传递到主窗体,然后将其传递给下一个对话框。
答案 3 :(得分:0)
的MainForm:
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();
}