viernes, 11 de enero de 2013

Comunicar un Form con otro Form

Este es un ejemplo de como puedes pasar argumentos y comunicar desde un Form a otro, bueno comencemos.

Primero explico lo que se va realizar en el ejemplo, se va a crear un Form llamado Padre este es un formulario normal que para entrar al sistema en mi ejemplo tienes que logearte, esto implica abrir otra ventana para el logeo, que sera el segundo Form llamado LogeoHijo, que se podria hacer en la misma ventana pero para efectos de este ejemplo lo hare asi.

Primero crearemos nuestro proyecto, yo lo llamare Padre


Le pondre un label y un boton para que se vea bien!,



Bien ya tenemos el Form Padre que tiene 2 labes en las flechitas que cacharan el texto que les envie el otro Form y el boton que llamara al otro Form, ahora creamos el otro Form que yo lo llamare como dije anteriormente LogeoHijo:


Bien ya lo tenemos aqui:


Y medio la decore pero seguimos, ahora ya tenemos los Form el Padre y el LogeoHijo, pero como los vamos a comunicar?, para eso tenemos que crear una interfaz que nos va a ayudar con la comunicacion yo la llame IComunica:


Bien, entonces nos refresamos al primer Form y damos doble click sobre el boton para administrar su evento:


Bien este boton es el que va a mandar a llamar al otro Form y lo crearemos asi:


Tambien debemos de crear un metodo aqui en este Form para setear o establecer los valores a los label's:



ya que este metodo es el que va a establecer los valores el los labes, pero para que este se pueda mandar a llamar tenemos que agregar la interfaz IComunica al Form Padre:


Ya esta, a continuacion agregamos el metodo a la interfaz, en mi caso el metodo se llama SetLabes:


si no le van entendiendo no se preocupen explico con calma ya que tengamos todos los elementos creados, bien, ya tenemos la interfaz que va a conectar al Form Padre, ahora procedemos a comunicar el Form que en mi caso se llama LogeoHijo, de esta forma:



el this.owner, se utiliza para decir que este Form es hijo del otro y que pertenece a el Form padre, bien si ejecutamos esto vemos como al cerrar el segundo Form el hijo, ya estan los datos en los labels del Form padre:


vemos que se ha completado exitosamente, en mi caso se queda abierto el segundo Form, pero ya saben que le pueden agregar un this.close(); para que al final del metodo cuando ya envie los datos se cierre, pero como dije ahi es de cada quien, espero que les sirva y pueden dejar sus quejas jeje o comentarios.

Saludos

Mi punto de vista de las interfaces

Que tal!, creo que a mas de uno les habra pasado que lo estan aprendiendo en la escuela o tal vez por su cuenta ahi es de cada quien, pero comienzan a estudiar las interfaces en C#, en mi experiencia la primera vez que las vi dije ¡y esto como para que sirve!, pero con el paso del tiempo se me han hecho muy utiles, y una vez le pregunte a un amigo, 'oyes para que sirven las interfaces?' y me dice que los metodos declarados en una interfaz se tienen que cumplir afuerza, osea como?, si que si tu tienes una clase por decir, la clase Principal, y ahi tienes metodos y todo eso, puedes declarar una interfaz llamada IPrincipal en la cual vas a tener los metodos de Principal declarados, asi cuando desde otra clase quieras llamar a los metodos de Principal. invocando solo la interfaz, lo puedes hacer y asi no accedes a todo el codigo de la clase Principal, esto es como un metodo de seguridad para no exponer codigo extra y no necesario.

Como abrir un form desde otro form en C#

Tenia la idea de hacer este y otro post en uno solo, pero creo que para lo que son nuevos en el lenguaje necesitan entender esto, y es que cuando uno esta trabajando con Form's en C# en ocaciones se necesita hacer mas de uno, pero y como abrir uno y luego otro y asi?

La idea base es esta:

Cuando tu creas un proyecto de Windows Form, y se crea el primer Form, ese es el Form padre que vas a utilizar como base, en otras palabras, ya ahi tu puedes ir creando mas Form's pero el que los va a mandar a llamar y administrar es el primer Form creado, por eso es el padre, y todos los consecuentes son lo Form's hijos, que puedes mandarlos a llamar entre ellos pero siempre estableciendo que el primer Form es el padre.

