Как проверить, открыта ли форма для Windows, и закрыть ее, если она есть? - программирование
Подтвердить что ты не робот

Как проверить, открыта ли форма для Windows, и закрыть ее, если она есть?

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

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

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

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

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

Имя формы "UpdateWindow"

Спасибо

4b9b3361

Ответ 1

возможно это поможет:

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

Ответ 2

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

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

UpdateWindow frm = new UpdateWindow()
frm.Show();

Ответ 3

Предположим, если мы вызываем форму из меню, кликаем по форме 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 при щелчке по меню, если он уже открыт или сведен к минимуму.

Ответ 4

Я не уверен, что понимаю это утверждение. Надеюсь это поможет. Если вы хотите работать только с одним экземпляром этой формы, вы должны предотвратить 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();
}

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

Ответ 5

Form fc = Application.OpenForms["UpdateWindow"]; 

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

fc.Show();

Ответ 6

Form1 fc = Application.OpenForms["Form1 "] != null ? (Form1 ) Application.OpenForms["Form1 "] : null;
if (fc != null)
{
    fc.Close();
}

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

Form1 frm = New Form1();
frm.show();

Ответ 7

if( ((Form1)Application.OpenForms["Form1"]).Visible == true)
    //form is visible
else
    //form is invisible

где Form1 - имя вашей формы.

Ответ 8

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

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

//in button click
if (Fm1.IsDisposed)
{
    Fm1 = new Form();
}
Fm1.Show();
Fm1.BringToFront();
Fm1.Activate();

Ответ 9

попробуйте эту функцию 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();
}

Ответ 10

Попробуйте подключиться ниже,

private void frmMyForm_Deactivate(object sender, EventArgs e)
    {
        // Raise your flag here.
    }

Проводя над событием выше, он будет сообщать вам всякий раз, когда форма минимизируется, частично/полностью скрывается другой формой.

Ответ 11

Это то, что я использовал для закрытия всех открытых форм (кроме основной формы)

    private void CloseOpenForms()
    {

           // Close all open forms - except for the main form.  (This is usually OpenForms[0].
           // Closing a form decrmements the OpenForms count
           while (Application.OpenForms.Count > 1)
           {
               Application.OpenForms[Application.OpenForms.Count-1].Close();
           }
    }

Ответ 12

Смешно, мне пришлось добавить к этой теме.

1) Добавьте глобальный var в form.show() и очистите var на form.close()

2) В родительской форме добавьте таймер. Храните дочернюю форму открытой и обновляйте данные каждые 10 минут.

3) поместите таймер в дочернюю форму, чтобы он сам обновлял данные.

Ответ 13

* Надеюсь, что это сработает для u

System.Windows.Forms.Form f1 = System.Windows.Forms.Application.OpenForms["Order"];
if(((Order)f1)!=null)
{
//open Form
}
else
{
//not open
}

Ответ 14

попробуйте это

 bool IsOpen = false;
    foreach (Form f in Application.OpenForms)
    {
        if (f.Text == "Form2")
        {
            IsOpen = true;
            f.Focus();
            break;
        }
    }

    if (IsOpen == false)
    {
        Form2 f2 = new Form2();
        f2.MdiParent = this;
        f2.Show();
    }

Ответ 15

 private static Form IsFormAlreadyOpen(Type formType)
 {
     return Application.OpenForms.Cast<Form>().FirstOrDefault(openForm => openForm.GetType() == formType);
 }

Ответ 16

Форма только один раз

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

public class MyForm : Form
{
    private static MyForm alreadyOpened = null;

    public MyForm()
    {
        // If the form already exists, and has not been closed
        if (alreadyOpened != null && !alreadyOpened.IsDisposed)
        {
            alreadyOpened.Focus();            // Bring the old one to top
            Shown += (s, e) => this.Close();  // and destroy the new one.
            return;
        }           

        // Otherwise store this one as reference
        alreadyOpened = this;  

        // Initialization
        InitializeComponent();
    }
}

Ответ 17

