MARCAR NO NA TREEVIEW
Pessoal boa tarde, tenho uma treeview onde tem os acessos de um usuário, já esta preenchida com todos os seus devidos campos, o que estou tentando fazer é pegar o acesso do usuário e marcar o check do nó , más não estou conseguindo fazer isso
//Carregar o acesso do usuário
ListaAcessoUsuario = new HashSet<string>(Usuario.ListarAcesso(CodUsuarioSelecionado));
//Marcar o acesso no treeview
foreach (var item in ListaAcessoUsuario)
{
TreeAcesso.Nodes.Find(item.Trim(), true);
TreeAcesso.SelectedNode.Checked = true;
}
AcessoCarregado = true;
Minha idéia era essa que postei, utilizando o find e ai entro com o nome da tag , procurando em todos os filhos e ja marcava como checked
Alguém poderia me dar uma luz, só falta essa parte para poder finalizar esse controle de acesso e não estou achando muita coisa referente a isso
Desde já agradeço a todos
//Carregar o acesso do usuário
ListaAcessoUsuario = new HashSet<string>(Usuario.ListarAcesso(CodUsuarioSelecionado));
//Marcar o acesso no treeview
foreach (var item in ListaAcessoUsuario)
{
TreeAcesso.Nodes.Find(item.Trim(), true);
TreeAcesso.SelectedNode.Checked = true;
}
AcessoCarregado = true;
Minha idéia era essa que postei, utilizando o find e ai entro com o nome da tag , procurando em todos os filhos e ja marcava como checked
Alguém poderia me dar uma luz, só falta essa parte para poder finalizar esse controle de acesso e não estou achando muita coisa referente a isso
Desde já agradeço a todos
Vendo seu código, me fez pensar que talvez na hora de criar o TreeNode voce não esteja passando a key, somente a propriedade text. Como a pesquisa do método Find é feita usando o parâmetro key, poderia ser isso.
De qualquer forma fiz um exemplo simples aqui. Para deixar funcional, simulei um banco em memória. O que é importante pra voce é o que está depois do construtor do formulário.
De qualquer forma fiz um exemplo simples aqui. Para deixar funcional, simulei um banco em memória. O que é importante pra voce é o que está depois do construtor do formulário.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace TreeViewExample
{
public partial class Form1 : Form
{
class Permission
{
public string Id { get; set; }
public string Description { get; set; }
internal Permission(string id, string description)
{
this.Id = id;
this.Description = description;
}
}
class User
{
public string Name { get; set; }
public IList<Permission> Permissions { get; set; }
public User(string name)
{
this.Name = name;
}
}
class DummyDatabase
{
public IList<User> Users { get; private set; }
public IList<Permission> Permissions { get; private set; }
internal DummyDatabase()
{
this.Permissions = CreatePermissions();
this.Users = CreateUsers();
}
private IList<Permission> CreatePermissions()
{
return new List<Permission>()
{
new Permission("Customer.CanEdit", "Allow to edit a customer"),
new Permission("Customer.CanDelete", "Allow to delete a customer"),
new Permission("Customer.CanInsert", "Allow to insert a customer"),
new Permission("Customer.CanView", "Allow to view a customer")
};
}
private IList<User> CreateUsers()
{
return new List<User>()
{
new User("Gohan")
{
Permissions = new List<Permission>()
{
this.Permissions.First(permission => permission.Id == "Customer.CanEdit"),
this.Permissions.First(permission => permission.Id == "Customer.CanView")
}
}
};
}
}
private readonly DummyDatabase _database = new DummyDatabase();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
this.LoadAllPermissions();
this.CheckUserPermissions(userName: "Gohan");
}
private void LoadAllPermissions()
{
foreach(Permission permission in _database.Permissions)
treeView1.Nodes.Add(key: permission.Id, text: permission.Description);
}
private void CheckUserPermissions(string userName)
{
User user = this._database.Users.First(u => u.Name == userName);
foreach(Permission userPermission in user.Permissions)
{
TreeNode node = treeView1.Nodes.Find(userPermission.Id, searchAllChildren: true).First();
node.Checked = true;
}
}
}
}
DS2T agradeço o retorno e a ajuda
Quanto ao seu comentário, eu tinha colocado sim o nome da minha chave no nó , segue meu comando para preencher, caso tiver alguma sugestão para eu melhorar esse preenchimento, aceito, pois como estou começando a desenvolver em C#, posso estar fazendo alguma coisa errada
private void PreencherTreeView(TreeNode n, string Chave_Filho)
{
string Sql = "Select chave,chave_p,texto from acessoxitens where chave_p = "" + Chave_Filho + "" order by ncadastro";
DataTable Dt = BancoDados.MostraDados(Sql);
if (Dt.Rows.Count > 0)
{
foreach (DataRow registro in Dt.Rows)
{
TreeNode t = new TreeNode(registro["texto"].ToString());
t.Name = registro["chave"].ToString();
PreencherTreeView(t, registro["chave"].ToString());
if (n == null)
TreeAcesso.Nodes.Add(t);
else
n.Nodes.Add(t);
}
}
}
Com o seu código entendi o que fiz de errado na pesquisa e o porque estava errado, no meu código, eu achei que ao encontrar o nó, automaticamente ele ficava selecionado , porém não estava acontecendo isso.
Quanto ao seu comentário, eu tinha colocado sim o nome da minha chave no nó , segue meu comando para preencher, caso tiver alguma sugestão para eu melhorar esse preenchimento, aceito, pois como estou começando a desenvolver em C#, posso estar fazendo alguma coisa errada
private void PreencherTreeView(TreeNode n, string Chave_Filho)
{
string Sql = "Select chave,chave_p,texto from acessoxitens where chave_p = "" + Chave_Filho + "" order by ncadastro";
DataTable Dt = BancoDados.MostraDados(Sql);
if (Dt.Rows.Count > 0)
{
foreach (DataRow registro in Dt.Rows)
{
TreeNode t = new TreeNode(registro["texto"].ToString());
t.Name = registro["chave"].ToString();
PreencherTreeView(t, registro["chave"].ToString());
if (n == null)
TreeAcesso.Nodes.Add(t);
else
n.Nodes.Add(t);
}
}
}
Com o seu código entendi o que fiz de errado na pesquisa e o porque estava errado, no meu código, eu achei que ao encontrar o nó, automaticamente ele ficava selecionado , porém não estava acontecendo isso.
O código em si está bacana.
Umas dicas para um próximo desenvolvimento:
1 - Tenta isolar a camada de dados. Deixe o acesso ao banco de dados, assim como as consultas, numa camada separada da de apresentação. Isso vai facilitar na manutenção.
2 - Evite ficar concatenando consultas SQL, isso pode dar margem a SQL Injection. Sempre prefira usar parâmetros.
3 - Prefira trabalhar com classes tipadas do que com DataTable/DataSet. Vai facilitar a manutenção e também evitar essas conversões explÃÂcitas no meio do código - como fez ao usar ToString().
4 - Tente manter um padrão de nomenclatura constante. Tem hora que sua variável começa com letra minúscula (TreeNode t = ...). Tem hora que voce declara como maiúscula (DataTable Dt ...). O mesmo para os parâmetros do método também. Percebi que hora voce usa camelCase e hora snake_case. Manter o padrão deixa o código mais fácil de ler.
5 - Cuidado com métodos recursivos ou loops que acessam o banco de dados. Geralmente não vale a pena ficar nesse "vai-e-volta" entre aplicação e banco de dados. A latencia da rede muitas vezes vai deixar o tempo de transferencia de dados muito maior do que a da consulta em si.
Abraços!
Umas dicas para um próximo desenvolvimento:
1 - Tenta isolar a camada de dados. Deixe o acesso ao banco de dados, assim como as consultas, numa camada separada da de apresentação. Isso vai facilitar na manutenção.
2 - Evite ficar concatenando consultas SQL, isso pode dar margem a SQL Injection. Sempre prefira usar parâmetros.
3 - Prefira trabalhar com classes tipadas do que com DataTable/DataSet. Vai facilitar a manutenção e também evitar essas conversões explÃÂcitas no meio do código - como fez ao usar ToString().
4 - Tente manter um padrão de nomenclatura constante. Tem hora que sua variável começa com letra minúscula (TreeNode t = ...). Tem hora que voce declara como maiúscula (DataTable Dt ...). O mesmo para os parâmetros do método também. Percebi que hora voce usa camelCase e hora snake_case. Manter o padrão deixa o código mais fácil de ler.
5 - Cuidado com métodos recursivos ou loops que acessam o banco de dados. Geralmente não vale a pena ficar nesse "vai-e-volta" entre aplicação e banco de dados. A latencia da rede muitas vezes vai deixar o tempo de transferencia de dados muito maior do que a da consulta em si.
Abraços!
Agradeço pelas dicas e com certeza irei colocar em prática
Tópico encerrado , respostas não são mais permitidas