Está en la página 1de 22

TRABAJO CON PROYECTOS VISUALES EN C#

Un proyecto visual en C# se crea como una Windows Application, de la siguiente manera:

Como normas fundamentales de planificacin de un proyecto, vemos unos cuantos detalles a la hora de
generar un proyecto de este tipo (y de otros):
?

Siempre hay que poner la solucin en un sitio conocido y adecuado, no en el sitio por defecto
que propone el entorno.

No hay que dejar los nombres por defecto, tales como Solution1, Application1, etc. Cuando
tengamos varios proyectos no habr manera de identificarlos con las carpetas ni con sus
nombres, y todos parecern iguales.

No es buena idea meter en la misma carpeta la solution y el project. Hay que generar una
carpeta independiente para el proyecto, dentro de la carpeta de la solucin. Lo ms normal es
que una solution tenga varios proyectos, y que uno de ellos comparta el sitio con ella, sea cual
sea, no es lo ms indicado.

En general, cuando se dan de alta elementos de un proyecto o una solution mediante los
asistentes, hay que poner nombres a todo, porque si no, luego cuesta mucho ms el cambiarlos
una vez que se han generado.

Una vez generada la solution y el proyecto, tendremos una pantalla como la siguiente:

Lo primero que hemos de hacer es dar un nombre adecuado al formulario. No es bueno que los
formularios de un proyecto se llamen Form1, Form2, etc.
Hemos de cambiar su nombre (propiedad (name), tal como se ve en la pantalla anterior).
Hemos de cambiar el nombre del fichero donde se va a guardar.
En este caso, el formulario se va a llamar Principal, y su fichero ser Principal.cs
Hay que cambiar un pequeo detalle en el cdigo:

Hay que cambiar el new Form1() por un new Principal, ya que hemos cambiado el nombre al
formulario.
Es importante hacer estas tareas al principio, antes de todo lo dems, porque si no, luego tendremos un
montn de funciones con nombre que hacen referencia a Form1, y ser mucho ms complicado.

Ahora estamos en disposicin de ver como funciona nuestro proyecto. Ejecutndolo, aparecer un
programa totalmente vaco:

Para cambiar la vista de edicin entre el diseo del formulario y el cdigo, en la ventana de la solucion
tenemos los siguientes botones:

Vista de diseo del formulario


Vista de cdigo

Propiedades del formulario


Hay un conjunto de propiedades que se pueden establecer durante el diseo del mismo, es decir, sin
escribir cdigo:
Las propiedades del
intuitivas, en general.

formulario

son

bastante

La que se usan ms normalmente son las siguientes:


Name
FormBorderStyle
GridSize
Icon
MaximizeBox
MinimizeBox
Size
StartPosition
Text
WindowState

Name
Es el nombre del formulario. Todo formulario tiene que tener un nombre decente, no Form1, o Form2,
hay que cambiarlo siempre.

FormBorderStyle
Es el estilo del borde del formulario. Los valores ms usados son:
- Sizeable: El usuario puede cambiar el tamao del formulario durante la ejecucin del programa.
- FixedDialog: El tamao del formulario en ejecucin es fijo, no se puede modificar.
En general, no se debe dejar como sizeable un formulario que no resizee su interior convenientemente
al cambiar de tamao, da muy mala imagen y sensacin de dejadez y poca profesionalidad.
GridSize
Es el tamao de separacin entre los puntitos que aparecen en tiempo de diseo y que valen para
colocar alineados los componentes dentro del formulario. Normalmente, un valor de 4x4 es mucho ms
adecuado que el de 8x8 que aparece por defecto.
Icon
Es el icono del formulario (dibujito superior izquierdo). En un proyecto solo ha de tener icono el
formulario principal, o bien los formularios MDIChild si es un proyecto MDI. En el resto de formularios
hay que quitar el icono, queda muy feo un formulario de interaccin con el usuario con un dibujo por
defecto que no vale para nada.
MaximizeBox
MinimizeBox
Sirven para hacer aparecer o desaparecer los botones de maximizado y minimizado en el borde
superior derecho de la pantalla. En un formulario fijo, estos botones se han de quitar, no pintan nada y
hace muy feo que queden alli.
Size
Define el tamao del formulario. Normalmente es mejor ajustar su tamao estirandolo directamente con
el raton, pero si queremos que mida algo exacto, se pueden fijar en esta propiedad los valores.
StartPosition
Dice la posicin del formulario con respecto a la pantalla y al formulario que lo activa. Por defecto, esta
propiedad vale WindowsDefaultLocation. No se debe dejar as. Los valores adecuados son:
- CenterScreen: El formulario aparece centrado en la pantalla
- CenterParent: El formulario aparece centrado en el que lo activ.
Text
Es el texto del titulo del formulario
WindowState
Para formularios sizeables, esta propiedad permite decidir si el formulario aparecer de alguna de las
siguientes maneras:
- Normal: En el tamao en que ha sido dibujado
- Maximized: Ocupando toda la pantalla del ordenata.
- Minimized: Iconizado en la barra de tareas.
Existen propiedades de aspecto del formulario, tales como:
-

