在this.Dispose()之后使用form.ShowDialog();

时间:2012-06-25 10:46:27

标签: c# .net winforms

我正在从另一种形式发布表单。我希望在显示子表单之前处理父表单,所以我使用:

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

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

EDIT:

这是基本流程

的MainForm>(ShowDialog的)GT; form1中>(处置+的ShowDialog)GT;窗口2(处置)GT;的MainForm

5 个答案:

答案 0 :(得分: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();
        }
     } 

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

this.DialogResult = DialogResult.OK;
this.Close();

答案 1 :(得分:2)

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

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

答案 2 :(得分: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

如果您正在显示表单(非模态),则可以隐藏父表单,并侦听子表单的close事件,然后关闭处理程序中的父表单

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();

答案 3 :(得分:0)

抱歉,我认为你不能这样做,因为当你调用ShowDialog方法时,子表单依赖于它的父表单。所以处理的召唤将暂停,直到你完成子表格。

我认为你必须调用“Show”方法,之后你可以调用dispose方法。

答案 4 :(得分:0)

子表单的生命周期取决于其父生命周期,也就是说,一旦调用父表单的parent.close,它将处理该实例创建的所有对象。

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