Charla .NET Visual Studio 2005

Esta charla fue organizada por el Club .NET de la Escuela Superior de Ingeniería Informática de Orense.

Download .zip Download .tar.gz View on GitHub

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;
        }
    }
}