BackColor
BackgroundImage
ForeColor
Font
Opacity
TransparencyKey
TopMost

Estas propiedades son muy majas de probar (fuentes, colores, etc). Sin embargo no deben ser
cambiadas a no se que se quiera indicar algo muy importante con ese cambio. Las pantallas de un
programa han de ser lo ms estndar posible, no deben ser de color rosa, con fuentes raras, ni nada
semejante. Este tipo de cambios exigen una gran coherencia de imagen en todo el proyecto, y
normalmente lo mejor es dejar la apariencia tal cual.

Eventos del formulario


Los eventos son seales lanzadas por el formulario en tiempo de ejecucin, las cuales podemos
capturar y definir el cdigo que se ejecutar cuando ocurran:
Los que se usan ms normalmente son los
siguientes:
Load
Activated
Deactivate
Closed
Closing
Click
DoubleClick
KeyUp
KeyDown
KeyPress
MouseUp
MouseDown
MouseMove
Paint
Resize

Load
Activated
Deactivate
Closed
Closing
Son eventos que se lanzan al cargar se formulario, al cargarse los controles y activarse, al perder el
foco de activacin, y al descargarse.
Veremos mas adelante un ejemplo de su uso, con un formulario hijo activado especficamente.
Click
DoubleClick
MouseMove
MouseUp
MouseDown
Son eventos que se lanzan al mover el ratn o pulsar los botones del mismo.
KeyUp
KeyDown
KeyPress
Son eventos que se lanzan al pulsar teclas en el teclado. (Atencin a la propiedad KeyPreview).
Paint
Evento lanzado cuando el formulario es repintado por el sistema operativo (estaba debajo de alguna
otra cosa, adquiere visibilidad y debe ser redibujado).
Rezise
Evento lanzado cuando el formulario cambia de tamao.

Ejemplo de atencin a un evento del formulario.


Vamos a hacer que en la barra del titulo del formulario, en todo momento, figure la posicin donde se
encuentra el ratn.
?

Primero hemos de atender el evento MouseMove, que es el que se produce cuando el ratn
cambia de sitio.

Hemos hecho doble click sobre el evento que queremos atender, y ha aparecido automticamente la
funcin que se ejecutar cuando se produzca ese evento.
Dentro de la funcin, hemos escrito this.Text = e.X + , + e.Y; que coloca en la propiedad
Text del formulario la coordenada X y la coordenada Y separado por una coma.
El argumento e (de tipo System.Windows.Forms.MouseEventArgs) contiene las propiedades
actuales del ratn, entre las que estn la X y la Y, que son las que hemos utilizado.

Si abrimos el codigo manejado por el diseador del formulario, tenemos lo siguiente:

Aqu podemos ver que todas las propieadades que hemos establecido en tiempo de diseo, realmente
han sido codificadas dentro del programa por el diseador de formularios. En la ultima linea, podemos
ver como se aade el delegado Principal_MouseMove a la gestion de eventos de MouseMove del
formulario, que es la que realmente codifica la gestion del evento.
this.MouseMove es un array de punteros a funciones, que sern llamadas cuando se produzca el
evento. Tiene sobrecargado el operador +, que permite aadir funciones a este array.
Si queremos eliminar la atencin de este evento, deberemos eliminar esta linea del InitializeComponent,
y luego borrar la funcion Principal_MouseMove. Una alternativa es posicionarnos en el evento (en el
diseo del formulario), hacer botn derecho, y escoger Reset. Esto elimina la agregacin del delegado,
pero todava deberemos eliminar manualmente la funcin Principal_MouseMove.

