• Domingo 22 de Diciembre de 2024, 08:34

Autor Tema:  Creación Dinámica De Una Estructura De Árbol  (Leído 1835 veces)

granjalf

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Creación Dinámica De Una Estructura De Árbol
« en: Jueves 12 de Abril de 2007, 16:10 »
0
Hola a todos. Tengo el problema de no poder representar datos de una base de datos en una web.

Resulta que los datos son "Causas de un Problema", y estas "causas" tienen "Causas" que las provocan. La manera que ví por conveniente es un arbol, el cual me permita que sus elementos sean link-ables para ver los detalles de la causa clicada en otra web. Alguien sabe como se podría hacer esto?.

Algo así como un diagrama Causa-Efecto.

Ej.

 No puedo Hacer mi Arbol
 |---Porque no se como
 |    |--- porque nunca lo hice antes
 |
 No encuentro re....
 |---Porque no se pu....

Julio34

  • Miembro activo
  • **
  • Mensajes: 25
    • Ver Perfil
Re: Creación Dinámica De Una Estructura De Árbol
« Respuesta #1 en: Viernes 13 de Abril de 2007, 13:37 »
0
Buenas granjalf,

Si trabajas en ASP:NET 1.1 tendras que ir a la web de microsoft y descargarte el Internet Explorer Webcontrols para asp.net 1.1, que incluye un el treeview entre otros.

ttp://www.codeguru.com/csharp/.net/net_ ... 12285#more

saludos!

ing_marco

  • Miembro MUY activo
  • ***
  • Mensajes: 263
    • Ver Perfil
Re: Creación Dinámica De Una Estructura De Árbol
« Respuesta #2 en: Sábado 14 de Abril de 2007, 00:01 »
0
Cuando te refieres a causas tienen causas, me imagino que algo parecido esta en al base de datos una tabla TB_Causa recursiva a si misma, podrias agregar un campo que indique el nivel o si tiene o no causas, de modo que tus consulta debe ser en base a esta valor si tiene causas le pones un hipervinvulo, sino solo texto; en el caso del hipervinculo madnarlo a otra pagina con un parametro que indique que ID de causa tiene para poder hacer la misma consulta inicial pero en base a este ID.

Si necesitas mas ayuda me lo haces saber.
MARCO DIAZ
Ing_Marco
Bachiller Ing de Sistemas.
UNT
Trujillo-Peru

granjalf

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Creación Dinámica De Una Estructura De Árbol
« Respuesta #3 en: Miércoles 18 de Abril de 2007, 16:44 »
0
Muchas gracias por la ayuda :) He logrado hacer el arbol de la siguiente manera:

- Tengo cinco tablas, 1 se llama SACP_CAUSA para registrar causas principales y sus campos son id_SACP (FK),  ID_CAUSA (FK) e ID_SUBTIPO(FK) (Subtipo de la Causa); 1 se llama CAUSAS donde vienen las causas en sí; 1 tabla llamada CAUSAP_CAUSAS con campos ID_CAUSAP (FK)(Causa padre) e ID_CAUSAS (FK) (Causas pertenecientes a otras); 1 tabla donde especifico el SUBTIPO de Causa con campos ID_SUBTIPO, NOM_SUBTIPO (nombre del subtipo), ID_TIPO (FK); 1 tabla TIPO que contiene ID_TIPO,NOM_TIPO

- Digamos en resumen que lo que hace el método es: primero agregar un nodo Raíz llamado CAUSA, llama al metodo agregarNodos pasando la colección de nodos actual (el nodo CAUSA) y la cadena "tipo" para indicar que quiero insertar tipos. Al nodo CAUSA se agregan 5 nodos que son los 5 elementos  de la tabla TIPO, al terminar, el método se llama a sí mismo con la colección de 5 nodos y el string "subtipo", y este al terminar se llama a sí mismo con la ultima colección de nodos y el string "CausaPrincipal", para llamarse al final y hasta llenar toodos los nodos de "causas" de "causas" colocando una colección de nodos de Causas y el string "CausaSecundaria", llamandose a si mismo en su interior.

- Me bajé los controles de IExplorer del link arriba puesto y coloque un control de Treeview en mi page llamado TreeView1.