Supongamos que estas en el primer Form y creaste otro Form llamado por ejemplo "login" y lo vas a mandar a llamar desde el primer Form, entonces seria con esto:

Login logeo=new Login();   -> aqui creas la instancia del segundo Form
logeo.show(this);                 -> aqui le dices que se muestre ese Form

Esto no es nada del otro mundo pero si debes de tener en mente que si intentas llamar al Form padre desde el hijo, si se va a poder pero cuando cierres este Form como es el padre, se destruira todo lo demas cerrando al Form hijo de donde lo llamaste tambien, ya que el control lo tenia el padre.

Lee lo siguiente si quieres si no puedes regresar a lo que estabas haciendo, bueno es que queria comentar que esto me paso una ves en la escuela, que con otro compañero mio estabamos haciendo formularios en distintos forms, pero veia que a el si le agarraba y a mi no, ahh, esa ves me enoje mucho, y creo que a mas de uno le habra pasado y pasara, pero de ahi aprendes de los errores terribles que cometes, espero les sirva.

Saludos.

miércoles, 2 de enero de 2013

Mejor forma de conectar a MySql desde C#

Me propuse a escribir esto porque muchas veces tratamos de usar archivos, el los cuales hay que hacer la conexión, abrirlos, tratarlos, y cerrar la conexión, de momento aquí solo me limitare a hablar sobre cuando uno hace la conexión a mysql desde una aplicación C#, pero se aplica para toda metodología que trate con archivos externos, recursos de red, etc., que de seguro mas de uno lo hecho mas de una vez, entonces cual es la forma que nos enseñan en la escuela o vemos el los post o foros?, me atrevo a decir que es esta:

Aclaro: usado el motor MySql y legunaje de programación C#

En este ejemplo es cuando lees datos

// se crea la cadena de conexion con las credenciales necesarias
string CadenadeConexion="Server=localhost;Database=base1;UID=user;
Password=root";
// se crea una nueva conexion hacia el gestor de base de datos
MySqlConnection conexion=new MySqlConnection(CadenadeConexion);
// se abre la conexion
conexion.Open();
// se crea un comando
MySqlCommand cm=new MySqlCommand();
// se establece el comando
cm.CommandText="Select * from tabla";
// se crea un adaptador
MySqlAdapter ad=new MySqlAdapter();
// se crea una tabla que recibira los datos
DataTable ds=new DataTable();
// se llena la tabla
ad.Fill(ds);
// se cierra la conexion
conexion.Close();

Este es un tipico ejemplo sobre como trabajar con Mysql y C#, entonces los inconvenientes son los siguientes:

1.-Para comenzar que se pueden generar excepciones que el codigo anterior no puede manejar, lo recomendable es poner un try y catch, ya que este cachara la excepcion, tambien es conveniente imprimir la exception para saber donde fue.

2.-En algunos casos hay que mantener abierta la conexion para ejecutar varias consultas y cerrar la conexion al final esto consume mas recursos de los necesarios.

3.-Puede que tengas un boton de salir y este al mismo tiempo cierre la conexion, si esto ocurre algunas veces dan click en cerrar ventana y se queda abierta la conexion.

  *la mas importante*
4.-El CLR libera automaticamente la memoria para almacenar objetos que ya que ya no son necesarios y la liberacion de memoria no es DETERMINISTICA y estos se liberan cuando el CLR decide realizar que elementos no son utilizados, entonces cuando utilizamos conexiones a la base y utilizamos variables, guardamos valores y todo esto, se liberan hasta que el recolector del CLR lo decida.

hay otra forma de hacer esto y teniendo menos problemas a continuacion pongo el codigo:

string ConString = @"Server=" + se + ";Database=" + da + ";UID=" + us + ";Password=" + pa;
using (MySqlConnection cn = new MySqlConnection(ConString))
{
try
{
cn.Open();
 }catch{}
// comandos y ejecuciones
}

Esta es la forma que recomendable ya que con el uso de la directiva USING todos los elementos que se utilicen dentro y creados ahi se liberaran cuando termina y salga del using.

Ventajas:

1.- Se liberan los objetos utilizados cuando termina las instrucciones de using y sale.

2.- Solo se utilizaran los recursos necesarios cuando se ejecuten.

3.- En el uso de archivos, conexiones a red, bases, etc. es recomendable, ya que estos servicios siempre estan corriendo y sus recursos son limitados y se requiere una administracion optima.

Espero que le sirva saludos.