¿Hay alguna forma de evitar la apertura de un formulario determinado dentro de un contenedor MDI si dicho formulario ya está abierto?Impedir formularios duplicados de MDI secundarios
Respuesta
Puede Interate sobre la colección OpenForms para comprobar si ya existe una forma del tipo dado:
foreach (Form form in Application.OpenForms)
{
if (form.GetType() == typeof(MyFormType))
{
form.Activate();
return;
}
}
Form newForm = new MyFormType();
newForm.MdiParent = this;
newForm.Show();
yo sepa no hay manera estándar. Tendrás que implementarlo tú mismo. Yo lo haría de esta manera:
class TheForm: Form
{
private static TheForm Instance;
private TheForm() // Constructor is private
{
}
public static Show(Form mdiParent)
{
if (Instance == null)
{
// Create new form, assign it to Instance
}
else
Instance.Activate(); // Not sure about this line, find the appropriate equivalent yourself.
}
protected override OnFormClose(EventArgs e)
{
Instance = null;
base.OnFormClose(e);
}
}
Si hilo de seguridad es una preocupación, añadir los correspondientes lock
s.
Seguridad de los hilos no debe ser un problema, ya que sólo se accede a controles GUI de un solo hilo . – Groo
podría haber agregado que esta es una implementación del patrón singleton. Prefiero la solución de Fredrik Mörk, no infringe SOC –
este código de trabajo
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
foreach (Form form in Application.OpenForms)
{
if (form.GetType() == typeof(Form2))
{
form.Activate();
return;
}
}
Form2 newForm = new Form2();
newForm.MdiParent = this;
newForm.Show();
}
Aunque este post es muy antiguo, pensé esto agregará una ayuda.
Es necesario controlar si la forma también se minimiza. Aquí está el ejemplo completo:
foreach (Form form in this.MdiChildren)
{
if (form.GetType() == typeof(frmMain))
{
if (form.WindowState == FormWindowState.Minimized)
{
form.WindowState = FormWindowState.Normal;
}
form.Activate();
return;
}
}
Form frm = new frmMain();
frm.MdiParent = this;
frm.Show();
Este código de trabajo para mí en vb.net
For Each f As Form In Application.OpenForms If TypeOf f Is form_name Then f.Activate() f.WindowState = FormWindowState.Normal f.StartPosition = FormStartPosition.WindowsDefaultLocation f.WindowState = FormWindowState.Maximized
Return
End If
Next
form_name .MdiParent = Me
form_name .Show()
- 1. Impedir instancias de formularios múltiples
- 2. Impedir el reenvío de formularios
- 3. Interfaz MDI con FireMonkey
- 4. Prevención de envíos de formularios duplicados
- 5. Impedir la devolución de datos duplicados en ASP.Net (C#)
- 6. Impedir presentaciones de formularios múltiples en MVC 3 con validación
- 7. Impedir que se agreguen elementos duplicados a un ListBox
- 8. WPF MDI niños
- 9. Delphi MDI - manejo abrir/cerrar/activar el formulario hijo
- 10. "No se puede crear formulario. No hay formularios MDI actualmente activos" error
- 11. Aplicaciones MDI en WPF
- 12. Impedir que los duplicados se guarden en el historial de bash
- 13. Impedir el envío de formularios con jquery ujs si el campo está vacío
- 14. Tamaño/ubicación de Winforms Área de cliente MDI
- 15. Modelo MDI o Dock Windows?
- 16. ¿Alternativa a MDI en WPF?
- 17. Cambiar el fondo de un Formulario MDI
- 18. fork() procesos secundarios y secundarios
- 19. Delphi, marcos contra formularios. ¿Qué pasa con la interfaz de múltiples documentos?
- 20. Evitar el envío de formularios duplicados en Asp.net MVC haciendo clic en enviar dos veces
- 21. ¿Existe una biblioteca para evitar envíos de formularios duplicados para django?
- 22. ¿Cómo creo una ventana secundaria MDI desde un dll Delphi 5 ActiveX y la incrusto en un padre MDI Delphi XE?
- 23. Impedir selección en HTML
- 24. selección Impedir Shift + Clic
- 25. Impedir que Excel salga de
- 26. Impedir la redirección de Xmlhttprequest
- 27. Cómo implementar mdi en una aplicación WPF
- 28. ¿Es posible crear más de un formulario MDI en una aplicación delphi?
- 29. Abrir un formulario secundario de otro formulario secundario y configurar MDI en el formulario principal: ¿cómo hacerlo?
- 30. Impedir que la barra de tareas active los formularios no modales cuando un cuadro de diálogo modal está activo
en lugar de form.Activate() use form.WindowState = FormWindowState.Normal; a diferencia del primero, el último funcionará incluso si esa ventana se minimiza. – docesam