Как проверить, открыта ли уже форма windows, и закрыть ее, если она есть?


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

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

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

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

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

имя формы "UpdateWindow"

решается с помощью следующего:

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

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

fc.Show();
23 61

23 ответа:

может это поможет:

FormCollection fc = Application.OpenForms;

foreach (Form frm in fc)
{
//iterate through
}

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

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

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

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

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

предположим, что если мы вызываем форму из меню нажмите на форму 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();               
    }                   
}

The 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 on щелкните, если оно уже открыто или свернуто.

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

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

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

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

private ChildForm form = new ChildForm();

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

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

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

он закроет form1 вы можете открыть эту форму снова, если вы хотите его с помощью:

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

здесь Form1 - это имя вашей формы.

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

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

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

попробуй такое 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();
}

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

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

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

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

    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();
           }
    }

смешно, я должен был добавить к этой теме.

1) Добавить глобальный var на форме.показать () и очистить var на форме.закрыть()

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

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

* надеюсь, что это будет работать для U

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

попробуй такое

 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();
    }
 private static Form IsFormAlreadyOpen(Type formType)
 {
     return Application.OpenForms.Cast<Form>().FirstOrDefault(openForm => openForm.GetType() == formType);
 }

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

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

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();
    }
}
Form user_rpt = Application.OpenForms["frmUesr_reports"];
        if (user_rpt == null)
        {
            /// Do Something here
        }

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

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

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;
        }
    }
if (Application.OpenForms["Form_NAME"] == null)
{
   new Form_NAME().Show();
}

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

это сработало со мной:

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();
    }
}

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

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

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

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();
    }
}
Form fc = Application.OpenForms["UpdateWindow"]; 

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

fc.Show();

кроме того, может быть это поможет


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); }
        }
    }