6
votes

Comment choisir automatiquement ou désélectionner tous les nœuds enfants chaque fois que son nœud parent est sélectionné ou désélectionné?

J'ai une zone de contrôle d'une arborescence avec les cases à cocher dans mon application Windows Forms.Comment sélectionner automatiquement ou désélectionner automatiquement les nœuds enfants chaque fois que son nœud parent est sélectionné ou désélectionné?


0 commentaires

10 Réponses :


13
votes

Si je ne me trompe pas, le code d'échantillon dans la documentation du AfterCheck événement fait exactement ce que vous voulez.


1 commentaires

@Sourav, tu veux dire, parce que je n'ai pas dupliqué le code de la documentation? Il est disponible dans le lien que j'ai fourni. Cela dit, vous avez raison, je n'aurais probablement pas dû répondre à cette question, mais j'ai voté pour le fermer à cause d'un manque d'effort de recherche. J'apprendais toujours les cordes en 2011 ...



14
votes
    private void HandleOnTreeViewAfterCheck(Object sender,
       TreeViewEventArgs e)
    {
        CheckTreeViewNode(e.Node, e.Node.Checked);
    }

    private void CheckTreeViewNode(TreeNode node, Boolean isChecked)
    {
        foreach (TreeNode item in node.Nodes)
        {
            item.Checked = isChecked;

            if (item.Nodes.Count > 0)
            {
                this.CheckTreeViewNode(item, isChecked);
            }
        }
    }

4 commentaires

La boucle de foresach est-elle traversée de l'arbre récursivement? c'est-à-dire E.Node.Nodes promenant la branche?


Non, un seul niveau. Supposé que son req était avec un seul niveau. J'ai ajouté le code pour faire une vérification récursive. Merci de le pointer.


@Vijaysirigiri Cette logique est un peu risquée car lorsque vous vérifiez l'objet enfant à l'intérieur de la pourbeeach, vous faites cuire de l'événement après-chenille, de sorte que l'effet en cascade devient imprévisible


Mon conseil pour améliorer le code ci-dessus serait d'exécuter cette vérification avant d'appeler CheckTreeViewnode Méthode: si (e.action! = Arbreviewaction.unknown)



1
votes
            //TreeView - myTreeview;
            myTreeview.BeginUpdate();
            //Loop through all the nodes of tree
            foreach (TreeNode node in myTreeview.Nodes)
            {
                //If node has child nodes
                if (HasChildNodes(node))
                {
                    if (node.Checked == true)
                    {
                        //Check all the child nodes.
                        foreach (TreeNode childNode in node.Nodes)
                        {
                            childNode.Checked = true;
                        }
                    }
                }
            }
            myTreeview.EndUpdate();

Hope this helps....

3 commentaires

Vous pouvez faire une méthode et l'appeler à partir de l'événement TreeViewBeforecheck afin de vérifier tous les nœuds d'arbre.


Dessus post vous aide ou vous coincez quelque part


@Tech Giant: Comment créer un événement TreeViewBeforeckeck?



1
votes

Utilisez AfterCheck événement de l'arborescence pour coder pour ce qui devrait arriver aux nœuds enfants à l'intérieur de l'arborescence.

Passez le même état de la vue d'arborescence de l'arborescence à son enfant également et définissez sa propriété " cochée " sur le même état du nœud TreeView.


2 commentaires

Comment créer un événement après-check en C # .net?


Un clic droit sur l'arborescence dans le formulaire, allez à Propriétés. Dans cet onglet Select Event. Ici, vous trouverez la liste des événements associés à ce contrôle. Double-cliquez sur l'événement "AfterCheck" et il est généré pour vous.



0
votes
If Not TreeView1.Nodes(e.Node.Text) Is Nothing Then
    For Each node As TreeNode In TreeView1.Nodes(e.Node.Text).Nodes
            If node.Parent.Checked = True Then
                node.Checked = True
            End If
            If node.Parent.Checked = False Then
                node.Checked = False
            End If

        Next
    End If

0 commentaires

0
votes

Essayez ce code, ceci pour vérifier et décocher le noeud parent également en cliquant sur le nœud enfant.

    private void CheckTreeViewNode(TreeNode node, Boolean isChecked)
    {
        foreach (TreeNode item in node.Nodes)
        {
            item.Checked = isChecked;

            if (item.Nodes.Count > 0)
            {
                this.CheckTreeViewNode(item, isChecked);
            }
        }

        if (isChecked && node.Parent != null)
        {
            treeView1.AfterCheck -= HandleOnTreeViewAfterCheck;
            node.Parent.Checked = true;
            treeView1.AfterCheck += HandleOnTreeViewAfterCheck;
        }


        if (!isChecked && node.Parent != null)
        {
            bool unchk = true;
            treeView1.AfterCheck -= HandleOnTreeViewAfterCheck;
            foreach (TreeNode item in node.Parent.Nodes)
            {
                if (item.Checked)
                {
                    unchk = false;
                    break;
                }
            }
            if (unchk)
                node.Parent.Checked = false;

            treeView1.AfterCheck += HandleOnTreeViewAfterCheck;
        }

    }


0 commentaires

1
votes

Veuillez trouver le code de travail ci-dessous. J'utilise cela dans ma demande. J'espère que cela résoudra le problème.

private void tree_Documents_AfterCheck(object sender, TreeViewEventArgs e)
    {
        TreeNode checkedNode = e.Node;
        foreach (TreeNode node in checkedNode.Nodes)
        {
            node.Checked = checkedNode.Checked;
        }
    }


1 commentaires

Cela ne vérifie pas / décochez les petits-enfants du cochédnode .



0
votes
private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
    if (e.Node.Nodes.Count != 0)
    {
        if (e.Node.Checked)
        {
            CheckAllChildNodes1(e.Node);
        }
        else
        {
            UncheckChildNodes1(e.Node);
        }
    }
}

private void CheckAllChildNodes1(TreeNode treeNodeAdv)
{
    foreach (TreeNode nd in treeNodeAdv.Nodes)
    {
        nd.Checked = treeNodeAdv.Checked;
    }
}

private void UncheckChildNodes1(TreeNode treeNodeAdv)
{
    foreach (TreeNode nd in treeNodeAdv.Nodes)
    {
        nd.Checked = treeNodeAdv.Checked;
    }
}

0 commentaires

1
votes

Ce code simple fonctionne pour moi xxx


0 commentaires

1
votes
    private void CheckAllChildNodes(TreeNode treeNode, bool nodeChecked)
    {
        foreach (TreeNode node in treeNode.Nodes)
        {
            node.Checked = nodeChecked;
            if (node.Nodes.Count > 0)
            {
                this.CheckAllChildNodes(node, nodeChecked);
            }
        }
    }
    private void treeView_AfterCheck(object sender, TreeViewEventArgs e)
    {
        if (e.Action != TreeViewAction.Unknown)
        {
            if (e.Node.Nodes.Count > 0)
            {
                if (!e.Node.Checked)
                {
                    this.CheckAllChildNodes(e.Node, e.Node.Checked);
                }
            }
        }

        if (e.Node.Parent != null)
        {
            TreeNode n = e.Node;
            while (n.Parent != null)
            {
                if (n.Checked)
                {
                    n.Parent.Checked = true;
                }
                n = n.Parent;
            }
        }

    }

1 commentaires

Veuillez ajouter quelques commentaires à votre code et expliquez-le!