2

我正在从另一个表单启动一个表单。我希望在显示子表单之前处理父表单,所以我使用:

 this.Dispose();
 form.ShowDialog(); 

显示表单,这是正确的方法吗?表单 from 是通过调用ShowDialog()from 主表单启动的。我希望在主表单可编辑之前关闭这些表单。

EDIT:

这是基本流程

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

4

5 回答 5

3

如果您想确保在显示子项之前父项不可见,并且您希望父项关闭:

var f = new ChildForm();
this.Hide();
f.Show();
this.Close();

ShowDialog()意思是“显示此表单并在关闭后返回给我”。这不是你所描述的你想要发生的事情。

根据您的评论,从您的主表单创建和显示 form2 可能更有意义。

在主窗体中:

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

在您最初生成 Form2 的 Form1 事件中

this.DialogResult = DialogResult.OK;
this.Close();
于 2012-06-25T11:06:08.287 回答
2

调用Dispose任何对象(包括称为 的当前对象this)表示您已经完成了该对象,它最终完成了。

最好是Close第一个对话,然后显示第二个。

于 2012-06-25T10:48:56.560 回答
1

如果您以模态方式显示子对话框(在这种情况下就是这样),那么您可以隐藏父对话框您可以做的是隐藏父窗体,显示子窗体,然后关闭父窗体。

var form = new SomeForm();
this.Hide();
form.ShowDialog(); // the code will be blocked at this point until the child form closes
this.Close();
this.Dispose(); // i'm not sure if this is necessary anymore. check MSDN

如果您正在显示一个表单(不是模态),您可以隐藏父表单,并监听子表单的关闭事件,然后在处理程序中关闭父表单

void childFormClosed(Event e) 
{
    this.Close();
}

var form = new SomeForm();
form.Closed += new EventHandler... // I usually rely on intellisense with this
this.Hide();
form.ShowDialog();
于 2012-06-25T14:37:57.027 回答
0

抱歉,我认为您不能这样做,因为当您调用 ShowDialog 方法时,子窗体将依赖于其父窗体。因此 dispose 的调用将被暂停,直到您完成子表单。

我认为你必须调用“显示”方法,然后你可以调用 dispose 方法。

于 2012-06-25T10:51:56.343 回答
0

子窗体的生命周期取决于其父窗体的生命周期,这意味着,一旦您调用父窗体的 parent.close,它将释放该实例创建的所有对象。

您必须独立于父级创建子级。

于 2012-06-25T13:12:20.397 回答