Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一种在另一个窗体上显示窗体的更好方法_C#_.net_Winforms - Fatal编程技术网

C# 一种在另一个窗体上显示窗体的更好方法

C# 一种在另一个窗体上显示窗体的更好方法,c#,.net,winforms,C#,.net,Winforms,我有一个主窗体。我想从它启动另一个窗体,然后从启动的窗体启动另一个窗体。我想确保在显示子窗体时主窗体不可编辑,因此我使用showdialog() Mainform>(Showdialog)>form1>(Showdialog+dispose)>form2(dispose)>Mainform 从Mainform调用form2.ShowDialog(),然后从form2使用以下代码启动另一个表单 this.visible=false; form3.showdialog(); this.dispose

我有一个主窗体。我想从它启动另一个窗体,然后从启动的窗体启动另一个窗体。我想确保在显示子窗体时主窗体不可编辑,因此我使用
showdialog()

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

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

this.visible=false;
form3.showdialog();
this.dispose();
但这其中也有一些问题。有没有更好的方法来实现我所期待的

edit:more description

我有一个主窗体,用户单击主窗体上的一个按钮>启动窗体1>用户单击窗体1中的一个按钮>关闭窗体2后启动窗体2(隐藏/隐藏窗体1)。主窗体应放在前面并使其可编辑,直到所有其他窗体都位于主窗体的顶部,并且在代码中主窗体应不可编辑仅在关闭form3后执行。我想您需要的是在关闭form3之后关闭form2,这样您就可以调用this.close()而不是this.Dispose()

或者,在form3出现之后,你就不再需要form2了。这意味着:

this.visible=false;
//show instead of showdialog so it wont wait until form3 is closed
form3.show();
this.Close();

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

获取对MainForm的引用有几个选项,但最简单的是使用:

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

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

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

如果需要按顺序传递数据,应将数据从每个对话框传递到主窗体,然后主窗体将数据传递到下一个对话框。

MainForm:

Form1 f = new Form1();
if (f.ShowDialog(this) == DialogResult.OK) {
    Form2 f2 = new Form2();
    f2.ShowDialog(this);
}
表格1(点击按钮将打开表格2):


您遇到的具体问题是什么?根据您所描述的(生成子表单,以便用户无法编辑父表单),ShowDialog()正是您想要的,并且是实现您想要的最简单和最好的方法。您必须更具体地了解遇到的问题,以便获得进一步的帮助。我怀疑这些问题不是ShowDialog()调用造成的。@Josh当显示Form2时,主窗体是可编辑的,在某些情况下,Form2位于Mainform之后,我必须从任务栏图标手动将其置于顶部。因此,当我从Form2打开Form3后关闭Form3时,控件是否会返回Mainform。我应该使用Dispose()还是close().请给我一个Example@techno这个问题毫无意义。模式对话框(表单)会自动关闭,因为用户无法与其他任何内容交互。您可以通过设置DialogResult属性从其内部关闭它。这通常通过设置各种按钮的DialogResult属性来实现,通常是将Ok按钮设置为DialogResult.Ok,将Cancel按钮设置为DialogResult.Cancel。我想我们需要更多关于您试图完成的内容的信息。我有一个主窗体,用户单击Mainform上的按钮>Form1启动>用户单击Form1中的按钮>form2启动(diposing/Hidden Form1)form2关闭后Mainform应该是可编辑的,在此之前,所有其他表单都应该位于Mainform之上,Mainform应该是不可编辑的。我相信@Tergiver已经为您提供了问题的答案,请使用您的表单显示所有表单。ShowDialog(Application.OpenForms[“Mainform”])参数,您的问题就会消失!如果@techno确实试图创建一个向导,那么最好的方法是使用UserControls作为“页面”,并随着用户的进步在表单中交换它们。
Form1 f = new Form1();
if (f.ShowDialog(this) == DialogResult.OK) {
    Form2 f2 = new Form2();
    f2.ShowDialog(this);
}
button1_click(object sender, EvengArgs e) {
    this.DialogResult = DialogResult.OK;
    Close();   
}