it-swarm.com.de

Wie prüfe ich, ob ein Windows-Formular bereits geöffnet ist, und schließe es, wenn?

Ich habe ein Formular "fm" das ist ein einfaches Infofenster, das sich alle 10 Minuten öffnet (fm.Show();).

Wie ich das alle 10 Minuten machen kann, wird geprüft, ob das Formular "fm" geöffnet ist und wenn es geöffnet ist, wird es geschlossen und erneut geöffnet!

Das Formular fm wird jetzt immer mit form fm = new form(); erstellt.
Wenn ich versuche zu prüfen, ob das Formular geöffnet ist, ist es immer falsch und öffnet ein neues Fenster, selbst wenn es ein Formular gibt!

Ich brauche ein Werkzeug, um ihm eine eindeutige Identität zu geben und dann zu prüfen, ob dieses Formular mit eindeutiger Identität geöffnet ist oder nicht!

Ich möchte nicht nur die Daten auf dem Formular (fm) aktualisieren, weil ich eine komplizierte Info mit Schaltflächen habe.

Der Name des Formulars lautet "UpdateWindow"

Gelöst mit dem Folgenden:

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

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

fc.Show();
63
Data-Base

vielleicht hilft das:

FormCollection fc = Application.OpenForms;

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

Etwas Code in foreach, um das spezifische Formular zu erkennen, und es könnte gemacht werden. Nicht getestet.

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

70
Sascha

Ich weiß, ich bin spät dran ... Aber für Neugierige ... Dies ist ein anderer Weg

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

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

Angenommen, wir rufen ein Formular aus einem Menü auf und klicken auf MDI. Dann müssen wir die Instanzdeklaration dieses Formulars auf oberster Ebene folgendermaßen erstellen:

Form1 fm = null;

Dann müssen wir das Menüklickereignis definieren, um Form1 wie folgt aufzurufen:

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

Das CheckOpened , das definiert ist, um zu überprüfen, ob Form1 bereits geöffnet ist oder nicht:

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

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

Ich hoffe, dadurch werden die Probleme beim Erstellen mehrerer Instanzen eines Formulars gelöst. Außerdem wird der Fokus auf Form1 beim Klicken auf das Menü gelegt, wenn es bereits geöffnet oder minimiert ist.

12
Praveen VR

Ich bin nicht sicher, ob ich die Aussage verstehe. Hoffe, das hilft. Wenn Sie nur mit einer Instanz dieses Formulars arbeiten möchten, sollten Sie verhindern, dass Form.Dispose beim Schließen des Benutzers aufgerufen wird. Zu diesem Zweck können Sie das Closing-Ereignis des untergeordneten Formulars behandeln.

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

Und dann müssen Sie keine neuen Instanzen von frm erstellen. Rufen Sie einfach die Show-Methode für die Instanz auf.

Sie können die Form.Visible-Eigenschaft überprüfen, um zu prüfen, ob das Formular momentan geöffnet ist.

private ChildForm form = new ChildForm();

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

Eigentlich verstehe ich immer noch nicht, warum Sie nicht einfach die Daten auf dem Formular aktualisieren.

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

Das Formular1 wird geschlossen, wenn Sie es mit folgendem Befehl öffnen möchten:

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

dabei ist Form1 der Name Ihres Formulars.

1
kaMChy

probiere dieseMDICHILDFunktion 

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

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

fc.Show();
1
Kashif Faraz

Probieren Sie es aus, es wird funktionieren:

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

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

Bilden Sie nur einmal

Wenn Sie mehrere Instanzen einer Firma zulassen möchten, sollten Sie Folgendes beachten:.

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
Levit

Ich denke, meine Methode ist die einfachste .

    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
X Stylish

In meiner App hatte ich ein Hauptmenü-Formular mit Schaltflächen zum Navigieren zu einer Reihe anderer Formulare (auch als Unterformulare bezeichnet). Ich wollte nur eine Instanz jedes Unterformulars gleichzeitig ausführen. Außerdem wollte ich sicherstellen, dass bei einem Benutzer, der versucht, ein bereits vorhandenes Unterformular zu starten, sichergestellt wird, dass das Unterformular gezwungen ist, "front & center" anzuzeigen, wenn es minimiert oder hinter anderen Anwendungsfenstern liegt. Mit den aktuell am meisten bewerteten Antworten habe ich ihre Antworten folgendermaßen überarbeitet:

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

Try This Dies ist die kurze Idee, ob das Formular offen oder nicht geöffnet ist

0

versuche dies

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

Das funktionierte von mir aus:

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

* Hoffnung Dies wird für u funktionieren

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

Versuchen Sie, unten zu verbinden,

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

Durch die Verdrahtung des Ereignisses erfahren Sie, wann das Formular minimiert, von einem anderen Formular teilweise/vollständig ausgeblendet wird.

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

Wenn die Formularinstanz nicht geöffnet ist, tritt sie in die IF-Schleife ein.

0

dies wird definitiv Word. Ich benutze diese Funktion auch für mich.

  public static bool isFormOpen(Form formm)
    {

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

        return false;
    }
0
Sayed idrees

Ich habe einen früheren Beitrag überarbeitet. Dies funktioniert einwandfrei, ohne alle offenen Formen durchlaufen zu müssen.

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

Komisch, ich musste diesen Thread hinzufügen.

1) Fügen Sie eine globale var in form.show () hinzu und löschen Sie die var in form.close ().

2) Fügen Sie im übergeordneten Formular einen Timer hinzu. Halten Sie das untergeordnete Formular offen und aktualisieren Sie Ihre Daten alle 10 Minuten.

3) Setzen Sie den Timer auf das untergeordnete Formular, um Daten auf sich selbst zu aktualisieren.

0
Louie Avila

Das unten funktioniert eigentlich sehr gut.

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

So habe ich alle offenen Formulare geschlossen (außer dem Hauptformular)

    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
Jim Lahman