Jak sprawdzić, czy formularz okna jest już otwarty i zamknąć, jeśli jest?


79

Mam formularz „fm”, który jest prostym oknem informacyjnym, które otwiera się co 10 minut ( fm.Show();).

Jak mogę sprawić, że co 10 minut będzie sprawdzać, czy formularz „fm” jest otwarty, a jeśli jest otwarty, zamyka go i otwiera ponownie!

Teraz formularz fm jest zawsze tworzony za pomocą, form fm = new form();
więc gdy próbuję sprawdzić, czy formularz jest otwarty, zawsze będzie fałszywy i otworzy nowe okno, nawet jeśli wcześniej był jeden formularz!

Muszę mieć narzędzie, które nada mu unikalną tożsamość, a następnie sprawdź, czy ten formularz z unikalną tożsamością jest otwarty, czy nie!

Nie chcę tylko aktualizować danych na formularzu (fm), bo mam skomplikowaną informację z przyciskami.

Nazwa formularza to "UpdateWindow"

Dzięki


1
Dlaczego chcesz go ponownie otworzyć? Chcesz utworzyć nową instancję? To znaczy, dlaczego nie chcesz jeszcze raz wywołać metody Show?
domyślny język

cześć cały program to wewnętrzne narzędzie w naszej firmie, które sprawdza czy jest aktualizacja do któregoś z naszych programów, działało dobrze, ale potrzebuję go, żeby go zamknąć i ponownie otworzyć bo otrzymuje aktualne informacje
Data-Base

2
Dlaczego po prostu nie dodasz komponentu Timer do formularza i nie użyjesz timera do wymuszenia aktualizacji danych na wyświetlaczu? Co więcej, możesz powiązać kontrolki z danymi z obiektem w celu automatycznej aktualizacji statusu.
Chris Thompson,

2
Rozwiązuję to za pomocą tego rozwiązania ... Form fc = Application.OpenForms ["UpdateWindow"]; if (fc! = null) fc.Close (); fm.Show (); więc co myślicie chłopaki?
Baza danych

Zadeklaruj globalny obiekt statyczny tego typu formularza, przypisz nowo utworzony obiekt do tego obiektu statycznego. W dyspozycji ustaw na null. za każdym razem, gdy będziesz tworzyć nowy formularz, sprawdź najpierw, czy obiekt statyczny ma wartość NULL, czy nie. To bardziej kompaktowe rozwiązanie niż jakiekolwiek inne.
Lali,

Odpowiedzi:


92

może to pomoże:

FormCollection fc = Application.OpenForms;

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

Jakiś kod w foreach, aby wykryć określony formularz i można to zrobić. Jednak nie przetestowane.

Znalezione na http://bytes.com/topic/c-sharp/answers/591308-iterating-all-open-forms


Dzięki, więc jak go używać z moim formularzem (fm)?
Baza danych

if (frm to MyForm) {/ * * /}, powinno załatwić sprawę. Ale jeśli jest to tylko aktualizacja, dlaczego nie wywołać metody w celu zaktualizowania danych?
Sascha

12
Rozwiązuję to za pomocą tego .... Form fc = Application.OpenForms ["UpdateWindow"]; if (fc! = null) fc.Close (); fm.Show ();
Baza danych

1
Otrzymałem ten błąd po zamknięciu formularza z nim: System.InvalidOperationException: 'Kolekcja została zmodyfikowana; operacja wyliczenia może nie zostać wykonana. '
noobsee

45

Wiem, że się spóźniłem ... Ale dla ciekawskich ... To jest inny sposób

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

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

O wiele lepsze wykorzystanie ram niż akceptowana odpowiedź imho.
Gaspa79

14

Załóżmy, że jeśli wywołujemy formularz z menu i klikamy na formularz MDI, to musimy utworzyć deklarację instancji tego formularza na najwyższym poziomie w następujący sposób:

Form1 fm = null;

Następnie musimy zdefiniować zdarzenie kliknięcia menu, aby wywołać Form1 w następujący sposób:

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 zdefiniowane sprawdzić Form1 jest już otwarty, czy nie:

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

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

Mam nadzieję, że rozwiąże to problemy związane z tworzeniem wielu wystąpień formularza, a także skupianiem się na Form1 po kliknięciu menu, jeśli jest już otwarty lub zminimalizowany.


10

Nie jestem pewien, czy rozumiem to stwierdzenie. Mam nadzieję że to pomoże. Jeśli chcesz operować tylko z jednym wystąpieniem tego formularza, powinieneś uniemożliwić wywołanie Form.Dispose przy zamknięciu użytkownika. Aby to zrobić, możesz obsłużyć zdarzenie Closing formularza podrzędnego.

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

Nie musisz wtedy tworzyć nowych instancji frm . Po prostu wywołaj metodę Show w instancji.

Możesz sprawdzić właściwość Form.Visible, aby sprawdzić, czy formularz jest aktualnie otwarty.

private ChildForm form = new ChildForm();

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

Właściwie nadal nie rozumiem, dlaczego po prostu nie zaktualizujesz danych w formularzu.


