PDA

Ver la Versión Completa : Como evitar 2 instancias de una misma ventana hija


edgusano
09-12-2005, 22:04:45
Hola a todos.
Pues creo que el mismo titulo lo dice todo.
Como hago para evitar que abran dos instncias de una misma ventana hija en una aplicacion mdi en C#.

jgutti
09-12-2005, 23:29:38
llamar la ventana hijos con showmodal

atte

jgutti

edgusano
09-12-2005, 23:33:27
Hola jGutti.
Pos gracias, pero eso no funciona, recuerda que es una aplicacion MDI, ademas lo mas parecido en c# es showdialog.

dec
10-12-2005, 09:55:10
Hola,

Tal vez por ignorancia que a mí no se me ocurre ahora mismo sino lo típico, supongo: declarar una variable "global" dentro de la clase del "Form1", que mantenga una referencia a cierto objeto "Form2". Cuando se precise mostrar el formulario "Form2" se mirará si dicha variable es "null", y, en caso de que lo sea crear y mostrar el formulario "Form2", y, en caso de que no lo sea (lo cual nos indicará que el objeto ya ha sido creado, obviamente) levantar una excepción o simplemente darle el "foco" al formulario "Form2" previamente creado.

Es mucho más sencillo de ver con algo de código:



namespace WindowsApplication1
{
public partial class Form1 : Form
{
// Variable "global" en que guardar una
// referencia a un objeto de tipo "Form2"
public Form2 form2 = null;

// Constructor de "Form1"
public Form1()
{
InitializeComponent();
}

// Evento "Click" de un botón en "Form1"
private void button1_Click(object sender, EventArgs e)
{
if (form2 == null) // ¿"form2" es aún "null"?
{
form2 = new Form2(); // Creamos un objeto "Form2"
form2.MdiParent = this; // Lo emparentamos ;-)
form2.Show(); // Y lo mostramos
}
else // ¿"form2" ya tiene una referencia válida?
{
form2.Focus(); // Damos el foco al formulario "Form2"
//throw new Exception("Ya existe el formulario");
}
}
}
}

edgusano
10-12-2005, 18:01:15
Hola Dec.
Muchas gracias por la respuesta, pero justo un momento antes y luego de partirme un poco el coco, hice una pequeña funcion para que hiciera lo que quiero.
Por si alguien le interesa y si se puede mejorar mas, pos aqui coloco el codigo de lo que hice.

private Form MdiChildExist( String sNombreChild )
{
foreach( Form frmExiste in this.MdiChildren )
if(frmExiste.Name == sNombreChild)
return frmExiste;
return null;
}


Esta funcion Recibe el nombre del form que se quiere abrir y lo busca en la coleccion de forms hijos que tiene el form padre, si lo encuentra retorna la referencia a este form si no, retorna un null, ya luego lo que hago es verificar en donde se haga el llamado a esta funcion que retorno y si la referencia es null, pos creo el formulario y si no es null, hago un frmChild.BringToFront, igual me imagino que se puede hacer frmChild.Focus, Aunque el con el BringToFront me gusto el hecho que no se vea el efecto no muy agradable en la ventana hija cuando se abre, como cuando se hace un frmChild.Show, aunque no he probado lo del frmChild.Focus, lo digo por lo del efecto aquel :)

edgusano
12-12-2005, 16:40:40
Holas a todos.
Este post es para corregir algo que dije arriba, en cuanto al efecto no muy agradable cuando se muestra un form hijo, luego de probar vi que ya sea con el bringtofront o con el focus este efecto persiste.
Agradeceria ahora si alguien sabe como quitar este efecto o por lo menos reducirlo para que no se note mucho.