En tiempo de ejecucin nuestro programa ahora sera el siguiente (vemos como en la barra de ttulo
aparecen las coordenadas del ratn en el momento actual):

INSERCION DE COMPONENTES DENTRO DE UN FORMULARIO


Veremos ahora como insertar y utilizar los componentes ms normales, los ms sencillos.

Insercin de un men

Menu, una vez elaborado


Componente de tipo Menu
Hemos aadido un men al programa (seleccionar el componente, y hacer click en medio del
formulario).
Le hemos dado un nombre (en este caso MenuPrincipal).
Hemos tecleado las opciones del men (es bastante intuitivo, type here, ).
Le hemos dado nombre a las opciones que vamos a utilizar del men (Hacer Algo -> MNU_HacerAlgo,
Salir -> MNU_Salir).
Para meter un separador en el men, hay que insertar un elemento y ponerle como texto un guin.
Ahora atendemos los eventos del men MNU_HacerAlgo, y del MNU_Salir, tal como se ha explicado en
el caso del formulario. Hay que tener en cuenta que las propiedades y eventos que aparecen en la parte
derecha del diseador corresponden al objeto que esta seleccionado.

Vemos que la opcin de men hacer algo nos da un mensaje (observar la llamada a
MessageBox.Show), y que el men Salir termina la ejecucin del formulario (invoca al mtodo Close ()).

Hay que tener cuidado y dar nombres razonables a todos los elementos de men que vayan a ser
utilizados como generadores de eventos. No se deben dejar elementos como MenuItem1, ni cosas por
el estilo, porque despus es muy complicado ver que hace un programa y entenderlo.

Insercin de una etiqueta

Componente de tipo Label


Hemos insertado una etiqueta en el formulario.
Le hemos puesto de nombre UnaEtiqueta, y en la propiedad Text Esto es el titulo de la etiqueta.
Una etiqueta se usa bsicamente para dos cosas:
-

Para poner un titulo en el formulario, sin ms.


Para definir un rea donde se mostrarn datos de solo lectura al usuario.

Si la etiqueta se va a usar para mostrar informacin al usuario, se le debe cambiar el nombre. No es


bueno encontrar en el programa cosas del estilo: Label1.Text = Informacin, por ejemplo.
Las propiedades de la etiqueta son bastante intuitivas, comentaremos las ms importantes y ms
comnmente usadas:
AutoSize
BorderStyle
TextAlign

Permite definir si la etiqueta ha de ajustar su tamao automticamente.


Permite definr el aspecto del borde de la etiqueta
Definicin del alineado del contenido de la etiqueta.

Insercin de un botn

Componente de tipo Button (botn)


La propiedad ms importante del botn es Text, que es el texto que aparece dentro del mismo.
Atencin del evento Click del botn:
En este caso, al pulsar el botn, escribimos en la etiqueta anterior Hola que tal.

Insercin de una caja de texto

Componente de tipo TextBox (caja de texto)


Una caja de texto se utiliza para que el usuario teclee datos que el programa usar despus (una
especie de scanf, mas o menos).
La propiedad ms importante es Text, que es el contenido de la caja de texto. Se le pueden asignar
cosas o consultar su valor.
Vamos a modificar el evento click del botn, para que al pulsarlo haga que el la etiqueta salga lo que
hay escrito en la caja de texto:

Un programa muy sencillo, se puede construir bsicamente con etiquetas, botones y cajas de texto (el
men ya sera algo sofisticado).
El resto de controles no los vamos a comentar en este momento, muchos de ellos son muy intuitivos y
solo hay que probar su funcionamiento, otros, son mas complicados, y seguramente exigirn buscar
informacin sobre ellos. Generalmente, no hay ms que escribir en el Google lo que uno busca, y
aparecen cosas hasta de debajo de las piedras:

