Navegador de Archivos
Calendario del Blog
General
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
. 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
.
Los archivos son los siguientes:

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
:

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) 
firstname varchar 32
lastname varchar 32
address text

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í.
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
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 ();
}
}
}
/* 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;
}
}
}

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;
}
}
}
// 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;
}
}
}
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;
}
}
}
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://es.iver.com.mx/index.php/trackback/65
Estadísticas de visitantes








Comentarios Recientes
- Celulares con Wifi en Como escoger el amor de tu vida.
- master en La diferencia entre un amigo y un novio
- Iván Jaimes en Internet Explorer 8 y la vista compatibilidad
- mauro en Internet Explorer 8 y la vista compatibilidad
- Iván Jaimes en ¿Qué hacer para que te valoren más?
- marcela en ¿Qué hacer para que te valoren más?
- Iván Jaimes en
- karyot en Haces ruido o te gusta volar?
- Iver en Haces ruido o te gusta volar?
- leo_on en Haces ruido o te gusta volar?
- Iván Jaimes en Los detalles hacen la diferencia
- linuxman en Los detalles hacen la diferencia
- Marcelo Araújo en Internet Explorer 8 y la vista compatibilidad
- Iván Jaimes en Código con aroma de mujer
- karyot en Código con aroma de mujer
- Profesor Mamelowsky en Código con aroma de mujer
- karyot en Lo sabroso de la vida
- Iván Jaimes en
- Iván Jaimes en Internet Explorer 8 y la vista compatibilidad
- cordoba en Internet Explorer 8 y la vista compatibilidad

Dejar un comentario