none
treeview com checkbox C# RRS feed

Respostas

Todas as Respostas

  • No método do evento AfterCheck do TreeView inclua:

     

    foreach (TreeNode n in e.Node.Nodes)
    {
        n.Checked = e.Node.Checked;
    }
    quinta-feira, 7 de junho de 2007 10:49
  • Valeu funcionou como eu queria.
    quinta-feira, 7 de junho de 2007 20:18
  • 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

    quinta-feira, 21 de junho de 2007 17:02
  • 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

     

     

     

     

     

    quinta-feira, 21 de junho de 2007 20:05
  • 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.
    sexta-feira, 5 de fevereiro de 2010 18:28
  • 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
    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;
                        }
                    }
                }

            }

    quarta-feira, 22 de junho de 2011 21:55