Sin embargo, muchas veces es necesario pintar dentro del formulario, visualizar grficas, datos en
forma de matriz, etc.
Vamos a ver ahora un par de tcnicas para conseguir esto:
-

Por un lado, utilizaremos un panel para dibujar fsicamente en su interior.


Por otro lado, utilizaremos el control dbGrid, que es una matriz de visualizacin de datos.

Dibujar dentro de un panel


Vamos a insertar un panel y un botn en el formulario:

Control de tipo Panel


Al panel lo hemos llamado Dibujo, y al botn Dibujar.
En el evento click del botn dibujar, escribimos lo siguiente:

Hemos hecho lo siguiente:


?

Obtener un objeto de tipo System.Drawing.Graphics para poder dibujar en l. No se puede


dibujar directamente en el panel, hace falta el contexto que devuelve su mtodo
CreateGraphics, para hacerlo dentro de l.

Para dibujar una lnea es necesario definir un Lpiz (se puede reutilizar luego, por supuesto), y
utilizar el mtodo DrawLine del objeto Graphics.

Para dibujar texto hace falta definir una fuente, una brocha, y utilizar el mtodo DrawString.

Para dibujar un rectngulo, hace falta un lpiz, y utilizar el mtodo DrawRectangle.

La clase Graphics tiene muchsimas llamadas, es cuestin de consultarla para ver ms posibilidades.

El aspecto en ejecucin de este programa, una vez pulsado el botn, ser el siguiente:

Sin embargo, ocurre una desgracia irreparable Cuando ocultamos el formulario (poniendo otro
encima, cambiando de tarea), al volver a visualizarlo el dibujo ha desaparecido.
Esto ocurre porque Windows no guarda el contenido de cada ventana cuando deja de estar en el
topmost de pantalla. Si hiciera esto, debera guardar, por ejemplo, para esta ventana, unos 600 x 400
puntos, esto es 240.000, cada punto ocupara 4 bytes, o sea, casi una mega. Se ve que es inviable, si
cada pantalla ocupara una mega de memoria solo para guardar el dibujito, el sistema se colapsara
rpidamente, al activar varios programas.
Por tanto, Windows lanza un evento Paint cuando un control debe ser repintado, por pasar a estar
visible una parte que haba estado oculta anteriormente.
La tcnica de un programa es entonces un poco ms estructurada: No se puede pintar directamente en
pantalla (a menos que no nos importe que se pierda la informacin al ocultarse), sino que se ha de crear
una estructura de datos con la informacin a pintar, y dentro del evento Paint realizar el dibujo de la
misma.
Se puede provocar un repintado invocando al mtodo Invalidate.

Hemos cambiado un poco el cdigo:


-

El objeto Graphics, para pintar, ya est disponible en el argumento e que llega al evento paint.
El texto que se pinta es el contenido de la caja, para ver como realmente cambia.

Ahora, en el Paint se realiza el trabajo de dibujar, y en el botn simplemente se llama a Invalidate, para
provocar un evento de este tipo.
Cuando el programa se inicia, ya aparece pintada la informacin, porque se produce un evento Paint
justo al dibujarse el control.

Como utilizar una DataGrid para cargar informacin.

Componente DataGrid
Para esta prueba se ha aadido al proyecto una clase Cliente:
using System;
namespace EjemploV
{
public class Cliente
{
private int m_Codigo;
private string m_Nombre;
public Cliente(int Codigo,string Nombre)
{
m_Codigo = Codigo;
m_Nombre = Nombre;
}
public int Codigo
{
get { return m_Codigo; }
set { m_Codigo = value; }
}
public string Nombre
{
get { return m_Nombre; }
set { m_Nombre = value; }
}
}
}

El cdigo asociado al primer botn (Grid) es el siguiente:

Se puede ver como asocia al datagrid (propiedad DataSource) un DataTable, que contiene la
informacin a mostrar.
Es decir, se trata de crear un DataTable, con sus DataColumn correspondientes, y luego asignarlo al
DataSource del DataGrid para que lo visualice.
Al crear un DataColumn se le ha de indicar el nombre de la columna y el tipo de dato (en este caso son
todas string).
Las propiedades adicionales (PreferredColumnWidth, etc) son para visualizar mejor la informacin.

