none
TreeView de Poblaciones RRS feed

  • Pregunta

  • Saludos.

    Tengo poca experiencia, y me he visto ante un problema que no consigo resolver. Tengo tres tablas con la siguiente estructura:

    Pais
    -----
    int ID (PK)
    nvarchar Nombre

    Provincia
    -----------
    int ID (PK)
    nvarchar Nombre
    int IDPais (FK a pais)

    Poblacion
    -----------
    int ID (PK)
    nvarchar Nombre
    int IDProvincia (FK a provincia)


    Pues bien el problema esta en que necesito rellenar un treeView con esta informacion. Los nodos padre serian los paises, los cuales tendrian (en el caso de españa) 52 hijos que serian las provincias, y cada una de estas tendria como hijos las poblaciones.

    Se supone que la finalidad de esto es que cuando el usuario haga doble click sobre un hijo yo monte internamente una clase que contendra un codigo int (el de la poblacion) y tres strings con el pais, la provincia y la poblacion.

    LLevo varios dias con esto y el tiempo se me esta hechando encima. Alguien puede hecharme un cable??
    viernes, 17 de abril de 2009 23:35

Respuestas

  • hola,

    Existen dos formas al menos que yo sepa que te podrian servir para cargar el treeview.

    una de ellas es creando cada nodo y agregandolo a el control, para ello necesitaras tener la consulta de la db, o sea un dataset o datareader.

    Cuando lo tengas simplemente deberas recorrerlo e ir armando la jerarquia.

    TreeView (Control, formularios Windows Forms)

    Este link te ayudara a comprender como agregar y quitar nodos, o sea como manipular el control.

    La otra forma es por mediod e la carga de un xml, o sea tu estructura podrias armarla en un xml y luego cargarla al treeview.

    Loading and Saving XML to and from a TreeView Control

    Cómo rellenar un control TreeView con datos XML en Visual Basic .NET

    Bueno espero te sea de utilidad
    Saludos



    Leandro Tuttini
    • Marcado como respuesta Tavaro lunes, 20 de abril de 2009 2:45
    domingo, 19 de abril de 2009 14:10
  • Al final consegui solucionarlo, muchas gracias, no era tan dificil, simplemente estaba obcecado.

    Copio el codigo por si a alguien pudiera servirle.


    private void RellenarTree(DataSet dsPoblaciones)
            {
                //DevExpress.XtraTreeList.Nodes.TreeListNode = nodo;
                //TreeNode nodo;
                int indexPais = 0;
                int indexProvincia=0;
                int indexPoblacion=0;
                try
                {
                    foreach (DataRow drPais in dsPoblaciones.Tables[0].Rows)
                    {
                        indexPais = tvPoblaciones.Nodes.Add(drPais[1].ToString()).Index;
                        foreach (DataRow drProvincia in dsPoblaciones.Tables[1].Rows)
                        {
                            if (int.Parse(drProvincia[2].ToString()) == int.Parse(drPais[0].ToString()))
                                indexProvincia = tvPoblaciones.Nodes[indexPais].Nodes.Add(drProvincia[1].ToString()).Index;
                            foreach (DataRow drPoblacion in dsPoblaciones.Tables[2].Rows)
                            {
                                if (int.Parse(drPoblacion[2].ToString()) == int.Parse(drProvincia[0].ToString()))
                                {
                                    tvPoblaciones.Nodes[indexPais].Nodes[indexProvincia].Nodes.Add(new myTreeNode(drPais[1].ToString(), drProvincia[1].ToString(), 																	drPoblacion[1].ToString(), int.Parse(drPoblacion[0].ToString())));
                                    
                                }
                            }
                        }
                    }
                }
    
    	private void tvPoblaciones_DoubleClick(object sender, EventArgs e)
            {
                myTreeNode tnNodoSeleccionado;
                tnNodoSeleccionado = (myTreeNode)tvPoblaciones.SelectedNode;
                if (tnNodoSeleccionado.Level == 2)
                {
                    pob.Poblacion = tnNodoSeleccionado.sPoblacion;
                    pob.Pais = tnNodoSeleccionado.sPais;
                    pob.Provincia = tnNodoSeleccionado.sProvincia;
                    pob.CodigoPoblacion = tnNodoSeleccionado.iCodigo;
                    Close();
                }
            }

    • Marcado como respuesta Tavaro lunes, 20 de abril de 2009 2:45
    lunes, 20 de abril de 2009 2:44

Todas las respuestas

  • hola,

    Existen dos formas al menos que yo sepa que te podrian servir para cargar el treeview.

    una de ellas es creando cada nodo y agregandolo a el control, para ello necesitaras tener la consulta de la db, o sea un dataset o datareader.

    Cuando lo tengas simplemente deberas recorrerlo e ir armando la jerarquia.

    TreeView (Control, formularios Windows Forms)

    Este link te ayudara a comprender como agregar y quitar nodos, o sea como manipular el control.

    La otra forma es por mediod e la carga de un xml, o sea tu estructura podrias armarla en un xml y luego cargarla al treeview.

    Loading and Saving XML to and from a TreeView Control

    Cómo rellenar un control TreeView con datos XML en Visual Basic .NET

    Bueno espero te sea de utilidad
    Saludos



    Leandro Tuttini
    • Marcado como respuesta Tavaro lunes, 20 de abril de 2009 2:45
    domingo, 19 de abril de 2009 14:10
  • Muchas gracias, voy a darles un ojo a los links que me as puesto y luego te cuento.
    El primero ya lo habia visto, pero no he conseguido hacerlo, para traerme los datos de la BBDD, he recurridoa varios metodos, en uno de ellos me traigo directamente las tres tablas a un dataset.

    En otro tengo montada una vista que me traigo a un dataset, esta vista tiene la misma estructura de la clase que tengo que devolver.

    Quizas el motivo de mi "atasco" sea que me he obsesionado en que el tree se me montara de forma automatica (cosa que veo no es posible XD).

    Lo dicho, muchas gracias por la ayuda, voy a hecharle un vistazo a ver si lo saco y luego te lo comento.
    domingo, 19 de abril de 2009 15:50
  • Al final consegui solucionarlo, muchas gracias, no era tan dificil, simplemente estaba obcecado.

    Copio el codigo por si a alguien pudiera servirle.


    private void RellenarTree(DataSet dsPoblaciones)
            {
                //DevExpress.XtraTreeList.Nodes.TreeListNode = nodo;
                //TreeNode nodo;
                int indexPais = 0;
                int indexProvincia=0;
                int indexPoblacion=0;
                try
                {
                    foreach (DataRow drPais in dsPoblaciones.Tables[0].Rows)
                    {
                        indexPais = tvPoblaciones.Nodes.Add(drPais[1].ToString()).Index;
                        foreach (DataRow drProvincia in dsPoblaciones.Tables[1].Rows)
                        {
                            if (int.Parse(drProvincia[2].ToString()) == int.Parse(drPais[0].ToString()))
                                indexProvincia = tvPoblaciones.Nodes[indexPais].Nodes.Add(drProvincia[1].ToString()).Index;
                            foreach (DataRow drPoblacion in dsPoblaciones.Tables[2].Rows)
                            {
                                if (int.Parse(drPoblacion[2].ToString()) == int.Parse(drProvincia[0].ToString()))
                                {
                                    tvPoblaciones.Nodes[indexPais].Nodes[indexProvincia].Nodes.Add(new myTreeNode(drPais[1].ToString(), drProvincia[1].ToString(), 																	drPoblacion[1].ToString(), int.Parse(drPoblacion[0].ToString())));
                                    
                                }
                            }
                        }
                    }
                }
    
    	private void tvPoblaciones_DoubleClick(object sender, EventArgs e)
            {
                myTreeNode tnNodoSeleccionado;
                tnNodoSeleccionado = (myTreeNode)tvPoblaciones.SelectedNode;
                if (tnNodoSeleccionado.Level == 2)
                {
                    pob.Poblacion = tnNodoSeleccionado.sPoblacion;
                    pob.Pais = tnNodoSeleccionado.sPais;
                    pob.Provincia = tnNodoSeleccionado.sProvincia;
                    pob.CodigoPoblacion = tnNodoSeleccionado.iCodigo;
                    Close();
                }
            }

    • Marcado como respuesta Tavaro lunes, 20 de abril de 2009 2:45
    lunes, 20 de abril de 2009 2:44