Iver's web place

Life is a journey ... taken one shot at a time!

Un programita usando Mono, CSharp, Treeview y el MVC.

Pues hace tiempo que he estado usando CSharp pero no le he dedicado mucho tiempo para probarlo en linux, solamente lo he usado en windows con el Framework de Microsoft face-sad.png . Como ya necesitaba practicarlo un poco decidí hacer una prueba con postgres como manejador de base de datos, Monodevelop como IDE, GTK para la interfaz y usar el patrón de diseño MVC en el diseño del programita.

No es gran cosa la lógica lo que sirve más es la practica para desarrollar con el patrón de diseño y tratar de darle un refactoring al código para que sea lo más explicito posible face-smile-big.png .

Los archivos son los siguientes:

  • Main.cs - Contiene la clase principal que inicia la aplicación.
  • GladeAppInit.cs - Contiene la clase que representa la vista de la aplicación y los eventos.
  • Factory.cs - Archivo con la clase que sirve de controlador y permite separar la lógica de la vista.
  • DataSource.cs - Archivo que contiene la clase de acceso a datos.
  • Persona.cs - Contiene la definición del empleado (nombre, apellido, etc.)






Primero se genera un proyecto con Monodevelop, se selecciona la ruta y se le van agregando los archivos:

 
/*  Clase Main */
using System;
using Gtk;
using Glade;
namespace projectEmpleados
{
        public class MainClass
        {
                public static void Main (string[] args)
                {
                        new GladeAppInit ();                   
                }
        }
}
 
Ahora la vista que contiene el Treeview:

 
/* Clase GladeAppInit */
using System;
using Gtk;
using Glade;
using System.Collections;
 
namespace projectEmpleados
{
        public class GladeAppInit
        {
                [Widget] Gtk.Entry entName;
                [Widget] Gtk.Entry entAddress;
                [Widget] Gtk.ScrolledWindow scrrllWinData;
                [Widget] Gtk.TreeView tviewData;
               
                Factory factoryPersons;
                ArrayList arrEmpleados;
                       
               
                public GladeAppInit ()
                {
                        Application.Init ();
                        factoryPersons = new Factory();
                       
                        Glade.XML gxml = new Glade.XML (null, "gui.glade", "mainWin", null);
                        gxml.Autoconnect (this);
                        Application.Run ();
                }
 
                // Connect the Signals defined in Glade
                private void OnWindowDeleteEvent (object sender, DeleteEventArgs a)
                {
                        Application.Quit ();
                        a.RetVal = true;
                }
                public void on_btnAccept_clicked(object o, EventArgs a)
                {
                        //arrEmpleados
                        populateGTKObject();
                }      
                public void populateGTKObject()
                {                      
                        arrEmpleados = factoryPersons.getPersons();
                       
                        String strData;
                        tviewData.HeadersVisible = true;
                        tviewData.AppendColumn("Nombre", new CellRendererText(), "text", 0);
                       
                        TreeStore treeSt = null;
                        treeSt = new TreeStore(typeof(string));
                        TreeIter treeIt = new TreeIter ();  
                         
                        foreach (Persona objEmpleado in arrEmpleados)
                        {
                                strData = objEmpleado.ToString();                                                              
                                treeIt = treeSt.AppendValues(strData);
                                                                       
                        }      
                        tviewData.Model = treeSt;
                }
        }
}
 
Para la clase anterior se necesita generar la interfaz con glade para facilitar las cosas face-wink.png :






Ahora la clase que permite la abstracción de la lógica de negocio de la vista y el acceso a datos:

 
// Clase Factory
using System;
using System.Collections;
 
namespace projectEmpleados
{
        public class Factory
        {
                ArrayList arrPersons;
                ManagerDB managerData;
               
                public Factory()
                {
                        // TODO: Add constructor logic here
                        managerData = new ManagerDB();
                }
                public ArrayList getPersons(){
                        managerData.openConnection();
                        arrPersons = managerData.getPersonsFromSQL();
                        managerData.closeConnection();
                        return arrPersons;
                }
        }
}
 
Ahora el acceso a datos:

 
// clase ManagerDB
using System;
using System.Data;
using Npgsql;
using System.Collections;
using System.Reflection;
 
