none
criar ChildNodes dinamicamente RRS feed

  • Pergunta

  • Tenho um código que vou colocar em uma classe que tem o objetivo de criar ParentNodes de controle TreeViews.

    Os ParentNodes eu consigo criar tranquilamente.

    O problema é que não estou conseguindo criar ChildNodes dentro desses Parents.

    Esse é o código que eu estou querendo q fique na classe:

    public void Permissoes(TreeView objeto, TreeNodeEventArgs e, int nivel, String opcao)
            {
                TreeView obj = objeto;
                SiteMapNode map = (SiteMapNode)e.Node.DataItem;
                TreeNode item = obj.FindNode(map.Title);
                // 0 - aplicação 1 - modulo 2 - rotina
                if (nivel == 0)
                {
                    if (map.Title == opcao)
                    {
                        TreeNode p = new TreeNode();
                        p.Text = opcao;
                        p.NavigateUrl = map.Url;
                        objeto.FindNode("home").ChildNodes.Add(p);
                    }
                }

    A chamada dele seria: 

                Permissoes(tvw_menu, e, 0, "Folha de Pagamento");

    o código pra criar as ChildNodes é o seguinte:

    TreeView obj = new TreeView();
                TreeNode myNode = new TreeNode();
                obj = objeto;
                myNode.Text = "teste";
                myNode.NavigateUrl = "~/default.aspx";
                obj.FindNode("home/Financeiro").ChildNodes.Add(myNode);

    Mas esse código não funciona mesmo rodando o anterior que funciona para criar o Parent.

    Detalhe: estou rodando esse código no evento TreeNodeDataBound.

    Alguém tem uma idéia de como fazer isso?

    quinta-feira, 14 de março de 2013 19:54

Respostas

  • Cara,

    Fiz um teste aqui e no Form_Load fiz isso:

    treeView1.Nodes.Add(new TreeNode("Nivel Principal"));

    Depois em um botão no evento click dele fiz isso para adicionar subníveis:

    private void btnCriarNivel_Click(object sender, EventArgs e)
    {
       treeView1.SelectedNode.Nodes.Add(new TreeNode("O nome do subnivel"));
    }

    Consigo até utilizar o evento AfterSelect da TreeView para saber em qual nível estou:

    private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
    {
       txtNomeNivel.Text = e.Node.Text;
    }


    Atenciosamente, Samuel dos Anjos

    sexta-feira, 15 de março de 2013 17:37

Todas as Respostas

  • Cara,

    É apresentado algum erro?


    Atenciosamente, Samuel dos Anjos

    sexta-feira, 15 de março de 2013 00:06
  • Samuel.

    O erro é o seguinte: 'Referência de objeto não definida para uma instância de um objeto'

    sexta-feira, 15 de março de 2013 12:09
  • eu coloquei o trecho com erro em uma procedure chamada Permissoes2 assim:

            public void Permissoes2(TreeView objeto, String opcao, String caminho)
            {
                TreeView obj = new TreeView();
                TreeNode myNode = new TreeNode();
                obj = objeto;
                myNode.Text = opcao;
                myNode.NavigateUrl = "~/default.aspx";
                obj.FindNode(caminho).ChildNodes.Add(myNode);
            }

    Criei uma rotina para apagar tudo e deixar apenas o nó home:

            public void Desabilita_Permissoes(TreeView objeto, TreeNodeEventArgs e)
            {
                TreeView obj = objeto;
                SiteMapNode map = (SiteMapNode)e.Node.DataItem;
                TreeNode parent = e.Node.Parent;
                if (parent != null)
                {
                    parent.ChildNodes.Remove(e.Node);
                }                     
            }

    e depois chamei assim:

    M.Desabilita_Permissoes(tvw_menu,e); 
    Permissoes(tvw_menu, e, 0, "Financeiro");
    Permissoes2(tvw_menu, "cadastrar cartão", "home/Financeiro");

    Mas o erro continua.

    Se eu chamar no evento pre-render ele aparece porém quando clico no botão ele duplica o mesmo.

    A intensão é criar um método que crie os nós de acordo com um sitemap existente mas que mostre apenas o que o usuário tem permissão.

    sexta-feira, 15 de março de 2013 12:49
  • Cara,

    Fiz um teste aqui e no Form_Load fiz isso:

    treeView1.Nodes.Add(new TreeNode("Nivel Principal"));

    Depois em um botão no evento click dele fiz isso para adicionar subníveis:

    private void btnCriarNivel_Click(object sender, EventArgs e)
    {
       treeView1.SelectedNode.Nodes.Add(new TreeNode("O nome do subnivel"));
    }

    Consigo até utilizar o evento AfterSelect da TreeView para saber em qual nível estou:

    private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
    {
       txtNomeNivel.Text = e.Node.Text;
    }


    Atenciosamente, Samuel dos Anjos

    sexta-feira, 15 de março de 2013 17:37
  • Após muitas tentativas consegui resolver o problema:

    Veja: Criei uma classe chamada Menu.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;

    namespace menu
    {
        public class Menu
        {
            public Menu()
            {
                //
                // TODO: Add constructor logic here
                //
            }

            public int IDMenu { get; set; }
            public string Descricao { get; set; }

            public Menu(int id, string descricao)
            {
                this.IDMenu = id;
                this.Descricao = descricao;
            }
        }

        public class SubMenu
        {
            public SubMenu()
            {
                //
                // TODO: Add constructor logic here
                //
            }

            public int IDMenu { get; set; }
            public int IDSubMenu { get; set; }
            public string Descricao { get; set; }
            public string URL { get; set; }

            //public SubMenu(int idMenu, int idSub, string descricao, string url)
            public SubMenu(int idMenu, int idSub, string descricao)
            {
                this.IDMenu = idMenu;
                this.IDSubMenu = idSub;
                this.Descricao = descricao;
                //this.URL = url;
            }
        }

        public class SubMenuItem
        {
            public SubMenuItem()
            {
                //
                // TODO: Add constructor logic here
                //
            }

            public int IDMenu { get; set; }
            public int IDSubMenu { get; set; }
            public int IDNepSub { get; set; }
            public string Descricao { get; set; }
            public string URL { get; set; }

            public SubMenuItem(int idMenu, int idSub, int idNepSub, string descricao, string url)
            {
                this.IDMenu = idMenu;
                this.IDSubMenu = idSub;
                this.IDNepSub = IDNepSub;
                this.Descricao = descricao;
                this.URL = url;
            }
        }   
    }

    Depois implementei a página assim:

            protected void Page_Load(object sender, EventArgs e)
            {
                if (!Page.IsPostBack)
                    this.BindMenuTreeView();
            }

            public static List<Menu> GetMenu()
            {
                List<Menu> lista = new List<Menu>()
            {
                new Menu(1, "Global"),
                new Menu(2, "Administração de Materiais"),
                new Menu(3, "Folha de Pagamento")
            };
                return lista;
            }

            public static List<SubMenu> GetSubMenu()
            {
                List<SubMenu> lista = new List<SubMenu>()
            {
                new SubMenu(1, 1, "Módulo Global"),
                new SubMenu(3, 1, "Módulo Apontamentos")            
            };
                return lista;
            }

            public static List<SubMenuItem> GetSubMenuItem()
            {
                List<SubMenuItem> lista = new List<SubMenuItem>()
            {
                new SubMenuItem(1,1,1,"Cadastra Agente",""),
                new SubMenuItem(3,1,1, "Cadastrar Apontamento", "~/apontamento/cadastra_apontamento.aspx"),
                new SubMenuItem(3,1,2, "Alterar Apontamento", "~/apontamento/altera_apontamento.aspx"),
                new SubMenuItem(3,1,3,"Cadastrar Cartão","~/apontamento/cadastra_cartao.aspx")
            };
                return lista;
            }

            void BindMenuTreeView()
            {
                foreach (Menu m in GetMenu())
                {
                    TreeNode menu = new TreeNode(m.Descricao);
                    foreach (SubMenu s in GetSubMenu())
                    {
                        if (m.IDMenu == s.IDMenu)
                        {
                            TreeNode sub = new TreeNode(s.Descricao, "", "", s.URL, "");
                            foreach(SubMenuItem i in GetSubMenuItem())
                            {
                                if ((m.IDMenu == s.IDMenu) & (s.IDSubMenu == i.IDSubMenu) & (m.IDMenu == i.IDMenu))
                                {
                                    TreeNode nep = new TreeNode(i.Descricao, "", "", i.URL, "");
                                    sub.ChildNodes.Add(nep);
                                }
                            }

                            menu.ChildNodes.Add(sub);
                        }
                    }
                    TreeView1.FindNode("home").ChildNodes.Add(menu);
                }
            }

    A solução foi baseada na sua resposta. 

    Obrigado. 

    []s

    sexta-feira, 15 de março de 2013 18:24