【问题标题】:Using form.ShowDialog() after this.Dispose();在 this.Dispose() 之后使用 form.ShowDialog();
【发布时间】:2012-06-25 10:46:26
【问题描述】:

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

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

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

EDIT:

这是基本流程

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

【问题讨论】:

  • this.Hide(); form.showDialog();

标签: c# .net winforms


【解决方案1】:

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

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

【讨论】:

  • 谢谢。我的方法工作正常,没有任何问题,是否需要这个额外的代码。
  • 代码的intent 没有反映在您选择的方法中。是的,它可能会起作用,但是当您阅读ShowDialog() 时,会对行为有一定的期望。其他两行代码不会以任何方式影响性能。
  • 主窗体>(Showdialog)>form1>(dipose+showDialog)>form2(dipose)>主窗体
  • 也许您应该在关闭 form1 并设置适当的 DialogResult 后显示 form2。
【解决方案2】:

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

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

【讨论】:

  • 请举个例子。如果我使用close,资源会被释放吗?
  • @techno 可能不会,这取决于您没有提供的详细信息。进一步考虑,您可能会更好地重构代码以具有显示第一种形式然后显示第二种形式的控制组件。然后它可以在关闭时处理第一个表单。
  • “关闭”方法不起作用旧表单未关闭它存在于后台
  • @techno 然后发生了其他事情。但我怀疑您的问题是在其正常生命周期之后使用表单 - 被关闭 - 因此很容易打破 WinForms 内置的假设。特别是ShowDialog 在对话框关闭时返回。
  • @techno WinForms Form 实例有一个生命周期。这以调用其 Close 方法结束(可能来自 GUI,也可能来自代码)。在这一点上,除了提取数据之外,表单不再适用。您正在尝试执行进一步的 GUI 操作:打破该生命周期的假设。
【解决方案3】:

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

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

【讨论】:

  • 它很好,但在第一种情况下不需要 this.Close();
  • 我不确定您是否要手动调用 Dispose。我通常更喜欢 Close 并让框架自动调用 Dispose。
【解决方案4】:

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

我认为您必须调用“Show”方法,然后才能调用 dispose 方法。

【讨论】:

  • 我创建了 2 个 form2 并添加了以下代码:Form3 f = new Form3(); this.Dispose(); f.显示();它运行良好,也许您的应用程序中存在其他问题,当您运行您的应用程序时会发生什么?
【解决方案5】:

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

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

【讨论】:

    猜你喜欢
    • 2012-09-08
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多