Form user_rpt = Application.OpenForms["frmUesr_reports"];
        if (user_rpt == null)
        {
            /// Do Something here
        }

Попробуйте это Это краткая идея, чтобы проверить, что форма открыта или не открыта.

Ответ 18

В моем приложении у меня была форма mainmenu, у которой были кнопки для перехода к ассортименту других форм (также называемых субформ). Я хотел, чтобы за один раз запускался только один экземпляр каждой подформы. Кроме того, я хотел бы убедиться, что пользователь попытался запустить уже существующую подформу, что подформация будет вынуждена показать "фронт и центр", если они сведены к минимуму или за окнами других приложений. Используя самые в настоящее время ответы, я реорганизовал их ответы на это:

private void btnOpenSubForm_Click(object sender, EventArgs e)
    {

        Form fsf = Application.OpenForms["formSubForm"];

        if (fsf != null)
        {
            fsf.WindowState = FormWindowState.Normal;
            fsf.Show();
            fsf.TopMost = true;
        }
        else
        {
            Form formSubForm = new FormSubForm();
            formSubForm.Show();
            formSubForm.TopMost = true;
        }
    }

Ответ 19

if (Application.OpenForms["Form_NAME"] == null)
{
   new Form_NAME().Show();
}

Если экземпляр формы не открыт, он войдет в цикл IF.

Ответ 20

Это сработало для меня:

public void DetectOpenedForm()
{
    FormCollection AllForms = Application.OpenForms;
    Boolean FormOpen = false;
    Form OpenedForm = new Form();
    foreach (Form form in AllForms)
    {
        if (form.Name == "YourFormName")
        {
            OpenedForm = form;
            FormOpen = true;
        }
    }
    if (FormOpen == true)
    {
        OpenedForm.Close();
    }
}

Ответ 21

Я считаю, что мой метод простейший.

    Form2 form2 = null;
    private void SwitchFormShowClose_Click(object sender, EventArgs e)
    {  
        if(form2 == null){
            form2 = new Form2();
            form2.Show();
        }
        else{
            form2.Close();
            form2 = null;
        }
    }

Ответ 22

Ниже на самом деле работает очень хорошо.

private void networkInformationToolStripMenuItem_Click(object sender, EventArgs e)
{
    var _open = false;
    FormCollection fc = Application.OpenForms;
    foreach (Form frm in fc)
    {
        if (frm.Name == "FormBrowseNetworkInformation")
        {
            _open = true;
            frm.Select();
            break;
        }
    }
    if (_open == false)
    {
        var formBrowseNetworkInformation = new FormBrowseNetworkInformation();
        formBrowseNetworkInformation.Show();
    }
}

Ответ 23

это будет слово определенно. Я использую эту функцию и для себя.

  public static bool isFormOpen(Form formm)
    {

        foreach (Form OpenForm in Application.OpenForms)
        {
            if (OpenForm.Name == formm.Name)
            {
                return true;
            }
        }

        return false;
    }

Ответ 24

Я подправил предыдущий пост, который сделал. Эта работа без нареканий без необходимости повторять все открытые формы.

        Form fc = Application.OpenForms["FormBrowse"];
        if (fc != null)
        {
            fc.Select();
        }
        else
        {
            var formBrowse = new FormBrowse();
            formBrowse.Show();
        }

Ответ 25

Кроме того, возможно, это поможет


class Helper
    {
        public void disableMultiWindow(Form MdiParent, string formName)
        {
            FormCollection fc = Application.OpenForms;
            try
            {
                foreach (Form form in Application.OpenForms)
                {
                    if (form.Name == formName)
                    {
                        form.BringToFront();
                        return;
                    }
                }

                Assembly thisAssembly = Assembly.GetExecutingAssembly();
                Type typeToCreate = thisAssembly.GetTypes().Where(t => t.Name == formName).First();
                Form myProgram = (Form)Activator.CreateInstance(typeToCreate);
                myProgram.MdiParent = MdiParent;
                myProgram.Show();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }
    }