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
Odpowiedzi:
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
źródło
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();
źródło
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.
źródło
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.
źródło
Form fc = Application.OpenForms["UpdateWindow"]; if (fc != null) fc.Close(); fc.Show();
źródło
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();
źródło
if( ((Form1)Application.OpenForms["Form1"]).Visible == true) //form is visible else //form is invisible
gdzie
Form1
jest nazwa twojego formularza.źródło
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();
źródło
if (Application.OpenForms["Form_NAME"] == null) { new Form_NAME().Show(); }
Jeśli instancja formularza nie jest otwarta, przejdzie do pętli IF.
źródło
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(); }
źródło
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.
źródło
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(); } }
źródło
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.
źródło
* 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 }
źródło
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(); }
źródło
private static Form IsFormAlreadyOpen(Type formType) { return Application.OpenForms.Cast<Form>().FirstOrDefault(openForm => openForm.GetType() == formType); }
źródło
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(); } }
źródło
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
źródło
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; } }
źródło
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(); } }
źródło
Form2 form2 = null; private void SwitchFormShowClose_Click(object sender, EventArgs e) { if(form2 == null){ form2 = new Form2(); form2.Show(); } else{ form2.Close(); form2 = null; } }
źródło
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
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; }
źródło
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
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 }
źródło
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 { {
źródło
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); } } }
źródło