Usuário com melhor resposta
treeview com checkbox C#

Pergunta
-
Oi pessoal
Como eu faço para ao clicar em um nó pai em uma treeview os nós filhos serem também selecionados. Estou usando Hashtable.
Obrigado.
- Movido C. Augusto Proiete [MVP]Moderator sexta-feira, 5 de fevereiro de 2010 19:00 Movido para o fórum apropriado (De:C#)
Respostas
Todas as Respostas
-
-
-
eu tentei fazer esse mesmo codigo em VB.NET, mas esta dando erro, ele diz q Nodes nao faz parte do evento Sustem.EventArgs
For Each n As TreeNode In e.Nodes.Nodes
n.Checked = e.Nodes.Checked
Next
e como eu acesso o evento AfterCheckda treeview?
minha treeview eu carrego direto do banco -
Primeiro, o nome da propriedade que retorna um objeto TreeNode é Node e não Nodes, que é o nome da propriedade do objeto TreeNode que retorna um objeto TreeNodeCollection.
Segundo, se o compilador está reclamando que Nodes não faz parte de System.EventArgs você colocou o código no lugar errado. O código tem que ser colocado no método handler do evento AfterCheck, como dito acima:
Private Sub TreeView1_AfterCheck(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterCheck
For Each n As TreeNode In e.Node.Nodes
n.Checked = e.Node.Checked
Next
End Sub
-
Boa tarde galera.Estou com um problema parecido.Preciso também checar, os nós acima do que foi checado (no caso parent).Criei um método recursivo para pegar o pai do nó em questão, até chegar ao topo.O problema é que ao marcar um nó, o evento AfterCheck é chamado novamente,o que torma meu método recursivo em um looping infinito.Alguém tem uma dica?Segue abaixo o código
private void treeView1_AfterCheck(object sender, TreeViewEventArgs e) { this.MarcarNosAnteriores(e.Node, e.Node.Checked); foreach (TreeNode n in e.Node.Nodes) { n.Checked = e.Node.Checked; } } private void MarcarNosAnteriores(TreeNode noPai, bool valor) { if (noPai.Parent != null) this.MarcarNosAnteriores(noPai.Parent, valor); else { noPai.Checked = valor; } }
Vlw galera
Analísta Programador jr. -
Galera, só para disseminar a solução.Resolvi esse problema usando o evento MouseNodeClick, onde ao alterar a propriedade Checked do nó, não é chamado o evento AfterCheck.Segue abaixo os códigos que fiz. Espero que seje util.Abraços.
private void MarcarNosAnteriores(TreeNode noPai, bool valor) { if (noPai.Parent != null) { if (!valor) { if (!this.VerificaNosSelecionados(noPai.Parent.Nodes)) { noPai.Checked = valor; this.MarcarNosAnteriores(noPai.Parent, valor); } } else { noPai.Checked = valor; this.MarcarNosAnteriores(noPai.Parent, valor); } } else { noPai.Checked = valor; } } private void MarcarNosPosteriores(TreeNodeCollection listaNos, bool valor) { foreach (TreeNode n in listaNos) { n.Checked = valor; if (n.Nodes.Count > 0) this.MarcarNosPosteriores(n.Nodes, valor); } } private bool VerificaNosSelecionados(TreeNodeCollection listaNos) { foreach (TreeNode n in listaNos) { if (n.Checked) return true; else if(n.Nodes.Count > 0) this.VerificaNosSelecionados(n.Nodes); } return false; } private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { this.MarcarNosAnteriores(e.Node, e.Node.Checked); this.MarcarNosPosteriores(e.Node.Nodes, e.Node.Checked); }
Analísta Programador jr.- Sugerido como Resposta Renato Bezerra sexta-feira, 5 de fevereiro de 2010 20:59
-
Bom desenvolvi uma mesma rotina de outra forma
private void TR3_BeforeCheck(object sender, TreeViewEventArgs e)
{
int validade = 0;
if (e.Node.Checked == true)
{
if (e.Node.Parent != null)
{
e.Node.Parent.Checked = true;
}
}
else
{
if (e.Node.Parent != null)
{
for (int i = 0; i < e.Node.Parent.Nodes.Count; i++)
{
if (e.Node.Parent.Nodes[i].Checked == true)
{
validade = 1;
}
}
if (validade == 0)
{
e.Node.Parent.Checked = false;
}
}
}
}