23 marzo 2006

Codigo C# y Gtk# agenda sencilla

//--------------------------------------------------------------------------
// Proyecto: Sencilla Agenda de contactos
// Desarrollo: gsur
// Fecha: 18/03/2006
// Compilar:
// mcs sagenda.cs -pkg:gtk-sharp -pkg:glade-sharp -r:System.Data.dll
// -r:Mysql.Data.dll -resource:vagenda.glade
// Entorno de desarrollo: Mono
// Comentarios: El borrado de contactos tiene un error, ya que no recorre el
// numero actual de contactos, falta añadir un poco mas de codigo,
// pero el borrado si lo aplica correctamente, asi que quedan
// advertidos
//--------------------------------------------------------------------------

using System;
using System.Data;
using MySql.Data.MySqlClient;
using Gtk;
using Glade;

public class Agenda
{
[Glade.Widget] Gtk.Window ventana;
[Glade.Widget] Gtk.Entry txtcontacto;
[Glade.Widget] Gtk.Entry txtdire;
[Glade.Widget] Gtk.Entry txttel;
[Glade.Widget] Gtk.Entry txtmail;
[Glade.Widget] Gtk.Label lblnregs;
[Glade.Widget] Gtk.Entry txtbusqueda;

public string sql; //Variable para las cadenas de consulta
public string connectionString;
public IDbConnection dbcon;
public IDbCommand dbcmd;
public IDataReader reader;
public int npos; //Renglon actual
public long nc; //Numero de renglones
public System.UInt32 id_contacto; //Clave primaria de los contactos
public string nombre; //Nombre del contacto
public string direccion; //Direccion del contacto
public string telefono; //Telefono del contacto
public string email; //Email del contacto
public int opcion; //Situacion actual [Insercion o Update]

public static void Main(String[] args)
{
Application.Init();
Agenda gt=new Agenda();
Application.Run();
}

public Agenda()
{
Glade.XML gxml=new Glade.XML(null, "vagenda.glade","ventana",null);
gxml.Autoconnect(this);
connectionString ="Server=localhost;" + "Database=personal;" + "User ID=rafita;" + "Password=;" + "Pooling=false";
dbcon = new MySqlConnection(connectionString);
dbcon.Open();
dbcmd = dbcon.CreateCommand();
sql = "SELECT * FROM miscontactos ORDER BY nombre_contacto LIMIT 0,1";
dbcmd.CommandText = sql;
reader = dbcmd.ExecuteReader();
leer_contacto(reader);
npos=0;
dhabilita(false);
reader.Close();
reader=null;
sql = "SELECT COUNT(id_contacto) AS ncount FROM miscontactos";
dbcmd.CommandText = sql;
reader = dbcmd.ExecuteReader();
reader.Read();
nc = (long) reader["ncount"];
lblnregs.Text="Contacto: 1 de " + nc;
opcion=0;
reader.Close();
reader = null;
dbcmd.Dispose();
dbcmd = null;
}

public void on_ventana_delete_event(object o, DeleteEventArgs args)
{
dbcon.Close();
dbcon = null;
Application.Quit();
}

public void on_bsalir_clicked(System.Object b, EventArgs e)
{
dbcon.Close();
dbcon = null;
Application.Quit();
}

public void on_bprimero_clicked(System.Object b, EventArgs e)
{
npos=0;
lblnregs.Text="Contacto: 1 de " + nc;
mover();
}

public void on_banterior_clicked(System.Object b, EventArgs e)
{
if(npos>0) {
npos-=1;
mover();
}
else
advierte("\n\nSe ha llegado al primer contacto");
lblnregs.Text="Contacto: " + (int) (npos + 1) + " de " + nc;
}

public void on_bsiguiente_clicked(System.Object b, EventArgs e)
{
if(npos<((int) nc-1)) {
npos+=1;
mover();
}
else
advierte("\n\nSe ha llegado al ultimo contacto");
lblnregs.Text="Contacto: " + (int) (npos + 1) + " de " + nc;
}

public void on_bultimo_clicked(System.Object b, EventArgs e)
{
npos=(int) (nc-1);
mover();
lblnregs.Text="Contacto: " + nc + " de " + nc;
}

public void guardar_cancelar()
{
nombre = txtcontacto.Text;
direccion = txtdire.Text;
telefono = txttel.Text;
email = txtmail.Text;
}
public void on_bnuevo_clicked(System.Object b, EventArgs e)
{
dhabilita(true);
guardar_cancelar();
txtcontacto.Text="";
txtdire.Text="";
txttel.Text="";
txtmail.Text="";
opcion=1;
}

public void on_beditar_clicked(System.Object b, EventArgs e)
{
dhabilita(true);
guardar_cancelar();
opcion=2;
}

public void on_bguardar_clicked(System.Object b, EventArgs e)
{
dbcmd = dbcon.CreateCommand();
switch(opcion)
{
case 0:
String msg;
msg="\n\nNo ha elegido alguna opcion [Nuevo/Editar]";
MessageDialog md = new MessageDialog(ventana, DialogFlags.DestroyWithParent, MessageType.Warning, ButtonsType.Ok,msg);
ResponseType r = (ResponseType) md.Run();
if(r==ResponseType.Ok) {
md.Destroy();
}
break;
case 1:
guardar_nuevo();
break;
case 2:
guardar_edicion();
break;
}
opcion=0;
dhabilita(false);
}

public void guardar_nuevo()
{
sql = "INSERT INTO miscontactos(nombre_contacto, direccion_contacto, telefono_contacto, email_contacto) VALUES(";
sql = sql + "'" + txtcontacto.Text + "','" + txtdire.Text + "','" + txttel.Text + "','" + txtmail.Text + "')";
dbcmd.CommandText = sql;
dbcmd.ExecuteNonQuery();
sql = "SELECT COUNT(id_contacto) AS ncount FROM miscontactos";
dbcmd.CommandText = sql;
reader = dbcmd.ExecuteReader();
reader.Read();
nc = (long) reader["ncount"];
nc-=1;
reader.Close();
reader = null;
sql = "SELECT * FROM miscontactos ORDER BY id_contacto LIMIT " + nc + ",1";
dbcmd.CommandText = sql;
reader = dbcmd.ExecuteReader();
reader.Read();
System.UInt32 na = (System.UInt32) reader["id_contacto"];
id_contacto = na;
reader.Close();
reader = null;

sql = "SELECT * FROM miscontactos ORDER BY nombre_contacto";
dbcmd.CommandText = sql;
reader = dbcmd.ExecuteReader();
int ncont=0;
while(reader.Read() && ((System.UInt32) reader["id_contacto"]!=na)) {
ncont+=1;
}
npos=ncont;
ncont+=1;
nc+=1;
lblnregs.Text = "Contacto: " + ncont + " de " + nc;
reader.Close();
reader = null;

dbcmd.Dispose();
dbcmd = null;
}

public void guardar_edicion()
{
sql = "UPDATE miscontactos SET nombre_contacto='" + txtcontacto.Text + "',";
sql = sql + "direccion_contacto='" + txtdire.Text + "',";
sql = sql + "telefono_contacto='" + txttel.Text + "',";
sql = sql + "email_contacto='" + txtmail.Text + "' WHERE id_contacto=" + id_contacto;
dbcmd.CommandText = sql;
dbcmd.ExecuteNonQuery();
dbcmd.Dispose();
dbcmd = null;
}

public void on_bcancelar_clicked(System.Object b, EventArgs e)
{
txtcontacto.Text = nombre;
txtdire.Text = direccion;
txttel.Text = telefono;
txtmail.Text = email;
dhabilita(false);
}

public void on_beliminar_clicked(System.Object b, EventArgs e)
{
String msgdelete;
msgdelete="\n¿Desea realmente eliminar este contacto?";
msgdelete = msgdelete + "\n\nSi desea continuar pulse Aceptar, si no";
msgdelete = msgdelete + "\ndesea continuar pulse Cancelar";
MessageDialog md = new MessageDialog(ventana, DialogFlags.DestroyWithParent, MessageType.Warning, ButtonsType.OkCancel,msgdelete);
ResponseType r = (ResponseType) md.Run();
if(r==ResponseType.Ok) {
dbcon = new MySqlConnection(connectionString);
dbcon.Open();
dbcmd = dbcon.CreateCommand();
sql = "DELETE FROM miscontactos WHERE id_contacto=" + id_contacto;
dbcmd.CommandText = sql;
dbcmd.ExecuteNonQuery();
dbcmd.Dispose();
dbcmd = null;
dbcon.Close();
dbcon = null;
md.Destroy();
}
else
md.Destroy();
}

public void on_bbuscar_clicked(System.Object b, EventArgs e)
{
dbcmd = dbcon.CreateCommand();
sql = "SELECT * FROM miscontactos WHERE nombre_contacto LIKE '" + txtbusqueda.Text + "%'";
dbcmd.CommandText = sql;
reader = dbcmd.ExecuteReader();
if(reader.Read())
{
id_contacto = (System.UInt32) reader["id_contacto"];
System.UInt32 na = id_contacto;
txtcontacto.Text=(string) reader["nombre_contacto"];
txtdire.Text=(string) reader["direccion_contacto"];
txttel.Text=(string) reader["telefono_contacto"];
txtmail.Text=(string) reader["email_contacto"];
reader.Close();
reader = null;
sql = "SELECT * FROM miscontactos ORDER BY nombre_contacto";
dbcmd.CommandText = sql;
reader = dbcmd.ExecuteReader();
int ncont=0;
while(reader.Read() && ((System.UInt32) reader["id_contacto"]!=na)) {
ncont+=1;
}
npos=ncont;
ncont+=1;
lblnregs.Text = "Contacto: " + ncont + " de " + nc;
reader.Close();
reader = null;
}
else
{
MessageDialog md = new MessageDialog(ventana, DialogFlags.DestroyWithParent, MessageType.Warning, ButtonsType.Ok, "\n\nNo se enontro alguna coincidencia");
ResponseType r = (ResponseType) md.Run();
if(r==ResponseType.Ok)
md.Destroy();
}
dbcmd.Dispose();
dbcmd = null;
}

public void mover()
{
dbcmd = dbcon.CreateCommand();
sql = "SELECT * FROM miscontactos ORDER BY nombre_contacto LIMIT " + npos + ",1";
dbcmd.CommandText = sql;
reader = dbcmd.ExecuteReader();
leer_contacto(reader);
reader.Close();
reader = null;
dbcmd.Dispose();
dbcmd = null;
}

public void dhabilita(Boolean valor)
{
txtcontacto.Editable = valor;
txtdire.Editable = valor;
txttel.Editable = valor;
txtmail.Editable = valor;
}

public void advierte(String mensaje)
{
MessageDialog md = new MessageDialog(ventana, DialogFlags.DestroyWithParent, MessageType.Warning, ButtonsType.Ok, mensaje);
ResponseType r = (ResponseType) md.Run();
if(r==ResponseType.Ok)
md.Destroy();
}
public void leer_contacto(IDataReader mireader)
{
mireader.Read();
id_contacto = (System.UInt32) mireader["id_contacto"];
txtcontacto.Text=(string) mireader["nombre_contacto"];
txtdire.Text=(string) mireader["direccion_contacto"];
txttel.Text=(string) mireader["telefono_contacto"];
txtmail.Text=(string) mireader["email_contacto"];
}
}

