none
Recursivo RRS feed

  • Pergunta

  • Olá amigos,

     

    Programo para web com asp.net 3.5 + C#;

    Estou precisando resolver aquele sistema de arvore.

    Tipo, tenho uma tabela

    Codigo | CodPai | Nome

    1          | null        | Familia Silva

    2          | 1           | Claudir

    3          | 2           | José Mario

    4          | 2           | Sônia

    5          | 4           | Anderson

    5          | 5           | Clariana

    6          | 4           | Robson

    7          | null        | Osmar

    5          | 7           | Maria

      

    penso em usar uma metodologia que achei na internet, chamado "Recursivo" ;

    Achei alguns tutorial, porém não consigo entender ainda;

    Atualmente eu resgato do banco estes 3 campos, e populo um DataView.

    Agora o que fazer com este DataView ??

     

    Forte abraço e obrigado pela atenção,

    Luiz Anderson

     

     

     

    segunda-feira, 5 de abril de 2010 17:30

Respostas

    • Marcado como Resposta Anderson.fsa terça-feira, 6 de abril de 2010 18:17
    terça-feira, 6 de abril de 2010 15:23
  • Opa, Bom o material, consegui resolver aqui utilizando a logica de fatorial.

    Muito Obrigado pela atenção!!!

    Caso queira ver, coloca no aspx o controle abaixo:

     

    <asp:TreeView ID="Tree" runat="server">

     

    </asp:TreeView>

    Codigo dos eventos - coloca no aspx.cs

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack) { this.Carregar(); }
        }
    
        protected void Carregar()
        {
            Tree.ShowCheckBoxes = TreeNodeTypes.All;
    
            #region Criar tabela
            DataView ldv = (new DataTable()).DefaultView;
            ldv.Table.Columns.Add("Codigo", System.Type.GetType("System.Int32"));
            ldv.Table.Columns.Add("CodPai", System.Type.GetType("System.Int32"));
            ldv.Table.Columns.Add("Nome");
    
            #region linhas
            DataRow rowNovo = ldv.Table.NewRow();
            rowNovo["Codigo"] = 1;
            rowNovo["Nome"] = "Carlos";
            ldv.Table.Rows.Add(rowNovo);
    
            DataRow rowNovo1 = ldv.Table.NewRow();
            rowNovo1["Codigo"] = 2;
            rowNovo1["CodPai"] = 1;
            rowNovo1["Nome"] = "Anderson";
            ldv.Table.Rows.Add(rowNovo1);
    
    
            DataRow rowNovo2 = ldv.Table.NewRow();
            rowNovo2["Codigo"] = 3;
            rowNovo2["CodPai"] = 2;
            rowNovo2["Nome"] = "Maria";
            ldv.Table.Rows.Add(rowNovo2);
    
            DataRow rowNovo3 = ldv.Table.NewRow();
            rowNovo3["Codigo"] = 4;
            rowNovo3["CodPai"] = 3;
            rowNovo3["Nome"] = "Pedrinho";
            ldv.Table.Rows.Add(rowNovo3);
    
            DataRow rowNovo4 = ldv.Table.NewRow();
            rowNovo4["Codigo"] = 5;
            rowNovo4["CodPai"] = 1;
            rowNovo4["Nome"] = "Robson";
            ldv.Table.Rows.Add(rowNovo4);
    
            DataRow rowNovo5 = ldv.Table.NewRow();
            rowNovo5["Codigo"] = 6;
            rowNovo5["Nome"] = "Sônia";
            ldv.Table.Rows.Add(rowNovo5);
    
            DataRow rowNovo6 = ldv.Table.NewRow();
            rowNovo6["Codigo"] = 7;
            rowNovo6["CodPai"] = 6;
            rowNovo6["Nome"] = "Lucia";
            ldv.Table.Rows.Add(rowNovo6);
    
            DataRow rowNovo7 = ldv.Table.NewRow();
            rowNovo7["Codigo"] = 8;
            rowNovo7["CodPai"] = 5;
            rowNovo7["Nome"] = "Joana";
            ldv.Table.Rows.Add(rowNovo7);
    
            this.GridView1.DataSource = ldv;
            this.GridView1.DataBind();
            #endregion
    
            #endregion
    
    
            if (ldv.Table.Select("Codigo >0 and CodPai is null").Length > 0) {
                DataRow[] row = ldv.Table.Select("Codigo >0 and CodPai is null");
                for (int i = 0; i < row.Length; i++)
                {
                    int codigo = int.Parse(row[i]["codigo"].ToString());
                    string Nome = row[i]["Nome"].ToString();
                    TreeNode masterNode = new TreeNode(Nome, codigo.ToString());
                    Tree.Nodes.Add(masterNode);
                    SubItem(masterNode, ref masterNode, codigo, codigo, ldv);
                }
            }
        }
    
        private void SubItem(TreeNode masterNode, ref TreeNode node, int codigoMaster, int CodPai, DataView ldv)
        {
            
    
            if (ldv.Table.Select("CodPai =" + CodPai).Length > 0)
            {
                DataRow[] rows = ldv.Table.Select("CodPai =" + CodPai);
    
                for (int i = 0; i < rows.Length; i++) {
                    TreeNode childNode = new TreeNode();
                    int Codigo = int.Parse(rows[i]["codigo"].ToString());
                    childNode.Text = rows[i]["Nome"].ToString();
                    childNode.Value = rows[i]["codigo"].ToString();
                    node.ChildNodes.Add(childNode);
                    if (ldv.Table.Select("CodPai =" + Codigo).Length > 0) { SubItem(masterNode, ref childNode, codigoMaster, Codigo, ldv); }
                }
            }
        }

     

     

     

    • Marcado como Resposta Anderson.fsa terça-feira, 6 de abril de 2010 18:02
    terça-feira, 6 de abril de 2010 18:01

