Закройте дочернюю форму, если она уже открыта - PullRequest
1 голос
/ 25 мая 2010

Как я могу закрыть дочернюю форму, если она уже открыта? А если он еще не открыт, то открыть?

Спасибо

У меня уже есть этот код, который не работает, очевидно:

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

Все, что делает вышеизложенное, создает новую форму независимо от того, открыта она или нет.

Ответы [ 5 ]

2 голосов
/ 25 мая 2010

Если вы хотите открыть форму только в том случае, если она еще не открыта, тогда выведите ее на передний план, когда она есть, тогда следующий код может помочь.

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) на передний план. Если это не так, он просто создает экземпляр и открывает его.

Это то, что вы хотите?

2 голосов
/ 25 мая 2010
private Form frm;
public void ToggleForm() {
  if(frm == null) {
    frm = new Form();
    frm.Show();
  }
  else {
    frm.Close();
    frm = null;
  }
}
1 голос
/ 25 мая 2010

В основной форме, когда вы создаете первую дочернюю форму, сохраняйте ссылку на нее. В настоящее время вы создаете новую дочернюю форму каждый раз, когда запускаете этот код, а затем проверяете, видна ли вновь созданная форма.

Также имейте в виду, что ваш субъект говорит об открытии и закрытии, но ваш код, похоже, просто имеет дело с сокрытием и показом.

Код Карры - хороший пример того, как это сделать, но будьте осторожны, если форму ребенка можно закрыть из любого другого места.

0 голосов
/ 27 сентября 2011
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. например: call InstanceNewForm (me, form2)

Работает как очарование каждый раз !!

0 голосов
/ 25 мая 2010

Вам необходимо сохранить ссылку на ibx. Ваш код создает новый inbox при каждом запуске.

...