8 comentarios:

Anónimo dijo...

Hola gsur. Te felicito por tu blog, está muy buena. El motivo de mi comentario es porque me tira el siguiente error al ejecutar el programa:

mono sagenda.exe

** (sagenda.exe:3325): WARNING **: Could not find assembly ICSharpCode.SharpZipLib, references from /ramdisk/home/knoppix/tmp/bin/mono-1.0/release/MySql.Data.dll (assemblyref_index=3)
Major/Minor: 0,81
Build: 0,1407
Token: 1b03e6acf1164f73
System error: No existe el fichero o el directorio


** (sagenda.exe:3325): WARNING **: Could not find assembly MySql.Data, references from /ramdisk/home/knoppix/tmp/bin/mono-1.0/release/sagenda.exe (assemblyref_index=2)
Major/Minor: 1,0
Build: 7,30073
Token: 8e323390df8d9ed4
System error: No existe el fichero o el directorio

cannot open assembly sagenda.exe


Desde ya muchas gracias.

dataGuerrero dijo...

Tengo una duda, lo estas ejecutando con la version live de monoppix?

Por que quizas nos has arrancado el servicio de Mysql, o por lo que veo en el error, es que no tienes el conector .Net de Mysql para Mono.

bajalo de http://dev.mysql.com/downloads/

