Как проверить, открыта ли форма Windows, и закрыть ее, если она есть? - PullRequest
70 голосов
/ 05 октября 2010

У меня есть форма "fm" , это простое информационное окно, которое открывается каждые 10 минут (fm.Show();).

Как я могу сделать так, чтобы каждые 10 минут он проверял, открыта ли форма "fm" , и если она открыта, она закрывает и открывает снова!

Теперь форма fm всегда создается с form fm = new form();
поэтому, когда я пытаюсь проверить, открыта ли форма, она всегда будет ложной и откроет новое окно, даже если раньше была одна форма!

Мне нужен инструмент, чтобы присвоить ему уникальную личность, а затем проверить, открыта ли эта форма с уникальной идентификацией или нет!

Я не хочу просто обновлять данные в форме (fm), потому что у меня есть сложная информация с кнопками.

Имя формы "UpdateWindow"

Спасибо

Ответы [ 25 ]

79 голосов
/ 05 октября 2010

может быть, это поможет:

FormCollection fc = Application.OpenForms;

foreach (Form frm in fc)
{
//iterate through
     if (frm.Name == "YourFormName")
     {
         bFormNameOpen = true;
     }
}

Некоторый код в foreach для определения конкретной формы, и это можно сделать.Хотя не проверено.

Найдено на http://bytes.com/topic/c-sharp/answers/591308-iterating-all-open-forms

33 голосов
/ 28 октября 2014

Я знаю, что я опоздал ... Но для тех, кому любопытно ... Это другой способ

if (Application.OpenForms.OfType<UpdateWindow>().Count() == 1)
    Application.OpenForms.OfType<UpdateWindow>().First().Close();

UpdateWindow frm = new UpdateWindow()
frm.Show();
14 голосов
/ 17 февраля 2013

Предположим, что если мы вызываем форму из щелчка по меню в форме MDI, нам нужно создать объявление экземпляра этой формы на верхнем уровне, например:

Form1 fm = null;

Затем нам нужно определитьсобытие щелчка меню, чтобы вызвать Form1 следующим образом:

private void form1ToolStripMenuItem_Click(object sender, EventArgs e)
{
    if (fm == null|| fm.Text=="")
    {
        fm = new Form1();              
        fm.MdiParent = this;
        fm.Dock = DockStyle.Fill;
        fm.Show();
    }
    else if (CheckOpened(fm.Text))
    {
        fm.WindowState = FormWindowState.Normal;
        fm.Dock = DockStyle.Fill;
        fm.Show();
        fm.Focus();               
    }                   
}

CheckOpened , определенный для проверки, Form1 уже открыта или нет:

private bool CheckOpened(string name)
{
    FormCollection fc = Application.OpenForms;

    foreach (Form frm in fc)
    {
        if (frm.Text == name)
        {
            return true; 
        }
    }
    return false;
}

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

10 голосов
/ 05 октября 2010

Я не уверен, что понимаю заявление. Надеюсь это поможет. Если вы хотите работать только с одним экземпляром этой формы, вам следует запретить вызов Form.Dispose при закрытии пользователя. Для этого вы можете обработать событие закрытия дочерней формы.

private void ChildForm_FormClosing(object sender, FormClosingEventArgs e)
{
    this.Hide();
    e.Cancel = true;
}

И тогда вам не нужно создавать новые экземпляры frm. Просто вызовите метод Show в экземпляре.

Вы можете проверить свойство Form.Visible, чтобы проверить, открыта ли форма в данный момент.

private ChildForm form = new ChildForm();

private void ReopenChildForm()
{
    if(form.Visible)
    {
        form.Hide();
    }
    //Update form information
    form.Show();
}

На самом деле, я до сих пор не понимаю, почему бы вам просто не обновить данные в форме.

3 голосов
/ 06 сентября 2018
Form fc = Application.OpenForms["UpdateWindow"]; 

if (fc != null) 
   fc.Close(); 

fc.Show();
2 голосов
/ 20 июня 2014
Form1 fc = Application.OpenForms["Form1 "] != null ? (Form1 ) Application.OpenForms["Form1 "] : null;
if (fc != null)
{
    fc.Close();
}

Он закроет форму1, которую вы можете открыть снова, если хотите, используя:

Form1 frm = New Form1();
frm.show();
1 голос
/ 22 июня 2017

попробуйте MDICHILD функция

public void mdiChild(Form mdiParent, Form mdiChild)
{
    foreach (Form frm in mdiParent.MdiChildren)
    {
        // check if name equals
        if (frm.Name == mdiChild.Name)
        {
            //close if found

            frm.Close();

            return;
        }
    }

    mdiChild.MdiParent = mdiParent;

    mdiChild.Show();

    mdiChild.BringToFront();
}
1 голос
/ 06 июля 2013
if( ((Form1)Application.OpenForms["Form1"]).Visible == true)
    //form is visible
else
    //form is invisible

где Form1 - это название вашей формы.

1 голос
/ 12 марта 2016

Попробуйте, это будет работать:

//inside main class
Form1 Fm1 = new Form1();<br>

//in button click
if (Fm1.IsDisposed)
{
    Fm1 = new Form();
}
Fm1.Show();
Fm1.BringToFront();
Fm1.Activate();
0 голосов
/ 24 декабря 2017

Я думаю, мой метод самый простой .

    Form2 form2 = null;
    private void SwitchFormShowClose_Click(object sender, EventArgs e)
    {  
        if(form2 == null){
            form2 = new Form2();
            form2.Show();
        }
        else{
            form2.Close();
            form2 = null;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...