【问题标题】:How to avoid child form dispose when disposing its parent?处置其父母时如何避免子形式处置?
【发布时间】:2012-10-11 09:46:11
【问题描述】:

我有两个form1和form2,这是创建form1后创建form2的代码

F2=new Form2();
F2.Dock = DockStyle.Fill;
F2.TopLevel = false;
F2.Parent = F1;//setting the parent of form1 to be form1

另外,我希望在我的应用程序中只有一个 Form2 对象,但父级发生了变化,因此 F1 可以被释放并将 F2 父级设置为 Form1 类型的其他对象。 现在当我处置F1时,处置F2时如何避免处置F1时处置F2? 有没有办法从孩子那里得到 onparentdispose 事件然后改变它的父母呢?

编辑:

我只想要每个红色表单的绿色表单,但蓝色表单的布局会发生变化,因此会被丢弃

【问题讨论】:

  • 也许尝试挂钩 F1 关闭事件?
  • 我认为这可能是“启动窗体关闭时退出应用程序”的问题。
  • 当 F1 是主窗体时,您的应用将关闭。否则,请勿将 F1 设置为 Parent。
  • 父窗体不是主窗体
  • 哎哟。您是否尝试自己重新创建最大化的 MDI 子窗体?

标签: c# winforms


【解决方案1】:

您可以在FormClosing 事件中获取 F1 的子表单并将其父表单设置为另一个表单:

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    foreach (Form frm in this.Controls.OfType<Form>())
    {
        frm.Parent = Application.OpenForms.OfType<Form1>().First(f => f.Tag == "Foo");
    }
}

.First(f =&gt; f.Tag == "Foo") 更改为您想要的查找另一个 F1 实例的方式!

【讨论】:

    【解决方案2】:

    您可以使用全局静态变量来指向 Form2 的实例。例如:

    public class Globals
    {
        public static Form2 form2;
    }
    

    当您创建 Form2 对象时,将其分配给 Globals.Form2 变量。

    F2=new Form2();
    F2.Dock = DockStyle.Fill;
    F2.TopLevel = false;
    F2.Parent = F1;//setting the parent of form1 to be form1
    Globals.form2 = F2; // Save it to an global variable
    

    然后,在 Form1 的 FormClosing 事件处理程序中,将 Gloabls.Form2.Parent 属性设置为另一个表单对象(例如您的主表单)或 null。这样,当 Form1 被释放时,您的 Form2 对象将保持活动状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-17
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-26
      相关资源
      最近更新 更多