【问题标题】:Weird behaviour in showing hidden ownerform, on closing child form在关闭子窗体时显示隐藏的所有者窗体的奇怪行为
【发布时间】:2012-09-06 08:24:17
【问题描述】:

简介:代码(两个函数)解释了我正在尝试做的所有事情,并用数字说明了我的问题

每当我必须在我的应用程序中打开一个新的子表单时。我用来调用以下函数。 (一个子窗体可以有另一个子窗体)

    public void openNextForm(Form f1, Form f2)
    {
        f2.Owner = f1;                  
        f2.WindowState = FormWindowState.Maximized;
        f2.FormClosing += new FormClosingEventHandler(f_FormClosing);
        f1.Hide();
        f2.ShowDialog();
    }



    // When I close a child form by clicking cross or with ALT-F4
    void f_FormClosing(object sender, FormClosingEventArgs e)
    {
        Form f = sender as Form;
        f.Owner.Show();
    }

在关闭子表单时,我用来显示所有者/父表单。一切正常。

但在某些情况下,所有者表单的某些控件(按钮)在显示在关闭子表单时会被隐藏,例如

但是这个表单的实际状态是

只有当我从一个复杂而冗长的编码子表单返回时,我才必须面对这种行为(在这种情况下,它有时会正常工作)。在简单(小编码)子表单的情况下,行为是正常的。

如果我在行为怪异的表单上按 alt 键,则 from 在实际状态下令人惊讶地显示

我试图寻找这个问题并发现了很多类似的问题,但我能看到的最接近的是以下问题,但在 showdialog 的情况下它仍然无法帮助我

C# Form Problem: new form losing control and randomly hiding

如果使用上面链接中的以下代码,每当我打开一个子表单然后再打开一个子表单时。所有表格都被隐藏。所以它也不能正常工作。

    public void openNextForm(Form f1, Form f2)
    {
        f2.Owner = f1;            
        f2.Show();
        f1.Hide();
        f2.FormClosing += new FormClosingEventHandler(f_FormClosing);
    }

使用标签应该是一种解决方案,但我希望在关闭/隐藏/显示期间在所有情况下保持表单分离和一致的行为

【问题讨论】:

  • 检查您所提出问题的答案,其中指出您不应该在显示孩子之前隐藏父母,而您不这样做。
  • @Furqan 我实际上需要 showdialog 并且在对话框的情况下我必须在 showdialog 之前隐藏,否则两种表单都会显示。我仍然尝试过,但行为与我的代码相同。
  • 解决它或投票让它变得非凡。

标签: c# winforms desktop-application show-hide formclosing


【解决方案1】:

不确定它是否能解决问题,但我看到可以进行一些改进,这可能会奏效。

请注意,无法验证它是否有效。

   

public void openNextForm(Form f1, Form f2)
    {
        // we don't need ownership since f1 is hidden.                
        // f2.Owner = f1; 
        f2.WindowState = FormWindowState.Maximized;
        // we don't need this event handled since we use ShowDialog
        //f2.FormClosing += new FormClosingEventHandler(f_FormClosing);
        // The following should hide f1 after f2 is displayed even when using dialog
        f2.Shown += (s, e) => {
            f1.Hide();
        };
        f2.ShowDialog();
        f1.Show();
    }

【讨论】:

  • 充分的理由。谢谢。我从未见过像 f2.Shown += (s, e) => { f1.Hide(); 这样的东西。 } 但是,我只是测试它是否接受。
  • 它的工作完美无缺。绝招。非常感谢。很高兴向您展示赏金:)
  • 这需要 11 个小时,然后我可以奖励赏金 :)
  • 请在f2.Shown后加分号+= (s, e) => { f1.Hide(); } 因为它给出了语法错误。并且请稍微解释一下这条线,好像我将来需要使用类似的东西,我会理解它。
  • f2.Shown += (s, e) => { f1.Show; } 是一个 Lamba 表达式,它基本上是定义匿名方法的一种简短方式。我在这里使用它来定义一个事件处理程序,这也可以按照您处理 FormClosing 事件的方式完成。非常简单快捷。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 2015-04-05
相关资源
最近更新 更多