J'ai un arborescence avec une case à cocher dans mon application basée sur le formulaire Windows C # Sélectionnez un élément en cliquant sur les cases à cocher dans les nœuds. Maintenant, je veux obtenir le nom de noeud de coches check sélectionné à chaque fois que vous cliquez sur le bouton GetSelectedList enfoncé par l'utilisateur.Comment je le fais?. P>
Merci de me guider pour sortir de ce problème ... P>
4 Réponses :
sur le bouton Cliquez sur l'événement, vous pouvez parcourir un arbre entier comme expliqué à http : //msdn.microsoft.com/en-us/library/wwc698z7.aspx . Ensuite, pour chaque Treenode, vous pouvez vérifier si la case à cocher est cochée ou non et si elle est cochée, vous pouvez ajouter son nom dans une liste. P>
Vous pouvez simplement utiliser une fonction récursive simple:
List<String> CheckedNames( System.Windows.Forms.TreeNodeCollection theNodes) { List<String> aResult = new List<String>(); if ( theNodes != null ) { foreach ( System.Windows.Forms.TreeNode aNode in theNodes ) { if ( aNode.Checked ) { aResult.Add( aNode.Text ); } aResult.AddRange( CheckedNames( aNode.Nodes ) ); } } return aResult; }
Mais arresult.addrange (checkednames (anode.nodes)); code> - est une itération des enfants
ou au lieu de boucler de manière récursive à travers chaque nœud de l'arborescence à chaque fois que quelque chose est vérifié, ce qui pourrait coûter cher lorsque, comme moi, vous avez des centaines ou des milliers d'articles dans la liste, mais pas plus de 20 articles en cours de vérification.
J'ajoute / supprimer d'une liste de chaînes après chèque / décochez car je n'avais que besoin des chaînes complètes, mais vous pouvez probablement aussi utiliser une collection de Treenode de la même manière si vous en aviez besoin. P>
public partial class Form1 : Form { List<String> CheckedNodes = new List<String>(); public Form1() { InitializeComponent(); } private void treeView1_AfterCheck(object sender, TreeViewEventArgs e) { if (e.Node.Checked) { CheckedNodes.Add(e.Node.FullPath.ToString()); } else { CheckedNodes.Remove(e.Node.FullPath.ToString()); } } }
//Uncomplicated, reliable method List<int> _valueList = new List<int>(); private List<int> getCheckedNodes(TreeNodeCollection _parentNodeList) { foreach (TreeNode item in _parentNodeList) { if (item.Checked) { _valueList.Add(Convert.ToInt32(item.Value)); } if (item.ChildNodes.Count > 0) { //.NET does not forget where it stayed. getCheckedNodes(item.ChildNodes); } } return _valueList; }