namespace projectEmpleados
{
        public class ManagerDB
         {
         
         #region Variables de instancia  
            private string _connectionStr;
            private IDbConnection dbcon;
            private IDbCommand dbcmd;
            private IDataReader reader;
         #endregion
         
            public ManagerDB(){
                  ConnectionString =
                  "Server=localhost;"  
                  "Database=MonoTest;"  
                  "User ID=iver;"  
                  "Password=mipass;";
            }
           
            public string ConnectionString{
                        set { this._connectionStr = value; }
                        get { return this._connectionStr; }
            }
           
            // If use this method you must to call closeConnection() function.
            public void openConnection()
            {          
               dbcon = new NpgsqlConnection(ConnectionString);
               dbcon.Open();
               dbcmd = dbcon.CreateCommand();
               string sql =
                   "SELECT firstname, lastname "  
                   "FROM employee";
               dbcmd.CommandText = sql;
               reader = dbcmd.ExecuteReader();         
                }
               
                public ArrayList getPersonsFromSQL()
                {
                   ArrayList arrEmpleados = new ArrayList();
               while (reader.Read())
               {
                       Persona objEmpleado = new Persona();
                       foreach (PropertyInfo propiedad in objEmpleado.GetType().GetProperties())
                       {
                               String namePropertie = propiedad.Name;
                               MethodInfo method = objEmpleado.GetType().GetMethod("set_" namePropertie);
                               if(reader[namePropertie] != DBNull.Value)
                               {
                                       object[] execMethod = { reader[namePropertie]};
                                       method.Invoke(objEmpleado, execMethod);
                               }               
                       }
                       arrEmpleados.Add(objEmpleado);
                    }
               return arrEmpleados;
            }
           
            public void closeConnection(){
               // clean up
               reader.Close();
               reader = null;
               dbcmd.Dispose();
               dbcmd = null;
               dbcon.Close();
               dbcon = null;
            }
         }
}
 
La clase que representa los objetos de negocio es la de Persona:

 
using System;
 
using System.Text;
 
 
 
namespace projectEmpleados
 
{
 
    public class Persona
 
    {
 
        private string nombre, ap_paterno;
 
 
 
        public string FirstName
 
        {
 
            set { this.nombre = value; }
 
            get { return this.nombre; }
 
        }
 
 
 
        public string LastName
 
        {
 
            set { this.ap_paterno = value; }
 
            get { return this.ap_paterno; }
 
        }
 
 
 
        public override string ToString()
 
        {
            return this.LastName  " "   this.FirstName;            
 
        }
 
    }
 
}
 
 
 
La definición de la base de datos es la siguiente (solo una triste tablita) tongue.png

firstname varchar 32
lastname varchar 32
address text

Ahora se necesita agegar a monodevelop las referencias de los namespace que necesita para accesar a BD (Npgsql) y para compilar con gtk. En el explorador de la solución se le dá botón derecho del mouse, se selecciona glade-sharp, System.Data






Ahora solo queda un screenshot de la aplicación corriendo, estoy de acuerdo que hace muy poco y le falta mucho para ser funcional, pero repito es tan solo para practicar el diseño y el refactoring.






También se pueden descargar los fuentes desde aquí.
Trackback URI: http://www.iver.com.mx/index.php/trackback/65

#1 Re: Un programita usando Mono, CSharp, Treeview y el MVC.

marco jaquez, <E-Mail> / 16 October, 4:26pm  
avatar

Hola amigo veo interesante tu codigo,mi pregunta es si esa clase que usaste yo la podria implementar al hacer una nomina, es para un examen y tengo que hacer una clase para calcular el salario de los trabajadores de acuerdo a horas trabajadas, tendras alguna idea de como hacerlo gracias de antemano.

[ Reply (0) ]

#2 Re: Un programita usando Mono, CSharp, Treeview y el MVC.

elias, <E-Mail> / 22 February, 1:03pm  
avatar

Ante todo saludos, hermano su código es de gran ayuda, aunque me ha sido imposible descargar el comprimido con los códigos, serias tan amable de enviarmelos a mí correo arriba escrito, de antemano gracias...

[ Reply (0) ]

Leave a Comment



Write the captcha code you are seeing.

Comment XML feeds: RSS | Atom