locked
Cargar solo una vez un formulario dentro de un MDI RRS feed

  • 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

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

    miércoles, 2 de febrero de 2011 20:21
    Moderador
  • 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
    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/DirectX

    Twitter - VicenteCartas

    Blog about C# and XNA Development

    Blog about Role Playing Games

    mié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.
    miércoles, 2 de febrero de 2011 23:10
    Moderador