Principales respuestas
Cargar solo una vez un formulario dentro de un MDI

Pregunta
-
Hola a todos, espero ser claro para que me puedan ayudar con lo que necesito, como puedo hacer para que un formulario dentro del MDI se carga una sola vez, es decir cuando llamo desde el MDI al formulario hijo todo esta bien pero si lo vuelvo a lllamar al mismo formulario me debe enviar una alerta o enfocar al formulario que esta abierto.... desde ya muchas gracias.miércoles, 2 de febrero de 2011 19:51
Respuestas
-
lo que pasa es que si le vuelves a dar 'new' ya no es el mismo formulario , ya es otro nuevo de la misma clase...
puedes crear en tu caso un patron singleton, que es ( y lo resumo para ti ) como una clase especial que te permite crear solo una unica instancia de un objeto determinado.
más info aqui: http://msdn.microsoft.com/en-us/library/ff650316.aspx
Juan Carlos Ruiz Pacheco - Microsoft MVP Visual C#
Visita mi blog: C#, XNA, Win32 - http://juank.black-byte.com
Twitter: @JuanKRuiz
Facebook: Arquitecto de Software
- Propuesto como respuesta Juan Carlos Ruiz PachecoMicrosoft employee, Moderator miércoles, 2 de febrero de 2011 20:21
- Marcado como respuesta Eduardo PorteschellerModerator lunes, 7 de febrero de 2011 17:08
miércoles, 2 de febrero de 2011 20:21Moderador -
hola
aqui explico una tecnica de como poder hacerlo
[WinForms] Instancia Ú nica de Formulario
o sea si defines una propiedad que permita devolver la instancia del forma segun si existe o sino crearla
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina- Propuesto como respuesta Juan Carlos Ruiz PachecoMicrosoft employee, Moderator miércoles, 2 de febrero de 2011 20:47
- Marcado como respuesta Eduardo PorteschellerModerator lunes, 7 de febrero de 2011 17:08
miércoles, 2 de febrero de 2011 20:43
Todas las respuestas
-
lo que pasa es que si le vuelves a dar 'new' ya no es el mismo formulario , ya es otro nuevo de la misma clase...
puedes crear en tu caso un patron singleton, que es ( y lo resumo para ti ) como una clase especial que te permite crear solo una unica instancia de un objeto determinado.
más info aqui: http://msdn.microsoft.com/en-us/library/ff650316.aspx
Juan Carlos Ruiz Pacheco - Microsoft MVP Visual C#
Visita mi blog: C#, XNA, Win32 - http://juank.black-byte.com
Twitter: @JuanKRuiz
Facebook: Arquitecto de Software
- Propuesto como respuesta Juan Carlos Ruiz PachecoMicrosoft employee, Moderator miércoles, 2 de febrero de 2011 20:21
- Marcado como respuesta Eduardo PorteschellerModerator lunes, 7 de febrero de 2011 17:08
miércoles, 2 de febrero de 2011 20:21Moderador -
hola
aqui explico una tecnica de como poder hacerlo
[WinForms] Instancia Ú nica de Formulario
o sea si defines una propiedad que permita devolver la instancia del forma segun si existe o sino crearla
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina- Propuesto como respuesta Juan Carlos Ruiz PachecoMicrosoft employee, Moderator miércoles, 2 de febrero de 2011 20:47
- Marcado como respuesta Eduardo PorteschellerModerator lunes, 7 de febrero de 2011 17:08
miércoles, 2 de febrero de 2011 20:43 -
Si necesitas un Singleton, por favor no uses la implementación de la MSDN, es un desastre (puede ser correcta según la versión, pero hay implementaciones mejores). Si usas .NET 4.0, esta es la implementación recomendada:
http://es.wikipedia.org/wiki/Singleton#C.23
Si usas una versión anterior, la recomendada es esta:
http://kartones.net/blogs/jadengine/archive/2009/05/20/el-patr-243-n-singleton-en-c.aspx
Vicente Cartas Espinel - MVP XNA/DirectXmiércoles, 2 de febrero de 2011 22:14 -
si en algo te puede ayudar...
yo me canse de estar preocupando por este tipo de problemas, así que le puse un poco más de cabeza y un poco más de código, así que si te sirve
private void CargarFormulario(object sender, EventArgs e) { string formName = (string)(sender as ToolStripMenuItem).Tag; string assemblyName = FindAssemblyName(formName); if (string.IsNullOrEmpty(assemblyName)) { MessageBox.Show("No se encontro el formulario a cargar", "Error!!!", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } Form form = Application.OpenForms.OfType<Form>().Where(pre => pre.GetType().FullName == assemblyName).SingleOrDefault(); if (form == null) { ObjectHandle oh = Activator.CreateInstanceFrom(Assembly.GetEntryAssembly().CodeBase, assemblyName); form = oh.Unwrap() as Form; form.MdiParent = this; form.Show(); } else { form.Activate(); if (form.WindowState == FormWindowState.Minimized) form.WindowState = FormWindowState.Normal; } } private string FindAssemblyName(string formName) { Module[] modulos = Assembly.GetExecutingAssembly().GetModules(); foreach (Module m in modulos) { Type[] tipos = m.GetTypes(); foreach (Type t in tipos) { if (t.IsSubclassOf(typeof(Form)) && t.FullName.Contains(formName)) return t.FullName; } } return string.Empty; }
te explico, he creado un metodo general para cargar cualquier formulario pasando el nombre del formulario a cargar (CargarFormulario), según cada item del menú en la propiedad Tag de estos yo coloco el nombre del formulario y si es necesario coloco tambien el nombre de la carpeta del projecto donde esta el formulario como por ejemplo: Consultas.ReporteDeVentas
y lo que hago es usar Reflection para buscar en el emsablado en ejecución todos los modulos y dentro de cada modulo buscar el formulario si lo encuentra retorna el nombre del emsamblado completo del formulario para crear la referencia y crear la instancia al formulario.
asi que todos lo items de los menus invocan en el evento click al metodo CargarFormulario.
si te ayuda.
Salu2,
Marvin E. Pineda
Marvin's Blog
San Pedro Sula
Honduras. C.A.
Aún el necio cuando calla, es contado por sabio.- Propuesto como respuesta Juan Carlos Ruiz PachecoMicrosoft employee, Moderator miércoles, 2 de febrero de 2011 23:16
miércoles, 2 de febrero de 2011 23:10Moderador