Espero te haya ayudado

Anónimo dijo...

que onda gsur, use unas partes (un buen diria yo) de tu codigo para un proyecto de la escuela, use Visual c# express. Es un sistema para el control de clientes y proveedores..

saludos

dataGuerrero dijo...

Saludos Alex, oye se escucha interesante el sistema que realizaste, y lo que veo mas interesante es como integraste el proyecto con Visual c# Express, supongo que reemplazaste los widgets que utilice de Gtk con controles de WindowsForms, y no se si utilizaste MySql como motor de base de datos, pero bueno creo que son muchas preguntas, pero gracias por comentarme que te ha servido un poco de mi codigo publicado.

Anónimo dijo...

asi es, reemplaze gtk y lo integre a c# express, pero encontre el proyecto sharp develop y pues me cambie a ese, y si en efecto estoy usando mysql... ya que lo termine subiere el proyecto a algun lado pa que le des un vistaso, soy un novato todavia en esto, jeje
saludos desde tijuana

dataGuerrero dijo...

Que bien, yo instale Sharp develop, pero no lo logre configurar, asi que sigo usando mi editor Vi y Glade para el entorno grafico, jejejeje, que bien estare esperando para echarle un vistazo a ese codigo de tu sistema, se oye interesante, bueno saludos desde Chilpancingo, Gro. Donde el frio nos esta azotando, y saludos a Tijuana.

Anónimo dijo...

ME GUSTARIA TENER ESTA APLICACION EN VISUAL C# ALGUIEN ME PUEDE AYUDAR CON EL CODIGO O QUE PUEDO HACER PARA TRASLADAR A VISUAL C# 2005. 1000 GRACIAS

Anónimo dijo...

Hola gsur

Te sirve GTK C# con Mysql. Ojo, primero la pagina http://dev.mysql.com/downloads/connector/net/, ahora elija una opción en ".NET & Mono" en Select Platform, bájelo, a continuación, descomprime el zip, luego abra la carpeta "v2" entonces escribe "gacutil -i Mysql.data.dll" en el terminal (debe ser el administrador como root) y cópielo en la carpeta /ramdisk/home/knoppix/tmp/bin/mono-1.0/release/ y ejecuta mono sagenda.exe.