Curso C# con Mono – ¡Hola Mundo!

Muchos de vosotros veréis este lenguaje como una creación de Microsoft que nada tiene que ver con el Software Libre. Sin embargo, aunque sí es cierto que su creación dependió directamente de la empresa de Redmond y es el lenguaje estrella a día de hoy para desarrollar con la plataforma .NET, el genial Miguel de Icaza supo crear una alternativa libre compatible con esta nueva tecnología.

El nombre de este proyecto es Mono y esta será la herramienta que utilizaremos a lo largo de una serie de entradas en las que os daré las nociones básicas para usar C#.

Preparación e instalación

Para instalar Mono deberemos instalar el paquete del mismo nombre en nuestro sistema, con nuestro gestor de paquetes favorito. Además de Mono utilizaremos MonoDevelop como entorno integrado de desarrollo, para facilitarnos el proceso de compilación y despreocuparnos de los diferentes compiladores para C# en función de la versión. El paquete de MonoDevelop tendrá ese mismo nombre.

Si usáis Ubuntu podréis hacer directamente: sudo apt-get install mono monodevelop y se instalarán sus dependencias.

¡Hola Mundo!

Comenzamos:

  • Abrimos MonoDevelop
  • Hacemos clic sobre “Iniciar nueva solución”
  • Elegimos “Proyecto de consola” e indicamos el título: “HolaMundo”
  • Continuamos, dejando en blanco las opciones de empaquetado y demás que nos propone y ya tenemos delante nuestra el código del ¡Hola Mundo! en C Sharp.

Podéis ver el código a continuación:

using System;

namespace holaMundo
{
	class MainClass
	{
		public static void Main (string[] args)
		{
			Console.WriteLine ("¡Hola Mundo!");
		}
	}
}

Explicación

Vayamos por partes.

  • using System; Usamos el espacio de nombres System. Usando espacios de nombres ajenos al nuestro podemos hacer uso de funciones, por ejemplo, del sistema.
  • namespace holamundo Definimos nuestro espacio de nombres, holamundo.
  • class MainClass Definición de la clase, la llamamos MainClass.
  • public static void Main(string[] args) Definición del método Main, como parámetros le pasamos los argumentos con los que se llama al programa (aunque no los usaremos).
  • Console.WriteLine(“¡Hola Mundo!”); En la clase Consola hay un método WriteLine al que se le pasa una cadena y escribe en la consola dicha cadena, ”¡Hola Mundo!”.

A lo largo de esta serie de entradas iremos profundizando un poco más en Mono y C#.

Author Description

F. Javier Carazo Gil

