【问题标题】:Close child form if already open如果已经打开,请关闭子窗体
【发布时间】:2010-05-25 12:26:58
【问题描述】:

如果子表单已经打开,我该如何关闭它?如果它还没有打开,那么打开它?

谢谢

我已经有这段代码了,显然不行:

Form ibx = new inbox();
if(ibx.Visible)
ibx.Dispose();
else
ibx.Show();

上面所做的只是创建一个新表单,无论它是否已经打开。

【问题讨论】:

  • 我不明白这个问题。
  • 您是否只想一次打开给定表单的一个实例?
  • 让我试着解释一下……
  • @Vasiliy:如果用户单击按钮,则主窗体将打开智利窗体。如果用户随后再次单击主窗体中的相同按钮,则应关闭相同的子窗体。这有帮助吗?
  • @Will:是的。 :) - 我已经接受了答案。但是谢谢你:)

标签: c# .net winforms forms


【解决方案1】:
private Form frm;
public void ToggleForm() {
  if(frm == null) {
    frm = new Form();
    frm.Show();
  }
  else {
    frm.Close();
    frm = null;
  }
}

【讨论】:

    【解决方案2】:

    如果您想要实现的是仅在表单尚未打开时才打开它,然后在打开时将其放在前面,那么以下代码可能会有所帮助。

    private void tsmiMenuOption_Click(object sender, EventArgs e) {
        // Assuming this method is part of an MDI form.
        foreach(Form child in this.MdiChildren)
            if (child.Name == MyForm.Name) {
                child.BringToFront();
                return;
            }
    
        MyForm f = new MyForm();
        f.MdiParent = this;
        f.Show();
    }
    

    因此,这是未经测试的伪 C# 代码,用于验证 MyForm 是否已打开并包含在 MdiContainer.Children 中。如果是,那么它会将这个表单 (MyForm) 放在前面。如果不是,那么它只是实例化并打开它。

    这就是你想要的吗?

    【讨论】:

    • 你的答案背后的逻辑是正确的,当场,但是我没有使用 MDI,但是当我在几天后为一个单独的项目做这个答案时肯定会派上用场。非常感谢:) +1
    • 感谢您提及我的回答会对您有所帮助!使用 Linq 左右可能还有其他一些聪明的方法。 =)
    • MyForm.Name 可用吗?
    【解决方案3】:

    在您的主窗体中,当您创建第一个子窗体时,请保留对它的引用。目前,您每次运行该代码时都会创建一个新的子表单,然后检查新创建的表单是否可见。

    另外请注意,您的主题谈论的是打开和关闭,但您的代码似乎只是在处理隐藏和显示。

    Carra 的代码是一个很好的示例,但要小心,如果子窗体可以从其他任何地方关闭。

    【讨论】:

      【解决方案4】:

      您需要保留对ibx 的引用。您的代码每次运行时都会创建一个新的inbox

      【讨论】:

        【解决方案5】:
        Module Module1
        
        Public Function InstanceNewForm(ByRef ParentForm As Form, ByRef Childform As Form) As Boolean
        
            Dim bOpen As Boolean = False
            Dim frm As Form
        
            For Each frm In ParentForm.MdiChildren
                If Childform.Name = frm.Name Then
                    Childform.Focus()
                    bOpen = True
                    Exit For
                End If
            Next
        
            If Not bOpen Then
                With Childform
                    .StartPosition = FormStartPosition.CenterScreen
                    .MdiParent = Parentform
                    .Show()
                End With
            End If
        
            frm = Nothing
        
            Return bOpen
        
        End Function
        
        End Module
        

        上面的代码将检查一个 mdi 表单是否已经加载到父容器中,如果它已经处于活动状态,则将焦点设置在它上面。否则它将创建 mdi 表单。

        只需从需要加载 mdi 表单的任何地方调用它。例如:调用 InstanceNewForm(me,form2)

        每次都像魅力一样工作!

        【讨论】:

          猜你喜欢
          • 2013-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多