MARCAR NO NA TREEVIEW

ALVAROVB2009 15/06/2022 17:25:54
#500072
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
DS2T 17/06/2022 02:25:20
#500077
Resposta escolhida
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.



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;
}
}

}
}
ALVAROVB2009 17/06/2022 09:15:47
#500080
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.
DS2T 17/06/2022 16:44:26
#500081
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!
ALVAROVB2009 17/06/2022 17:27:08
#500082
Agradeço pelas dicas e com certeza irei colocar em prática
Tópico encerrado , respostas não são mais permitidas