Recorra todos los MDI secundarios y cierre todos los demás formularios excepto el actual

Estoy trabajando en una aplicación winforms usando c#. Tengo un contenedor MDI que tiene un menú a la izquierda y al presionar un botón, aparece el formulario correspondiente. Si hago clic por ejemplo 3 veces en el botón que abre Form1, se abren las 6 instancias del formulario. Por lo tanto, pensé que tenía que escribir un método que elimine cualquier otra instancia de Form1. Con el siguiente método, estoy recorriendo los elementos secundarios de MDI, pero quiero ayuda para cerrar todas las demás instancias, excepto la nueva.

  public void DisposeAllButThis(Form form)
    {
        foreach (Form frm in this.MdiChildren)
        {
            if (frm == form)
            {
                frm.Dispose();
                return;
            }
        }
    }

preguntado el 03 de julio de 12 a las 11:07

6 Respuestas

También debe verificar si el formulario es del mismo tipo:

public void DisposeAllButThis(Form form)
{
    foreach (Form frm in this.MdiChildren)
    {
        if (frm.GetType() == form.GetType() 
            && frm != form)
        {
            frm.Dispose();
            frm.Close();
        }
    }
}

Para obtener más información sobre Cerrar y desechar, consulte: C # Form.Close vs Form.Dispose

contestado el 23 de mayo de 17 a las 12:05

Por cierto: ¡Acabo de cambiar un poco el código eliminando la declaración de devolución prematura en el ciclo! - Emond

no está desechando el formulario antes de cerrarlo. - Pankaj

@Helper: agregué la llamada a Dispose. Por cierto: si estos formularios son visibles, llamar a Cerrar es suficiente - Emond

primero debe desecharlo y luego cerrarlo. - Pankaj

public void DisposeAllButThis(Form form)
{
    foreach (Form frm in this.MdiChildren)
    {
        if (frm != form)
        {
            frm.Dispose();   
            frm.Close();          
        }
    }
    return;
}

Respondido 02 Feb 17, 00:02

foreach (Form frm in this.MdiChildren)
{
   if (frm != form)
   {
      frm.Dispose();
      return;
   }
} 

Respondido 03 Jul 12, 11:07

Por esta función, puede llamarlo desde otra clase: y tenga en cuenta esto: frm.GetType() != Parent.GetType()

public void DisposeAllButThis(Form parentForm)
    {
        foreach (Form frm in Parent.MdiChildren)
        {
            if (frm.GetType() != Parent.GetType()
                && frm != Parent)
            {
                frm.Close();
            }
        }
    }

Respondido 21 ago 13, 20:08

private void closallforms()
        {
            foreach (Form frm in this.MdiChildren)
            {
                if (frm != Parent)
                {
                    frm.Close();
                }
            }
        }

Respondido 11 Feb 16, 15:02

La respuesta puede ser más valiosa si agrega alguna explicación y enlaces a la documentación, de modo que el póster original y otros usuarios puedan aprender de ella. - Markus Safar

si llama desde otro formulario secundario, puede usar: this.DisposeAllButThis(this.FindForm());

y usa el método:

private void DisposeAllButThis(Form form)
{
    foreach (Form frm in ParentForm.MdiChildren)
    {
       if (frm != form)
       {
          frm.Dispose();
          frm.Close();
       }
    }
 }

Respondido el 19 de junio de 19 a las 17:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.