Cómo abrir una instancia específica de un formulario en C# .NET
¿Necesitas recordar cómo funcionan los formularios en C#?
Échale un vistazo a la primera parte de este artículo donde se introducen y explican los conceptos.
![Cómo abrir una instancia específica de un formulario en C# .NET - Video](https://i.ytimg.com/vi/by_ihlGMGDM/hqdefault.jpg)
Recuperando una instancia específica de un formulario
En muchas ocasiones, lo que queremos es abrir una instancia específica de un formulario que ya contiene información en lugar de abrir una nueva instancia. En mi artículo anterior, presenté un ejemplo sencillo en el que esta información está representada por la frase de texto que el usuario ha cargado en el control de etiqueta de una instancia de la clase Form. El código para esa implementación básica aparece en Listado A. Ahora es el momento de ver cómo se realiza la apertura de una instancia existente. Empecemos a trabajar en el patrón general en C# .NET para recuperar una instancia específica de una clase Form.
Vamos a suponer que queremos utilizar el botón en la instancia Form2 para volver a nuestra instancia de Form1. Aquí es donde nos encontramos con las limitaciones de crear una nueva instancia de una clase Form. Para demostrarlo, agregue el código simétrico al evento de clic del botón en la instancia Form2 para mostrar una instancia de Form1:
private void btnForm1_Click(object sender, System.EventArgs e) {
Form1 form1 = new Form1();
form1.Show();
}
Figura A muestra el código en acción. A continuación, ejecuta el proyecto. Ingresa una frase en el cuadro de texto de Form1, como ¡Pienso, luego existo!. Haz clic en el botón para cargarlo en la etiqueta. Ahora haz clic en el botón para mostrar la instancia de Form2. En Form2, haz clic en el botón para mostrar una instancia de Form1. No importa cuántas veces hagas esto, todo lo que obtendrás es una nueva instancia de Form1, lo que significa que el texto que fue cargado en la etiqueta por el usuario no será mostrado.
Figura A |
En muchas ocasiones, por supuesto, habrá mucha más información en una instancia de formulario de Windows que solo una frase, ingresada por el usuario o recolectada de alguna otra forma. Entonces, ¿cómo podemos volver a la instancia actual de Form1 y mantener intacta su información?
Obviamente, lo que necesitamos es una variable a la que podamos acceder que apunte a la instancia específica de Form1 que queremos mostrar. Una forma de hacer esto es usar una variable pública y estática para almacenar la referencia a la instancia. (La diferencia entre los miembros de clase estáticos y de instancia, como las variables, es que los miembros estáticos no necesitan ser instanciados).
![](https://newsmatic.com.ar/wp-content/uploads/vb-calcular-ultimo-dia-mes-facilmente-imagen-2-150x150.webp)
Para hacer esto, declara una variable pública y estática de tipo Form1 justo debajo de la declaración de la clase Form1. He nombrado la variable staticVar:
public class Form1 : System.Windows.Forms.Form
{
public static Form1 staticVar = null;
...
}
Por cierto, no hay razón para colocar esta variable en el módulo Form1, siempre y cuando sea pública y estática puedes ponerla donde quieras. Si tienes múltiples variables públicas y estáticas, puede ser una buena idea crear una clase en un módulo clase separado solo para ellas. También ten en cuenta que he inicializado la variable usando la palabra clave null para indicar explícitamente que no contiene una referencia al formulario.
Cuando llegue el momento de mostrar la instancia de Form2, usa la palabra clave this para almacenar una referencia a la instancia actual de Form1 en la variable staticVar:
staticVar = this;
Aquí está el código completo revisado para el evento de clic que muestra la instancia de Form2:
private void btnForm2_Click(object sender, System.EventArgs e) {
staticVar = this;
this.Hide();
Form2 form2 = new Form2();
form2.Show();
}
Ahora es fácil abrir la instancia deseada de Form1 desde Form2 simplemente utilizando la referencia almacenada en la variable Form1.staticVar. Aquí está el evento de clic revisado de Form2:
private void btnForm1_Click(object sender, System.EventArgs e) {
Form1.staticVar.Show();
}
Ejecuta el proyecto nuevamente. Ingresa un poco de texto en el cuadro de texto de Form1, como la frase ¡Esta vez volveré a mi instancia!. Haz clic en el botón para ocultarlo y mostrar Form2. Cuando hagas clic en el botón Mostrar Form1 en Form2, se mostrará la instancia de Form1 con tu entrada, como se muestra en Figura B.
![](https://newsmatic.com.ar/wp-content/uploads/usando-el-comando-reemplazar-para-ahorrar-tiempo-imagen-1-150x103.webp)
Figura B |
Como está, esto funciona muy bien. Sin embargo, el uso extensivo de variables públicas viola los cánones de buena práctica de programación (específicamente, las variables no están encapsuladas). Además, probablemente consume recursos de manera excesiva. Una solución algo mejor es almacenar la referencia de la instancia de formulario como una propiedad de una de las clases.
Agreguemos una propiedad a la clase Form2 que almacene una referencia a una instancia de la clase Form (ten en cuenta que estoy creando la propiedad utilizando la clase Form más general en lugar de la específica Form1, por lo que se puede almacenar una referencia a una instancia de cualquier clase heredada de la clase Form, no solo una instancia de Form1).
Puedes utilizar el Asistente de Propiedad en C#, al que puedes acceder desde la ventana de Vista de Clase, para facilitar la creación de la propiedad, pero es bastante sencillo crearla a mano en el módulo de la clase Form2.
Aquí está la propiedad agregada al módulo de la clase Form2 (puede ir en cualquier lugar del cuerpo de la clase):
private Form m_InstanceRef = null;
public Form InstanceRef{
get {
return m_InstanceRef;
}
set {
m_InstanceRef = value;
}
}
Observa el uso de una variable privada para almacenar el valor dentro de la instancia de la clase, los accesores get y set y la palabra clave value para establecer un nuevo valor de propiedad.
Luego, el evento de clic en Form1 que invoca a Form2 necesita ser modificado para usar la propiedad en lugar de una variable pública. Haremos esto asignando una referencia a this (la instancia actual del formulario) a la propiedad:
![](https://newsmatic.com.ar/wp-content/uploads/por-que-utilizar-un-iterador-en-java-en-lugar-de-una-lista-o-un-array-150x150.png)
private void btnForm2_Click(object sender, System.EventArgs e) {
this.Hide();
Form2 form2 = new Form2();
form2.InstanceRef = this;
form2.Show();
}
Finalmente, la propiedad se utiliza en Form2 para invocar la instancia correcta de Form1 (Figura C). No se necesita ningún calificador antes de la propiedad ya que es un miembro de la instancia actual:
private void btnForm1_Click(object sender, System.EventArgs e) {
InstanceRef.Show();
}
Figura C |
Como puedes ver, las propiedades funcionan bien para comunicar las instancias de los formularios entre los distintos módulos de una aplicación de formulario de Windows, y brindan un enfoque más encapsulado que el uso de una variable pública y estática.
Una base para los formularios
Este artículo en dos partes ha descrito el patrón principal para la interoperabilidad de formularios de Windows en C#, pero obviamente, a medida que avances, encontrarás situaciones que dependen de las necesidades particulares de tus proyectos. Por ejemplo, puedes tener situaciones que involucren estructuras como matrices o colecciones que apuntan a múltiples formularios, y deberás seleccionar la referencia correcta de las distintas instancias referenciadas en la estructura. Pero el enfoque general que hemos presentado aquí debería ayudarte a comenzar de manera sólida.
En Newsmatic nos especializamos en tecnología de vanguardia, contamos con los artículos mas novedosos sobre Desarrollo, allí encontraras muchos artículos similares a Cómo abrir una instancia específica de un formulario en C# .NET , tenemos lo ultimo en tecnología 2023.
Artículos Relacionados