Contenido
En la charla hice un repaso por varias características interesantes de Visual Studio .NET 2005, como la generación automática de diagramas de clase, el Object Test Bench, el asistente Intellisense, Windows Forms, y otras. Para hacer la demostración de estas herramientas, utilicé como ejemplo una pequeña aplicación de agenda de personas e e.mails.
Código fuente
El código fuente es accesible desde este mismo repositorio. En principio, debería ser suficiente desempaquetarlo en un directorio (de mismo nombre que el Zip), y hacer que Visual Studio abra la carpeta PersonaCharla3.
Aparecen a continuación los fuentes de las tres clases principales de la aplicación, sin contar la parte del diseñador de WinForms de Visual Studio.
Nótese que estas clases han sido creadas en la demostración: particularmente, apenas comprueban condiciones de error, especialmente al cargar y salvar de/a XML.
El Form principal
// El Form (ventana) principal de la
aplicación
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.Xml;
namespace PersonaCharla3 {
public partial class Form1 : Form {
public const string NomArchivoDatos = "personas.dat";
public const string EtqPersonas = "PERSONAS";
public const string EtqPersona = "PERSONA";
public const string EtqNombre = "NOMBRE";
public const string EtqApellidos = "APELLIDOS";
public const string EtqEmail = "EMAIL";
private ArrayList vPersonas;
public Form1()
{
InitializeComponent();
Text = "Agenda de personas";
MinimumSize = new Size( Size.Width, Size.Height );
barraProgreso.Visible = false;
vPersonas = new ArrayList();
ponEstado( "Preparado..." );
cargar();
}
private void cargar()
// Cargar los datos de la
persona de un archivo XML
{
//
Inicio: cargar los nodos
XmlDocument docXml = new XmlDocument();
docXml.Load( NomArchivoDatos );
ponProgresoInic( "Cargando ...", 0,
docXml.DocumentElement.ChildNodes.Count );
// Cargar cada persona en el archivo
foreach ( XmlNode nodo in docXml.DocumentElement.ChildNodes ) {
Persona p = new Persona( "", "", "" );
foreach ( XmlAttribute atr in nodo.Attributes ) {
if ( atr.Name.ToUpper() == EtqNombre ) {
p.Nombre = atr.InnerText;
}
else
if ( atr.Name.ToUpper() == EtqApellidos ) {
p.Apellidos = atr.InnerText;
}
else
if ( atr.Name.ToUpper() == EtqEmail ) {
p.Email = atr.InnerText;
}
}
ponProgresoInc();
vPersonas.Add( p );
listBox1.Items.Add( p.ToString() );
}
// Ya
está hecho
ponProgresoFin();
}
private void ponEstado(string p)
// Cambiar el mensaje de la barra de estado
{
etqEstado.Text = p;
}
public void ponProgresoInic(string msg, int inicio, int final)
// Progreso de un proceso importante: inicio (dar los
parámetros)
{
ponEstado( msg );
barraProgreso.Visible = true;
barraProgreso.Minimum = inicio;
barraProgreso.Maximum = final;
this.Enabled = false;
}
public void ponProgresoInc()
// Progreso de un proceso importante:
continuación, actualizar la barra de progreso
{
barraProgreso.PerformStep();
}
public void ponProgresoFin()
// Progreso de un proceso
importante: fin (volver a poner la aplicación accesible)
{
this.Enabled = true;
barraProgreso.Visible = false;
ponEstado( "Preparado..." );
}
private void button3_Click(object sender, EventArgs e)
// Botón 3:
Cerrar la aplicación
{
Close();
}
private void button1_Click(object sender, EventArgs e)
// Botón 1:
agregar personas ...
{
Persona p = new Persona( "Palotes", "Perico", "perico@palotes.com" );
listBox1.Items.Add( p.ToString() );
vPersonas.Add( p );
}
private void button2_Click(object sender, EventArgs e)
// Botón 2:
modificar persona ...
{
int pos = listBox1.SelectedIndex;
if ( pos >= 0 ) {
Persona p = ( Persona ) vPersonas[ pos ];
Form2 editar = new Form2( p );
editar.ShowDialog( this );
listBox1.Items[ pos ] = p.ToString();
} else MessageBox.Show( "No hay personas o no se ha seleccionado
ninguno." );
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
// Al cerrar la ventana ...
{
save();
}
private void save()
// Guardar los datos como
un archivo XML
{
XmlNode nodo;
XmlNode nodoPpal;
XmlAttribute atr;
// Inicio
XmlDocument docXml = new XmlDocument();
ponProgresoInic( "Guardando ...", 0, vPersonas.Count );
nodo = docXml.CreateNode( XmlNodeType.XmlDeclaration, "xml", "" );
( ( XmlDeclaration ) nodo ).Encoding = "iso-8859-1";
docXml.AppendChild( nodo );
nodoPpal = docXml.CreateNode( XmlNodeType.Element, EtqPersonas, "" );
docXml.AppendChild( nodoPpal );
//
Guardar cada persona
foreach ( Persona p in vPersonas ) {
nodo = docXml.CreateNode( XmlNodeType.Element, EtqPersona, "" );
atr = docXml.CreateAttribute( EtqNombre );
atr.InnerText = p.Nombre;
nodo.Attributes.Append( atr );
atr = docXml.CreateAttribute( EtqApellidos );
atr.InnerText = p.Apellidos;
nodo.Attributes.Append( atr );
atr = docXml.CreateAttribute( EtqEmail );
atr.InnerText = p.Email;
nodo.Attributes.Append( atr );
nodoPpal.AppendChild( nodo );
ponProgresoInc();
}
// Final
docXml.Save( NomArchivoDatos );
ponProgresoFin();
}
}
}
El Form de entrada de datos
// El form (ventana de diálogo) para los
datos de cada persona
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace PersonaCharla3 {
public partial class Form2 : Form {
Persona persona;
public Form2(Persona p)
{
InitializeComponent();
persona = p;
edNombre.Text = p.Nombre;
edApellidos.Text = p.Apellidos;
edEmail.Text = p.Email;
}
private void button1_Click(object sender, EventArgs e)
// Botón 1:
Guardar los datos y salir
{
persona.Nombre = edNombre.Text;
persona.Apellidos = edApellidos.Text;
persona.Email = edEmail.Text;
Close();
}
private void button2_Click(object sender, EventArgs e)
// Botón 2:
Salir sin guardar
{
Close();
}
}
}
La clase Persona
// La clase persona
using System;
using System.Collections.Generic;
using System.Text;
namespace PersonaCharla3 {
public class Persona {
private string nombre;
private string apellidos;
private string email;
public string Nombre
{
get { return nombre; }
set { nombre = value; }
}
public string Apellidos
{
get { return apellidos; }
set { apellidos = value; }
}
public string Email
{
get { return email; }
set { email = value; }
}
/// <summary>
/// Obtener la información textual de la clase
/// </summary>
/// <returns>Una cadena con la
información</returns>
public override string ToString()
{
return apellidos + ',' + ' ' + nombre + ':' + ' ' + email;
}
public Persona(string apellidos, string nombre, string email)
{
Apellidos = apellidos;
Nombre = nombre;
Email = email;
}
}
}