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.