Todas as Respostas

  • N entendi o que vc quer fazer.
    segunda-feira, 5 de abril de 2010 17:31
  • exemplo

     

    quero tratar estas informações,

     

    ele vem bruto, quero tratar esta informação e utilizando o "asp:TreeView"  eu poder popular para ficar o controle disponivel;

    + Familia Dias

     + Claudir

        José Mario

     + Sonia

           + Anderson

                Clariana

            Robson

     + Osmar

         Maria

       

    Entendeu?

     

    Abraço

     

     

    segunda-feira, 5 de abril de 2010 17:52
    • Marcado como Resposta Anderson.fsa terça-feira, 6 de abril de 2010 18:17
    terça-feira, 6 de abril de 2010 15:23
  • Opa,

     

    este não serve, porque apenas mostra até 2º nivel; Já tinha visto este tutorial.

     

    Necessito e 1 que não tenha um limite padrão de 2, na verdade o tema funções recursivas, achei alguns, porém muito complexto e não consegui entender. ATL

    terça-feira, 6 de abril de 2010 16:18
  • E isso será que ajuda?

     

    http://www.macoratti.net/treview2.htm

    • Sugerido como Resposta Rodrigo Moura terça-feira, 6 de abril de 2010 18:14
    terça-feira, 6 de abril de 2010 17:15
  • Opa, Bom o material, consegui resolver aqui utilizando a logica de fatorial.

    Muito Obrigado pela atenção!!!

    Caso queira ver, coloca no aspx o controle abaixo:

     

    <asp:TreeView ID="Tree" runat="server">

     

    </asp:TreeView>

    Codigo dos eventos - coloca no aspx.cs

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack) { this.Carregar(); }
        }
    
        protected void Carregar()
        {
            Tree.ShowCheckBoxes = TreeNodeTypes.All;
    
            #region Criar tabela
            DataView ldv = (new DataTable()).DefaultView;
            ldv.Table.Columns.Add("Codigo", System.Type.GetType("System.Int32"));
            ldv.Table.Columns.Add("CodPai", System.Type.GetType("System.Int32"));
            ldv.Table.Columns.Add("Nome");
    
            #region linhas
            DataRow rowNovo = ldv.Table.NewRow();
            rowNovo["Codigo"] = 1;
            rowNovo["Nome"] = "Carlos";
            ldv.Table.Rows.Add(rowNovo);
    
            DataRow rowNovo1 = ldv.Table.NewRow();
            rowNovo1["Codigo"] = 2;
            rowNovo1["CodPai"] = 1;
            rowNovo1["Nome"] = "Anderson";
            ldv.Table.Rows.Add(rowNovo1);
    
    
            DataRow rowNovo2 = ldv.Table.NewRow();
            rowNovo2["Codigo"] = 3;
            rowNovo2["CodPai"] = 2;
            rowNovo2["Nome"] = "Maria";
            ldv.Table.Rows.Add(rowNovo2);
    
            DataRow rowNovo3 = ldv.Table.NewRow();
            rowNovo3["Codigo"] = 4;
            rowNovo3["CodPai"] = 3;
            rowNovo3["Nome"] = "Pedrinho";
            ldv.Table.Rows.Add(rowNovo3);
    
            DataRow rowNovo4 = ldv.Table.NewRow();
            rowNovo4["Codigo"] = 5;
            rowNovo4["CodPai"] = 1;
            rowNovo4["Nome"] = "Robson";
            ldv.Table.Rows.Add(rowNovo4);
    
            DataRow rowNovo5 = ldv.Table.NewRow();
            rowNovo5["Codigo"] = 6;
            rowNovo5["Nome"] = "Sônia";
            ldv.Table.Rows.Add(rowNovo5);
    
            DataRow rowNovo6 = ldv.Table.NewRow();
            rowNovo6["Codigo"] = 7;
            rowNovo6["CodPai"] = 6;
            rowNovo6["Nome"] = "Lucia";
            ldv.Table.Rows.Add(rowNovo6);
    
            DataRow rowNovo7 = ldv.Table.NewRow();
            rowNovo7["Codigo"] = 8;
            rowNovo7["CodPai"] = 5;
            rowNovo7["Nome"] = "Joana";
            ldv.Table.Rows.Add(rowNovo7);
    
            this.GridView1.DataSource = ldv;
            this.GridView1.DataBind();
            #endregion
    
            #endregion
    
    
            if (ldv.Table.Select("Codigo >0 and CodPai is null").Length > 0) {
                DataRow[] row = ldv.Table.Select("Codigo >0 and CodPai is null");
                for (int i = 0; i < row.Length; i++)
                {
                    int codigo = int.Parse(row[i]["codigo"].ToString());
                    string Nome = row[i]["Nome"].ToString();
                    TreeNode masterNode = new TreeNode(Nome, codigo.ToString());
                    Tree.Nodes.Add(masterNode);
                    SubItem(masterNode, ref masterNode, codigo, codigo, ldv);
                }
            }
        }
    
        private void SubItem(TreeNode masterNode, ref TreeNode node, int codigoMaster, int CodPai, DataView ldv)
        {
            
    
            if (ldv.Table.Select("CodPai =" + CodPai).Length > 0)
            {
                DataRow[] rows = ldv.Table.Select("CodPai =" + CodPai);
    
                for (int i = 0; i < rows.Length; i++) {
                    TreeNode childNode = new TreeNode();
                    int Codigo = int.Parse(rows[i]["codigo"].ToString());
                    childNode.Text = rows[i]["Nome"].ToString();
                    childNode.Value = rows[i]["codigo"].ToString();
                    node.ChildNodes.Add(childNode);
                    if (ldv.Table.Select("CodPai =" + Codigo).Length > 0) { SubItem(masterNode, ref childNode, codigoMaster, Codigo, ldv); }
                }
            }
        }

     

     

     

    • Marcado como Resposta Anderson.fsa terça-feira, 6 de abril de 2010 18:02
    terça-feira, 6 de abril de 2010 18:01
  • De nada, amigo. Poderia votar a resposta como util se ajudar.

    terça-feira, 6 de abril de 2010 18:15