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

Baza danych
źródło
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

Sascha
źródło
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();
Seshagiri
źródło
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.

Praveen VR
źródło
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.

domyślne ustawienie regionalne
źródło
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();
Kashif Faraz
źródło
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();
Hengki Lodwig
źródło
1
if( ((Form1)Application.OpenForms["Form1"]).Visible == true)
    //form is visible
else
    //form is invisible

gdzie Form1jest nazwa twojego formularza.

kaMChy
źródło
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();
Litin Kuriachan
źródło
1
if (Application.OpenForms["Form_NAME"] == null)
{
   new Form_NAME().Show();
}

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

NIRANJAN PHANSALKAR
źródło
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();
}
Ramgy Borja
źródło
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.

Sabri Ghaith
źródło
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();
           }
    }
Jim Lahman
źródło
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.

Louie Avila
źródło
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
}
naeemshah1
źródło
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();
    }
Tanmay Nehete
źródło
0
 private static Form IsFormAlreadyOpen(Type formType)
 {
     return Application.OpenForms.Cast<Form>().FirstOrDefault(openForm => openForm.GetType() == formType);
 }
Castiel
źródło
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();
    }
}
Lewita
źródło
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

Ram Prasad Joshi
źródło
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;
        }
    }
Deron Dilger
źródło
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();
    }
}
Adrian Dinu
źródło
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;
        }
    }
Beyondo
źródło
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();
    }
}

źródło
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;
    }
Sayed Muhammad Idrees
źródło
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();
        }

źródło
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

}
FarhadMohseni
źródło
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
       {   
    {
Czad
źródło
-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); }
        }
    }

Slomotion Jakarta
źródło