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é? P>
10 Réponses :
Si je ne me trompe pas, le code d'échantillon dans la documentation du AfterCheck événement fait exactement ce que vous voulez. p>
@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 ...
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);
}
}
}
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) code>
//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....
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?
Utilisez AfterCheck Strong> événement de l'arborescence pour coder pour ce qui devrait arriver aux nœuds enfants à l'intérieur de l'arborescence. p>
Passez le même état de la vue d'arborescence de l'arborescence à son enfant également et définissez sa propriété " cochée forte>" sur le même état du nœud TreeView. P>
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.
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
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;
}
}
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;
}
}
Cela ne vérifie pas / décochez les petits-enfants du cochédnode code>.
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;
}
}
Ce code simple fonctionne pour moi
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;
}
}
}
Veuillez ajouter quelques commentaires à votre code et expliquez-le!