2010-10-05 16 views
49

que tienen una forma "FM" que es una ventana de información simple que se abre cada 10 minutos (fm.Show();).¿Cómo comprobar si un formulario de Windows ya está abierto y cerrarlo si es así?

¿Cómo puedo hacer que cada 10 minutos se comprobará si la forma "FM" está abierto y si está abierto lo cierra y abre de nuevo!

Ahora la forma fm siempre se crea con form fm = new form();
así que cuando trato de comprobar si el formulario está abierto siempre será falsa y abrir una nueva ventana, incluso si hay una forma antes!

Es necesario disponer de una herramienta para darle una identidad única y luego comprobar si este formulario con identidad única se abre o no!

no quiero actualizar simplemente los datos en el formulario (fm), porque tengo una información compleja con botones.

El nombre del formulario es "UpdateWindow"

resolver mediante la siguiente:

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

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

fc.Show(); 
+1

¿Por qué quieres volver a abrirlo? ¿Quieres crear una nueva instancia? Quiero decir, ¿por qué no quieres llamar al método Show una vez más? –

+0

hola, el programa completo es una herramienta interna en nuestra empresa que verifica si hay una actualización para uno de nuestros programas, funcionó bien, pero necesito cerrarlo y abrirlo de nuevo porque se actualiza información –

+2

¿Por qué no? ¿Simplemente agrega un componente Timer al formulario y utiliza el temporizador para forzar una actualización de los datos en la pantalla? Aún mejor, podría enlazar los datos a un objeto para la actualización automática del estado. –

Respuesta

60

tal vez esto ayuda a:

FormCollection fc = Application.OpenForms; 

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

Algunos código en el foreach para detectar la forma específica y podría hacerse. No probado sin embargo.

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

+0

Gracias, entonces, ¿cómo usarlo con mi formulario (fm)? –

+0

if (frm es MyForm) {/ * * /}, debería hacer el truco. Pero si solo es para actualizar, ¿por qué no llamar a un método para actualizar los datos? – Sascha

+10

Lo resuelvo con esto .... Formulario fc = Application.OpenForms ["UpdateWindow"]; if (fc! = Null) fc.Close(); fm.Show(); –

10

No estoy seguro de que entiendo el comunicado. Espero que esto ayude. Si desea operar con una sola instancia de este formulario, debe evitar que Form.Dispose llame al usuario cierre. Para hacer esto, puede manejar el evento Closing del formulario hijo.

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

Y entonces no es necesario para crear nuevas instancias de frm. Simplemente llame al método Show en la instancia.

Puede comprobar la propiedad Form.Visible para comprobar si la forma abierta en el momento.

private ChildForm form = new ChildForm(); 

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

En realidad, todavía no entiendo por qué no acaba de actualizar los datos en el formulario.

+0

esto es interesante, pero cómo puedo identificar el formulario, quiero decir que usamos form fm = new form(); entonces siempre es una forma nueva, entonces ¿cómo puedo identificar la forma? –

+0

Si solo es una de esas formas, puede crear una variable de nivel de clase para ella. Si hay una gran cantidad de formularios creados en el conjunto de métodos, mejor use el enfoque de Sascha) –

+1

Lo soluciono al verificar si el formulario abre por nombre y luego lo cierro si está abierto Formulario fc = Application.OpenForms ["UpdateWindow"] ; if (fc! = Null) fc.Close(); fm.Show(); –

0

Trata de conectar a continuación,

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

Por encima de cableado caso, se le informará cada vez que se minimiza el formulario, parcialmente/totalmente hided por otra forma.

0

Esto es lo que he usado para cerrar todas las formas abiertas (a excepción de la forma principal)

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

Supongamos que si estamos llamando a una forma de un menú, haga clic en formulario MDI, entonces tenemos que crear la instancia declaración de que la forma en la parte superior nivel de la siguiente manera:

Form1 fm = null; 

entonces tenemos que definir el evento de menú de clic para llamar la Form1 como sigue:

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

El CheckOpened definido para comprobar el Form1 ya está abierto o no:

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

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

Hope esto va a resolver los problemas en la creación de múltiples instancias de una forma que también consigue el foco a la Form1 de menú del botón si es ya abierto o minimizado.

+1

Funcionó muy bien. Muchísimas gracias ! +1 – Vbp

0

Gracioso, tuve que agregar a este hilo.

1) Añadir un var global sobre form.show() y que se disipe el var en Form.Close()

2) En el formulario principal añadir un temporizador. Mantenga abierto el formulario para niños y actualice sus datos cada 10 minutos.

3) poner el temporizador en el formulario hijo para ir a actualizar los datos en sí mismo.

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

donde Form1 es el nombre de su formulario.

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

Se cerrará la formulario1 puede abrir esa forma de nuevo si lo desea usando:

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

Sé que llego tarde ... Pero para aquellos que son curiosos ... Esto es otra forma

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

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

Impresionante, agradable y fácil – ng80092b

+1

gran solución, eso es lo que estaba buscando (no quería recorrer la colección de formularios), muchas gracias! – user1970395

0

* espero que esto funcionará para u

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

probar esto

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

probar esto, va a trabajar:

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

//in button click 
if (Fm1.IsDisposed) 
{ 
    Fm1 = new Form(); 
} 
Fm1.Show(); 
Fm1.BringToFront(); 
Fm1.Activate(); 
0
private static Form IsFormAlreadyOpen(Type formType) 
{ 
    return Application.OpenForms.Cast<Form>().FirstOrDefault(openForm => openForm.GetType() == formType); 
} 
+0

Si bien este fragmento de código puede resolver la pregunta, [incluyendo una explicación] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) realmente ayuda a mejorar la calidad de su publicación. Recuerde que usted está respondiendo la pregunta a los lectores en el futuro, y es posible que esas personas no sepan los motivos de su sugerencia de código. Por favor, intente no saturar su código con comentarios explicativos, ya que esto reduce la legibilidad tanto del código como de las explicaciones. – FrankerZ

0

Forma una sola vez

Si su objetivo es diallow múltiples instaces de una forma, considere siguiente ...

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

Además, puede ser que esto ayudará

 

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

Try This es el corto idea comprobar forma abierta o no abrir

0

En mi aplicación que tenía un mainmenu formulario que tenía botones para navegar a una variedad de otras formas (también conocidas como subformularios). Quería que solo se ejecutara una instancia de cada subformulario a la vez. Además, quería asegurarme de que si un usuario intentaba iniciar una subformulación que ya existía, la subformulario se vería forzado a mostrar "front & center" si se minimiza o está detrás de otras ventanas de la aplicación. Usando las respuestas actualmente más upvoted, me refactorizado sus respuestas a este:

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

Si la instancia de formulario no está abierto entrará en el circuito de IF.

0

probar esto MDIChild función

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

Esto funcionó conmigo formar:

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

Recordatorio para agregar más información acerca de lo que está haciendo en su código – xsami

0

Creo que mi método es el más simple .

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

La continuación realidad funciona muy bien.

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

Gracias por este fragmento de código, que podría proporcionar alguna ayuda limitada a corto plazo. Una explicación adecuada [mejoraría en gran medida] (https://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) su valor a largo plazo al mostrar por qué esta es una buena solución al problema y lo haría más útil para futuros lectores con otras preguntas similares. Edite su respuesta para agregar alguna explicación, incluidas las suposiciones que ha realizado –

Cuestiones relacionadas