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í.
#1 Re: Un programita usando Mono, CSharp, Treeview y el MVC.
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.