Usuário com melhor resposta
criar ChildNodes dinamicamente

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?
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
- Sugerido como Resposta Samuel Rodrigues dos Anjos sexta-feira, 15 de março de 2013 17:38
- Marcado como Resposta Fernando.Jarcen sexta-feira, 15 de março de 2013 18:27
Todas as Respostas
-
-
-
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.
-
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
- Sugerido como Resposta Samuel Rodrigues dos Anjos sexta-feira, 15 de março de 2013 17:38
- Marcado como Resposta Fernando.Jarcen sexta-feira, 15 de março de 2013 18:27
-
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
- Sugerido como Resposta Samuel Rodrigues dos Anjos sábado, 16 de março de 2013 00:43