Ver Mensaje Individual
  #1 (permalink)  
Antiguo 10/12/2010, 08:17
taibo
 
Fecha de Ingreso: junio-2010
Mensajes: 11
Antigüedad: 14 años, 5 meses
Puntos: 0
única instancia formulario

Buenas, estoy realizando una aplicación de escritorio MDI con c# pero tengo problemas para conseguir una sóla instancia de formulario.

Primera parte que funciona:

1.En el formulario de "existencias" tengo.

Código:
        private static   existencias  aForm = null;
        
        
        public static existencias  Instance()
        {
            if (aForm == null)
            {
                aForm = new existencias ();
            }
            return aForm;
        }
        public existencias()
        {
            InitializeComponent();
        }
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose(disposing);
            aForm = null;
            
        }
2.La llamada desde el formulario MDI:

Código:
public  void menuItem6_Click(object sender, EventArgs e)
        {
                Form f = existencias.Instance();
                f.MdiParent = this;
                f.Show();
                f.Activate();
            
        }
Hasta aquí todo correcto, por muchas veces que le de al menú sólo habrá una instancia del formulario existencias.

El problema es que debido a diversas situaciones las existencias varían, en ese formulario tengo dos datagrid uno vinculado a un dataset y otro que toma datos del primer datagrid y de otros lugares.... por lo que decidí que la mejor forma de presentar los datos era cerrar el formulario y volverlo a abrir....

Código:
try
  {
      foreach (Form form in Application.OpenForms)
     {

         if (form.Text.ToString().Equals("existencias"))
         {
                                                       
          existencias f = new existencias();
          existencias.Instance().Close();
          
          ControlForm.titulo = "algo";
          f.MdiParent = MDI.ActiveForm;
          f.Show();
          f.Activate();

          }

     }
  }
                                            
catch (Exception ex)
{
 }
además de esto he tenido que hacer unas modificaciones en los códigos del principio como la llamada dentro del MDI realizarla dentro de un try catch, y en el formulario de existencias dejar algo como lo siguiente para que desde el menú no vuelva a salir otra instancia.

Código:
        private static   existencias  aForm = null;
        
        
        public static existencias  Instance()
        {
            if (aForm == null & ControlForm .titulo.Equals ("") )
            {
                aForm = new existencias ();
            }
            return aForm;
        }
        public existencias()
        {
            InitializeComponent();
        }
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose(disposing);
            aForm = null;
            ControlForm.titulo = "";
            
        }
Pero esto sólo funciona una vez. Es decir si tengo el formulario de existencias abierto... y hago la "actualización" todo va bien y tengo una única instancia y no puedo abrir otra desde el menú.

Pero al realizarlo una segunda vez, el formulario de existencias no se actualiza al igual que una tercera... y a la cuarta por cada intento de actualización comienza a abrir nuevas instancias del formulario de existencias.