El cdigo asociado al segundo botn (Grid2) es el siguiente:

En este caso, se le asigna al DataGrid un ArrayList, donde cada elemento es de tipo Cliente.
La grid muestra en cada fila un elemento del ArrayList, cada uno con sus datos asociados.

El uso mas habitual de un datagrid est enfocado a utilizar bases de datos.


Por ejemplo, esta seria la forma de mostrar una consulta sobre una grid:
private void Consultar_Click(object sender, System.EventArgs e)
{
SqlConnection Cnx;
Cnx = new SqlConnection("server=localhost;uid=pepe;pwd=pepe;database=Musika");
Cnx.Open();
SqlDataAdapter Adp;
Adp = new SqlDataAdapter("SELECT * FROM Grupos WHERE GRP_Nombre LIKE 'K%'", Cnx);
DataSet Dt = new DataSet();
Adp.Fill(Dt, "Grupos");
Cnx.Close();
G.DataSource = Dt;
G.DataMember = "Grupos";
G.Refresh ();
}

Este programa crea una conexin con una base de datos en SqlServer (Musika).
Crea una consulta sobre la tabla Grupos, buscando los que tengan el nombre empezando por K.
Crea un DataSet y lo llena con la consulta.
Enlaza este DataSet con la Grid, y como se puede ver, aparecen los resultados.

Uso del control OpenFileDialog / SaveFileDialog


Este control sirve para abrir la ventana estandar de Windows y pedir al usuario que escoja un archivo:
private void Abrir_Click(object sender, System.EventArgs e)
{
DlgAbrir.Filter = "Pedeefes|*.pdf|" +
"Textos|*.txt|" +
"Documentos|*.doc|" +
"Imagenes|*.bmp;*.jpg;*.gif|" +
"Todos los archivos|*.*";
DlgAbrir.InitialDirectory = "C:\\Kastefa\\LPII (2004-2005 Q1)";
DlgAbrir.Title = "Abrir unas cosas";
if (DlgAbrir.ShowDialog () == DialogResult.OK)
{
lbAbrir.Text = DlgAbrir.FileName;
}
}

La propiedad Filter (optativa, por defecto muestra todos los archivos) llena el combo inferior (Tipo), y
sirve para filtrar determinadas extensiones y mostrar una leyenda adecuada.
La propiedad Title (optativa, por defecto muestra Abrir), sirve para cambiar el titulo del dilogo.
La propiedad InitialDirectory sirve para establecer el directorio en el que se abre el dialogo.
Devuelve DialogResult.OK si se puls Abrir, DialogResult.Cancel si se puls Cancelar.
La propiedad FileName contiene el nombre del archivo con la ruta completa.
La propiedad FileTitle contiene el nombre del archivo, sin el path.

Una vez aceptado el dilogo, se puede ver el nombre del archivo en la etiqueta inferior:

El cdigo asociado al botn Guardar sera el siguiente:


private void Guardar_Click(object sender, System.EventArgs e)
{
DlgSalvar.FileName = lbAbrir.Text;
if (DlgSalvar.ShowDialog() == DialogResult.OK)
lbAbrir.Text = "Se ha escogido salvar";
else
lbAbrir.Text = "Se ha escogido no salvar";
}

Uso del control Timer


Este control sirve para provocar eventos temporales, cada cierto tiempo.

Control Timer
Le hemos llamado Temporizador, como nombre del objeto insertado.
Sus propiedades ms importantes son:
Enabled
Interval

Indica si funciona o no funciona. (Envia eventos o no lo hace)


Tiempo entre evento y evento, en milisegundos.

En el formulario se ha puesto un botn Tiempo, que lo habilita y lo deshabilita, y una etiqueta para ver la
fecha/hora actuales, refrescada en cada evento del temporizador:
private void Tiempo_Click(object sender, System.EventArgs e)
{
Temporizador.Enabled = !Temporizador.Enabled;
Temporizador.Interval = 1000;
}
private void Temporizador_Tick(object sender, System.EventArgs e)
{
lbTiempo.Text = DateTime.Now.ToString();
}

El evento Tick del Timer es el que se enva cada vez que vence la cuenta.

También podría gustarte