Casi Ingeniero Informático, co-fundador y administrador de Linux Hispano, además de desarrollar software y mantener sistemas en el CSIC, hace poco he fundado junto con Alberto Hornero una start-up: CODECTION donde trabajamos con software libre. Puedes saber más sobre mí, mi vida laboral, mis libros, mis artículos y mi día a día en @fjcarazo y en mi perfil público de LinkedIn.

  • Pingback: Bitacoras.com()

  • Pingback: mushkinMX » Blog Archive » Curso C# con Mono – ¡Hola Mundo!()

  • jesus

    Me alegro que empeceis con estas entradas sobre mono.

  • http://www.jcarazo.com carazo

    @jesus: Trabajo a diario con .NET en mi trabajo y en casa siempre me gusta tocar la alternativa libre.

    Por cierto, es la mejor forma de compatibilizar desarrollos .NET con equipos Mac OS X y Linux en un centro donde casi todos los sistemas de usuario final son Microsoft.

  • http://rafinguer.blogspot.com Rafael Hernampérez Martín

    El framework .NET se liberó, y gracias a ello esta plataforma es tan popular y tiene tanta penetración en el mundo del software. El entorno de desarrollo Visual Studio, se diga lo que se diga, es el mejor y más productivo. Además, podemos desarrollar en otros lenguajes que al final generen código final en .NET, como, por ejemplo, Python (IronPython).

    Creo que Mono es una buena opción a la hora de desarrollar todo tipo de aplicaciones, y que además sean multiplataforma.

  • http://frss-soft.com Felipe R.

    Me gustaria que alguien pudiera comentar si el C# tiene alguna ventaja real sobre el Java o C++, pues creo que al margen de diferencias minimas las capacidades de los 3 estarían casi al mismo nivel, o el mismo nivel.

    Favor de considerar que la capacidad del programador no es relevante

  • http://www.jcarazo.com carazo

    @Felipe R.: Java y C#, se compilan para luego ejecutarse no a nivel de máquina, sino en máquinas virtuales, Java en sus JVM y C# en su respectivo CLR (Mono provee de un CLR). Estos son los encargados de hacer que el código se ejecute a nivel de máquina. Es decir, el código primero se compila y luego se interpreta.

    C++ es un lenguaje que se compila y por lo tanto a priori, será mucho más eficaz.

    Aparte, C++ tiene un nivel de abstracción menor y aunque soporta orientación a objetos, Java y C# lo hacen de forma más “natural”.

    Si quieres saber más diferencias comenta y te responderemos.

  • Pingback: Internet is a series of blogs (LIII)()

  • Pingback: Internet is a series of blogs (LIII) | NotiGeek()

  • Pingback: The ULS0 project » Internet is a series of blogs (LIII)()

  • Pingback: Internet is a series of blogs (LIII) | Las mejores web en español()

  • Pingback: Internet is a series of blogs (LIII) | Tuiter.com()

  • Pingback: Curso básico de lenguaje de programación C# por Linux Hispano | GeeksRoom()

  • http://frss-soft.com Felipe R.

    Gracias, por la respuesta

    Entonces, segun mi planteamiento, en que me beneficiaría cambiar a Java (por ejemplo) por C# con mono; es decir, si asumimos que hacen lo mismo.

    Si fuera equivalente: Lo que sucede es que sabiendo que Oracle adquirió a Java “a la fuerza”, entonces, sería bueno contar con alternativas, y mejor si son libres. Ahora C# mono, será apoyado por alguna institución?, lo digo por el tema de su continuidad y continuo mejoramiento.

    Si fuera mejor: Mono entonces es un fork de C# de MS?, que me aseguraría la compatibilidad a futuro?, vuelvo a poner como ejemplo a Java, es para bien o para mal, un estándar bastante extendido.

    Son 2 casos que se me ocurren, porque hasta esta el momento y para ser casi justo, no he encontrado algun lenguaje que pueda suplir lo que ha ganado Java o C++ en lo q se refiere a sus características.

    En conclusión, agradezco por el artículo y el tiempo, pero creo que los desarrolladores debemos conocer varios lenguajes que al menos tengan un nivel de envergadura similar al “mejor del mercado” para solo efectuar un recambio en caso sea necesario.

    Saludos

  • http://www.jcarazo.com carazo

    @Felipe R.: Te comento por partes.

    Cambiar a C# desde Java
    Lo de “hacen lo mismo” hay que puntualizarlo. Son dos lenguajes que se parecen mucho, son de alto nivel y tratan la mayor parte de los situaciones de orientación a objetos y lo que supone de forma similar. Sin embargo, las tecnologías que se soportan en ellos son verdaderamente diferentes.

    Apoyo a Mono
    Hasta lo que yo sé, a Mono lo apoya Novell y poco más. Desde este punto de vista Java tiene mucha más fuerza. Tras la compra de Sun por parte de Oracle hay que tener cuidado, pero lo que sí es cierto, es que Mono siempre tendrá detrás los problemas que pueda buscarle Microsoft por patentes o similares.

    Fork de MS C#
    No a ver, Mono es una plataforma que permite ejecutar código MSIL (el código “máquina” de .NET, como el bytecode de Java). No es un fork sino una implementación de unas especificaciones que Microsoft liberó en su día.

    Es decir, Microsoft no ha liberado .NET como tal pero sí que es cierto que desde el comienzo, dotó a la plataforma de una estandarización y una especificación suficiente que permitió a Icaza y compañía la creación de esta tecnología.

    Compatibilidad a futuro
    Mono es un proyecto muy vivo y conforme salen nuevas versiones de la plataforma .NET en cualquiera de sus vertientes, el proyecto las sigue (aunque con algo de retraso como siempre pasa en estas cosas).

    Espero haberte ayudado y si tienes más dudas, no dudes (valga la redundancia) en volver a preguntar.

  • Pingback: Curso C# con Mono()

  • Pingback: Curso C# con Mono | Noticias - d2.com.es()

  • Pingback: Curso C# con Mono – Tipos de datos y uso de referencias | Linux Hispano()

  • miguel

    Imagino que donde se indicar que debemos abrir “Abrimos SharpDevelop” querrá decir “Abrimos MonoDevelop”.
    Un saludo.

  • Pingback: Curso C# con Mono – Tipos de datos y uso de referencias | Superlinux()

  • http://www.jcarazo.com carazo

    @miguel: sí que tienes razón. SharpDevelop es la herramienta que uso para desarrollar con .NET en entornos Windows y se me cruzan los cables… por cierto, también es libre y es primo-hermano de MonoDevelop.

  • Pingback: mushkinMX » Blog Archive » Curso C# con Mono – Tipos de datos y uso de referencias()

  • Gobi

    ¿Qué ventajas tiene Mono/C# frente a Python?
    Siempre he utilizado Python para hacer mis programas usando PyQT y he tenido buenos resultados.

  • http://www.jcarazo.com carazo

    @Gobi: Más que ventajas o inconvenientes, te puedo comentar características que para tu caso particular te vengan mejor o peor.

    Mono/C# está mucho más orientado a objetos que Python, eso puede ser una ventaja o un inconveniente, depende de tus necesidades y lo que te guste este paradigma.

    Respecto al tema de ser multiplataforma, ambos lo son y mucho. Además, ambos son también compilador y luego interpretados en una especie de máquina virtual al estilo de Java.

    Lo que sí es cierto, es que Python es mucho más ligero (al menos en entornos Linux) que Mono, o esa es la sensación que me da. En Windows… con la máquina .NET de Microsoft puede ir la cosa más igualada.

    Te invito a probarlo y que nos cuentes qué te parece.

  • Pingback: Microsoft libera el lenguaje F# | Linux Hispano()

  • Pingback: Microsoft libera el lenguaje F# | Superlinux()

  • http://www.nohaylimites.com jEdwin

    Vaya copy Java and paste C# de micro$oft… esos tios de redmond si que son inteligentes :P

  • http://www.jcarazo.com carazo

    @jEdwin: La verdad que el diseño del lenguaje no es muy original XD, ni siquiera la forma de ejecutar sobre una máquina virtual.

  • Mauricio Stand

    Bueno ya que pasaba por aca y la verdad me encuentro un poco mas iniciado en el mundo de mono, quisiera saber si tu me podrias ayudar o mejor aun, hacer un articulo de como manejar y hacer para llenar un GtkTreeView o en su defecto alguna alternativa o control de la paleta de Gtk# que haga el remplazo a el control de datagird o datagridview de Windows Forms.

    La verdad he econtrado muy poca informacion sobre como popular y usar grillas en mono, lo unico que encontre, esta en la documentacion , en la pagina del proyecto, pero la verdad no enteindo mucho y por lo que entendi , a difernecia del un datagrid en windows forms, toca hacerle al nodeview o al gtktreeview, tiparlo todo, decirle el tamaño de las columnas y de sus filas y ponerle los titulos a mano, a diferencia de su primo en windows forms, que automaticamente toma su extructura dependiendo de como venga el binding.

    Bueno si sabes algo me avisas
    muchas gracias por todo

  • http://www.jcarazo.com carazo

    @Mauricio Stand: La verdad que tienes toda la razón en lo que dices, manejo casi a diario en el trabajo DataGridView de WinForms con C# y en comparación con su alternativa en GTK# son mucho más inmediatas de usar.

    No sé hasta qué punto de profundidad llegará el curso. Esta semana estoy preparando otra entrega sobre declaración de clases y estructuras. Si veo que sigue teniendo aceptación me meteré con GTK#, pero si no la tiene, me quedaré en una mera introducción a la librería gráfica.

    Espero tener razones para dar ejemplos como el que pides, aunque hasta lo que yo sé, el método para hacerlo es bastante manual.

    Un saludo y gracias a ti por seguirnos.

  • ale prieto

    ¡felicitaciones por la iniciativa! y ¡gracias! me viene muy bien este curso!

    saludos… :)

  • Pingback: Curso C# con Mono – Herencia | Superlinux()

  • cibervicho

    Excelente curso. Estoy muy interesado en aprender más de C# sobre Mono… Muchas felicitaciones por este esfuerzo que haces para que más gente siga aprendiendo.

  • http://www.jcarazo.com carazo

    @cibervicho: Gracias :)

    Por si no lo conoces, tenemos una página con todas las entregas del curso: http://www.linuxhispano.net/curso-c-con-mono/

  • zoft

    Un comentario sobre la instalación en ubuntu, a mi no me ha funcionado sudo apt-get install mono monodevelop
    porque sale el mensaje de error siguiente:
    El paquete mono no está disponible, pero algún otro paquete hace referencia
    a él. Esto puede significar que el paquete falta, está obsoleto o sólo se
    encuentra disponible desde alguna otra fuente

    E: El paquete «mono» no tiene candidato de instalación

    Así que con el gestor de paquetes he seleccionado monodevelop y mono-complete (porque no encontraba simplemente mono) y eso pirula.

  • http://www.jcarazo.com carazo

    @zoft: Tienes razón, dependiendo de tus repositorios el nombre del paquete puede cambiar.

    En el caso de Maverick Meerkat acabo de ver en un equipo que el paquete se llama: mono-2.0-gac… en cualquier caso haced algo así como.
    $ apt-cache search mono
    $ yum search mono

    Y así afináis más el nombre.

  • Angel Lopez Bellmont

    Hola F. Javier Carazo Gil,

    Soy nuevo en el lenguaje C# y en Ubuntu. Me acabo de descargar Monodevelop como indicas en la web F. Javier. Yo vengo de Visual Studio pero aqui en Alemania parece que solo hay trabajo si sabes Java

    Solo queria poner este comentario para animarte Javier a seguir asi.

    Un saludo

  • http://www.jcarazo.com F. Javier Carazo Gil

    @Angel: Muchas gracias por el comentario, siempre se agradece.

    Pues la verdad que Java tiene su nicho y quieras que no es más “puro” que C# con Mono en lo que respecta a Software Libre. Nacho está con el curso de Java, espero que te sirva si quieres iniciarte en ese lenguaje.

  • http://www.facebook.com/profile.php?id=100001244630641 Jorge Alberto Huape Alcaraz

    Buen día Javier,

       Excelente comienzo.  Debo confesar que ya yo soy un programador un poco mas avanzado; Sin embargo, plantarle cara algo nuevo [o rediseñado, porque yo ya manejaba VB antes de que se iniciara la plataforma .net] es algo que nos da cierto “pavor” o “pereza” iniciar.  En lo personal, aquí, en México, y en particular, Mexicali, frontera con E.U. se solicitan en empresas serias programadores en .NET [contrastando con el panorama que el chico qué está en Alemania vive].  Gracias por darnos los fundamentos para comenzar, yo aquí seguiré la “talacha”.  Saludos.

  • Luis Adrian Rodriguez Muñoz

    Hola Yo hace tiempo hice una clase que emulaba a un gridview pero para un treeview de monodevelo. Espero que les sirva y claro siempre se puede mejorar ok . Saludos.

    using System;

    using Gtk;

    using System.Data;

    using System.Collections.Generic;

    namespace Visitors.Clases

    {

    ///

    /// This class fill a Gtk.TreeView

    ///

    ///

    /// AUTOR: LUIS ADRIAN RODRIGUEZ MUÑOZ

    /// DATE: SEP/30/2010

    /// SYSTEM: VISITOR SYSTEM

    ///

    public class clsTreeView

    {

    public clsTreeView ()

    {

    }

    ///

    ///Funcion que regresa un TreeViewColumn

    ///

    ///

    /// A

    ///

    ///

    /// A

    ///

    private Gtk.TreeViewColumn GeneratetreeViewColumn(string name)

    {

    Gtk.TreeViewColumn nameColumn = new Gtk.TreeViewColumn ();

    nameColumn.Title = name;

    nameColumn.Clickable = true;

    nameColumn.Alignment = 0.5f ;

    nameColumn.Expand = true;

    return nameColumn;

    }//end GeneratetreeViewColumn

    ///

    /// Funcion que regresa una GenerarCellRender

    ///

    ///

    /// A

    ///

    private Gtk.CellRenderer CreateCellRender()

    {

    Gtk.CellRendererText ColumnNameCell = new Gtk.CellRendererText ();

    ColumnNameCell.WrapWidth = 780;

    ColumnNameCell.WrapMode = Pango.WrapMode.Char;

    //ColumnNameCell.Xalign = 0.5f;

    ColumnNameCell.Xpad = 10;

    return ColumnNameCell;

    }//end CreateCellRender

    ///

    /// format_col

    ///

    ///

    /// A

    ///

    ///

    /// A

    ///

    ///

    /// A

    ///

    ///

    /// A

    ///

    private void format_col(Gtk.TreeViewColumn col,Gtk.CellRenderer cell,Gtk.TreeModel model ,TreeIter iter)

    {

    Gtk.TreePath path = model.GetPath(iter);

    int rownum = path.Indices[0];

    if (rownum % 2 == 1)

    {

    cell.CellBackgroundGdk = new Gdk.Color (238,238,238);

    }

    else

    {

    cell.CellBackground = “white”;

    }//end if

    }//end format_col

    ///

    /// MakeTreeViewCheckBox

    ///

    ///

    /// A

    ///

    ///

    /// A

    ///

    ///

    /// A

    ///

    ///

    /// A

    ///

    ///

    /// A

    ///

    ///

    /// A

    ///

    ///

    /// A

    ///

    public bool MakeTreeViewCheckBox(DataSet PdataSource,ref Gtk.TreeView Ptreeview,

    ref ListStore PlistStore, out string Perror,bool Ppixbuf,

    ref Gtk.CellRendererToggle colCheck)

    {

    Perror = string.Empty;

    try

    {

    List dataTableList = new List ();

    List arrayType = new List ();

    int contadorTree = 0;

    int countColumns = 0;

    countColumns = PdataSource.Tables[0].Columns.Count;

    //——CREATE THE TYPE OF COLUMNS

    foreach (DataColumn column in PdataSource.Tables[0].Columns )

    {

    Ptreeview.AppendColumn (GeneratetreeViewColumn (column.ToString ()) );

    arrayType.Add (typeof (string));

    }//end foreach

    Ptreeview.AppendColumn (“Remove”,colCheck,”active”,countColumns );

    arrayType.Add (typeof(bool));

    //——————-FILL THE GTK.LISTORE————

    PlistStore = new Gtk.ListStore (arrayType.ToArray());

    //—————————————————-

    //—–SAVE THE ATRIBUTES FOR EACH COLUMN

    foreach (Gtk.TreeViewColumn treeColumn in Ptreeview.Columns )

    {

    treeColumn.PackStart (CreateCellRender(), true );

    treeColumn.SetCellDataFunc (treeColumn.CellRenderers[0],format_col);

    treeColumn.AddAttribute (treeColumn.CellRenderers[0],”text”,contadorTree);

    contadorTree =contadorTree +1;

    }//end foreach

    //—–FILL EACH ROW WITH THE RESPECTIVES VALUES

    foreach (DataRow row in PdataSource.Tables[0].Rows)

    {

    for (int contador = 0; contador < PdataSource.Tables[0].Columns.Count; contador++ )

    {

    dataTableList.Add (row[contador].ToString ());

    }//end for

    dataTableList.Add (false);

    PlistStore.AppendValues (dataTableList.ToArray());

    dataTableList = new List ();

    }//end foreach

    return true;

    }

    catch (Exception ex)

    {

    Perror = ex.Message;

    return false;

    }

    }//end MakeTreeView

    ///

    /// MakeTreeView

    /// Recive a DataSet to fill the treeview and its Gtk.Listore

    ///

    ///

    /// A

    ///

    ///

    /// A

    ///

    ///

    /// A

    ///

    ///

    /// A

    ///

    ///

    /// A

    ///

    public bool MakeTreeView(DataSet PdataSource,ref Gtk.TreeView Ptreeview,

    ref ListStore PlistStore, out string Perror,bool Ppixbuf,

    bool pHeader)

    {

    Perror = string.Empty;

    try

    {

    List dataTableList = new List ();

    List arrayType = new List ();

    int contadorTree = 0;

    bool firstCol = true;

    //——CREATE THE TYPE OF COLUMNS

    foreach (DataColumn column in PdataSource.Tables[0].Columns )

    {

    /*

    if (firstCol && Ppixbuf )//to fill with a pixbuf image

    {

    Ptreeview.AppendColumn (new Gtk.TreeViewColumn ());

    arrayType.Add (typeof (Gdk.Pixbuf));

    firstCol = false;

    }//end if

    */

    Ptreeview.AppendColumn (GeneratetreeViewColumn (column.ToString ()) );

    arrayType.Add (typeof (string));

    }//end foreach

    //——————-FILL THE GTK.LISTORE————

    PlistStore = new Gtk.ListStore (arrayType.ToArray());

    //—————————————————-

    firstCol = true;

    Ptreeview.HeadersVisible = pHeader;

    Ptreeview.ModifyBase(StateType.Normal,new Gdk.Color (255,255,255));

    //—–SAVE THE ATRIBUTES FOR EACH COLUMN

    foreach (Gtk.TreeViewColumn treeColumn in Ptreeview.Columns )

    {

    if (Ppixbuf )

    {

    if (firstCol )//to fill with a pixbuf image

    {

    treeColumn.PackStart (new Gtk.CellRendererPixbuf (), true);

    treeColumn.AddAttribute (treeColumn.CellRenderers[0],”pixbuf”,0);

    firstCol = false;

    }

    else

    {

    contadorTree =contadorTree +1;

    treeColumn.PackStart (CreateCellRender(), true);

    treeColumn.AddAttribute (treeColumn.CellRenderers[0],”text”,contadorTree);

    }//end if

    }

    else

    {

    treeColumn.PackStart (CreateCellRender(), true);

    treeColumn.SetCellDataFunc (treeColumn.CellRenderers[0],format_col);

    treeColumn.AddAttribute (treeColumn.CellRenderers[0],”text”,contadorTree);

    contadorTree =contadorTree +1;

    }//end if

    }//end foreach

    //—–FILL EACH ROW WITH THE RESPECTIVES VALUES

    foreach (DataRow row in PdataSource.Tables[0].Rows)

    {

    for (int contador = 0; contador < PdataSource.Tables[0].Columns.Count; contador++ )

    {

    if (contador == 0 && Ppixbuf )//to fill with a pixbuf image

    {

    dataTableList.Add (new Gdk.Pixbuf ("/home/adrian/Pictures/person.gif"));

    }//end if

    if (row[contador].GetType().ToString() == "System.Byte[]" )

    {

    System.Text.Encoding enc = System.Text.Encoding.ASCII;

    string myString = enc.GetString((byte[]) row[contador] );

    dataTableList.Add (myString );

    }

    else

    {

    dataTableList.Add (row[contador].ToString ());

    }

    }//end for

    PlistStore.AppendValues (dataTableList.ToArray());

    dataTableList = new List ();

    }//end foreach

    return true;

    }

    catch (Exception ex)

    {

    Perror = ex.Message;

    return false;

    }

    }//end MakeTreeView

    }//end class

    }//end namespace

    /*

    *aqui como llenar el treveiw

    */

    ///

    /// FillTreeviewFunctionMainParameter

    ///

    ///

    /// A

    ///

    ///

    /// A

    ///

    ///

    /// A

    ///

    ///

    /// A <see cref="List”/>

    ///

    ///

    /// A

    ///

    public bool FillTreeviewFunctionMainParameter(out string Error, ref Gtk.TreeView treeview,

    ref ListStore liststore,Listparameters)

    {

    Error = string.Empty;

    DataSet data = new DataSet ();

    clsMysqlDataBase mysql = new clsMysqlDataBase ();

    if (!mysql.SelectParameters(out data ,”itc.usp_SelectVisitorsTest”,out Error,parameters.ToArray()))

    {

    return false;

    }//end if

    copyVisitors = data.Copy();

    data.Tables[0].Columns.Remove(“VdateStart”);

    data.Tables[0].Columns.Remove(“VdateEnd”);

    //data.Tables[0].Columns.Remove(“pContact”);

    data.Tables[0].Columns.Remove(“PrimaryPersonTosee”);

    data.Tables[0].Columns.Remove(“Citizenship”);

    data.Tables[0].Columns.Remove(“visitorEmpno”);

    data.Tables[0].Columns.Remove(“Vcountry”);

    //data.Tables[0].Columns.Remove(“idstatus”);

    data.Tables[0].Columns.Remove(“statusId”);

    data.Tables[0].Columns.Remove(“Company”);

    //data.Tables[0].Columns.Remove(“Purpose”);

    data.Tables[0].Columns.Remove(“Visit Purpose”);

    data.Tables[0].Columns.Remove(“Location”);

    data.Tables[0].Columns.Remove(“TypeOfvisit”);

    data.Tables[0].Columns.Remove(“Visit type”);

    clsTreeView clstreeview = new clsTreeView ();

    if (!clstreeview.MakeTreeView(data ,ref treeview,ref liststore,out Error,false,true) )

    {

    return false;

    }//end if

    return true;

    }//end FillTreeviewFunction

  • http://www.linuxhispano.net/ F. Javier Carazo Gil

    Mil gracias por tu aportación, si quieres puedo darte un usuario de Linux Hispano para que comentes algo más sobre esta clase.

    Sólo tienes que decírmelo por aquí.