- En Page_Load llamo al método LlenarTree2() que es el siguiente:

      #region LLENAR ARBOL

      public void LlenarTree2()
      {
         TreeView1.Nodes.Clear();
         TreeView1.Nodes.Add(new Microsoft.Web.UI.WebControls.TreeNode());
         TreeView1.Nodes[0].Text = "<strong>CAUSAS</strong>";
         TreeView1.Nodes[0].Expanded = true;
         agregarNodos("Tipo",TreeView1.Nodes);
      }

      public void agregarNodos(string TipoIns,Microsoft.Web.UI.WebControls.TreeNodeCollection Nodos)
      {
         DataTable nTable = new DataTable();
         switch (TipoIns)
         {
            case "Tipo":
            {
               Base.TIPOCAUSA tipoc = new SGI_Intranet2.Base.TIPOCAUSA();
               nTable = tipoc.GetTipoCausaVerTodos();
               for(int i = 0;i<nTable.Rows.Count;i++)
               {
                  Nodos[0].Nodes.Add(new Microsoft.Web.UI.WebControls.TreeNode());
                  Nodos[0].Nodes.Text = "<strong>" + nTable.Rows.ItemArray[1].ToString() + "</strong>";
                  Nodos[0].Nodes.NodeData = nTable.Rows.ItemArray[0].ToString();
               }
               agregarNodos("SubTipo",Nodos[0].Nodes);
               break;
            }
            case "SubTipo":
            {
               int id_tipo;
               Base.TIPOCAUSA tipoc = new SGI_Intranet2.Base.TIPOCAUSA();
               for(int i=0;i<Nodos.Count;i++)
               {
                  id_tipo = Convert.ToInt32(Nodos.NodeData);
                  nTable = tipoc.GetSubtipoCausaVerdeTipo(id_tipo);
                  for (int j = 0; j < nTable.Rows.Count;j++)
                  {
                     Nodos.Nodes.Add(new Microsoft.Web.UI.WebControls.TreeNode());
                     Nodos.Nodes[j].Text = "<strong>" + nTable.Rows[j].ItemArray[2].ToString() + "</strong>";
                     Nodos.Nodes[j].NodeData = nTable.Rows[j].ItemArray[0].ToString();
                  }
                  agregarNodos("CausaPrincipal",Nodos.Nodes);
               }
               break;
            }
            case "CausaPrincipal":
            {
               Base.CAUSA causa = new SGI_Intranet2.Base.CAUSA();
               for(int i=0;i<Nodos.Count;i++)
               {
                  nTable = causa.GetCausaPrincipalPorSubtipo(id_sacp.ToString(),Nodos.NodeData);
                  for (int j = 0; j < nTable.Rows.Count;j++)
                  {
                     Nodos.Nodes.Add(new Microsoft.Web.UI.WebControls.TreeNode());
                     Nodos.Nodes[j].Text = ResumenDescripcion(nTable.Rows[j].ItemArray[1].ToString());
                     Nodos.Nodes[j].NodeData = nTable.Rows[j].ItemArray[0].ToString();
                     Nodos.Nodes[j].NavigateUrl = "causa-detalle.aspx?id_causa=" + Nodos.Nodes[j].NodeData;
                  }
                  agregarNodos("CausaSecundaria",Nodos.Nodes);
               }
               break;
            }
            case "CausaSecundaria":
            {
               Base.CAUSA causa = new SGI_Intranet2.Base.CAUSA();
               if (Nodos.Count != 0)
               {
                  for(int i=0;i<Nodos.Count;i++)
                  {
                     nTable = causa.GetCausaPorCausa(Nodos.NodeData);
                     for (int j = 0; j < nTable.Rows.Count;j++)
                     {
                        Nodos.Nodes.Add(new Microsoft.Web.UI.WebControls.TreeNode());
                        Nodos.Nodes[j].Text = ResumenDescripcion(nTable.Rows[j].ItemArray[1].ToString());
                        Nodos.Nodes[j].NodeData = nTable.Rows[j].ItemArray[0].ToString();
                        Nodos.Nodes[j].NavigateUrl = "causa-detalle.aspx?id_causa=" + Nodos.Nodes[j].NodeData;
                     }
                     agregarNodos("CausaSecundaria",Nodos.Nodes);
                  }
               }
               break;
            }
         }
      }
      #endregion

Con esto logro llenar el arbol y logro ponerle la dirección dinámica a cada nodo.

Lo único malo es que no puedo colocar el texto como para que entre en un espacio reducido, así que tengo que utilizar un método para reducir el texto y ponerle tres puntos suspensivos al final. Si alguien sabe como hacer para que se vea más nice, le agradecería la respuesta :)
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.