to interesujące, ale jak mogę zidentyfikować formularz, mam na myśli, że używamy form fm = new form (); więc zawsze jest to nowa forma, więc jak mogę zidentyfikować formularz?
Baza danych

Jeśli jest to tylko jedna taka forma, możesz utworzyć dla niej zmienną na poziomie klasy. Jeśli istnieje wiele formularzy utworzonych w zestawie metod, lepiej użyj podejścia Saschy)
domyślne ustawienie regionalne

1
Rozwiązuję to, sprawdzając, czy formularz jest otwarty według nazwy, a następnie zamykam go, jeśli jest otwarty. Form fc = Application.OpenForms ["UpdateWindow"]; if (fc! = null) fc.Close (); fm.Show ();
Baza danych

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

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

fc.Show();

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

Spowoduje to zamknięcie formularza 1 możesz ponownie otworzyć ten formularz, jeśli chcesz, używając:

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

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

gdzie Form1jest nazwa twojego formularza.


1

Spróbuj tego, zadziała:

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

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

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

Jeśli instancja formularza nie jest otwarta, przejdzie do pętli IF.


1

spróbuj tej funkcji 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();
}

0

Spróbuj podłączyć poniżej,

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

Łącząc powyższe zdarzenie, powie ci, kiedy formularz jest zminimalizowany, częściowo / całkowicie ukryty przez inny formularz.


0

To jest to, czego używałem do zamykania wszystkich otwartych formularzy (z wyjątkiem formularza głównego)

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

0

Zabawne, musiałem dodać do tego wątku.

1) Dodaj globalną zmienną na form.show () i wyczyść zmienną na form.close ()

2) W formularzu nadrzędnym dodaj licznik czasu. Pozostaw formularz dla dziecka otwarty i aktualizuj swoje dane co 10 minut.

3) umieść licznik czasu w formularzu podrzędnym, aby zaktualizować dane o sobie.


0

* Mam nadzieję, że to zadziała dla ciebie

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

0

Spróbuj tego

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

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

Chociaż ten fragment kodu może rozwiązać problem, dołączenie wyjaśnienia naprawdę pomaga poprawić jakość Twojego posta. Pamiętaj, że odpowiadasz na pytanie do czytelników w przyszłości, a osoby te mogą nie znać powodów, dla których zaproponowałeś kod. Prosimy również starać się nie wypełniać kodu komentarzami wyjaśniającymi, ponieważ zmniejsza to czytelność zarówno kodu, jak i wyjaśnień!
Goodbye StackExchange

0

Formuj tylko raz

Jeśli Twoim celem jest zablokowanie wielu wystąpień formularza, rozważ następujące ...

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

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

Spróbuj To jest krótki pomysł, aby sprawdzić, czy formularz jest otwarty, czy nie


0

W mojej aplikacji miałem formularz menu głównego, który zawierał przyciski do przechodzenia do zestawu innych formularzy (zwanych również podformularzami). Chciałem, aby w danym momencie działało tylko jedno wystąpienie każdego podformularza. Poza tym chciałem się upewnić, że jeśli użytkownik spróbuje uruchomić już istniejący podformularz, będzie on zmuszony do wyświetlenia „z przodu i środka”, jeśli zostanie zminimalizowany lub za oknami innych aplikacji. Korzystając z obecnie najczęściej ocenianych odpowiedzi, przełożyłem ich odpowiedzi na to:

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

0

U mnie to zadziałało:

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

Pamiętaj, aby dodać więcej informacji o tym, co robisz w swoim kodzie
xsami

0

Myślę, że moja metoda jest najprostsza .

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

0

Poniższe faktycznie działa bardzo dobrze.

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

Dziękujemy za ten fragment kodu, który może zapewnić ograniczoną krótkoterminową pomoc. Właściwe wyjaśnienie znacznie poprawiłoby jego długoterminową wartość, pokazując, dlaczego jest to dobre rozwiązanie problemu i uczyniłoby go bardziej użytecznym dla przyszłych czytelników z innymi, podobnymi pytaniami. Zmień swoją odpowiedź, dodając wyjaśnienie, w tym przyjęte przez siebie założenia
Shawn C.

0

to słowo na pewno. Używam tej funkcji również dla siebie.

  public static bool isFormOpen(Form formm)
    {

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

        return false;
    }

0

Poprawiłem wcześniejszy post, który zrobiłem. Działa to bezbłędnie, bez konieczności powtarzania wszystkich otwartych form.

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

0

spróbuj tego, nie musisz iterować przez formularze:

if(Application.OpenForms["<your_form_name>"] != null){

   //Your form is already open

}
else {

  //Your form isn't open

}

0

Działa to, jeśli chcesz sprawdzić, czy drugi formularz jest już otwarty i unikać otwierania go ponownie po kliknięciu przyciskiem.

 int formcheck = 0;
    private void button_click()
    {
       Form2Name myForm2 = new Form2Name();
       if(formcheck == 0)
       {
          myForm2.Show(); //Open Form2 only if its not active and formcheck == 0
          // Do Somethin

          formcheck = 1; //Set it to 1 indicating that Form2 have been opened
       {   
    {

-1

Ponadto może to pomoże


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.