Childnode eines TreeView selektieren

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von RushDen.

    Ich hät auch noch was:

    C#-Quellcode

    1. public Form1()
    2. {
    3. InitializeComponent();
    4. testiterator = customTreeView1.GetEnumerator();
    5. }
    6. private IEnumerator<TreeNode> testiterator;
    7. private void button2_Click(object sender, EventArgs e)
    8. {
    9. TreeNode lActualNode = testiterator.Current;
    10. // Mach was mit dem Knoten
    11. testiterator.MoveNext();
    12. }

    C#-Quellcode

    1. public class CustomTreeView : TreeView, IEnumerable<TreeNode>
    2. {
    3. public IEnumerator<TreeNode> GetEnumerator()
    4. {
    5. return new TreeViewIterator(this);
    6. }
    7. IEnumerator IEnumerable.GetEnumerator()
    8. {
    9. return new TreeViewIterator(this);
    10. }
    11. private class TreeViewIterator : IEnumerator<TreeNode>
    12. {
    13. public TreeViewIterator(TreeView pTree)
    14. {
    15. pNodes = new TreeNode[pTree.GetNodeCount(true)];
    16. fillArray(pTree);
    17. _count = 0;
    18. }
    19. private TreeNode[] pNodes;
    20. private int _count;
    21. public TreeNode Current
    22. {
    23. get
    24. {
    25. return pNodes[_count];
    26. }
    27. }
    28. private void fillArray(TreeView pTree)
    29. {
    30. foreach (TreeNode elem in pTree.Nodes)
    31. {
    32. recursiveFilling(elem);
    33. }
    34. }
    35. private void recursiveFilling(TreeNode pNode)
    36. {
    37. pNodes[_count++] = pNode; // Preorder traversierung um bauminhalte abzuspeichern
    38. foreach (TreeNode elem in pNode.Nodes)
    39. {
    40. recursiveFilling(elem);
    41. }
    42. }
    43. object IEnumerator.Current
    44. {
    45. get
    46. {
    47. return pNodes[_count];
    48. }
    49. }
    50. public void Dispose()
    51. {
    52. throw new NotImplementedException(); // ist hier unwichtig
    53. }
    54. public bool MoveNext()
    55. {
    56. if (_count == pNodes.Length - 1)
    57. return false;
    58. _count++;
    59. return true;
    60. }
    61. public void Reset()
    62. {
    63. _count = 0;
    64. }
    65. }
    66. }



    Ist zwar mehr Code, aber der ist (1) wesentlich effizienter als der von Rod (stets Laufzeit von O(1), da bei next() nur der nächste index aufgerufen wird), nur das Laden der Werte dauert verhältnismäßig "länger" (da die iterierung weiter delegiert wird (quasi an das array), anstatt explizit einen iterator für so eine baumstruktur zu implementieren) mit "länger" sinds denk ich paar ms wenn nich ns gemeint.
    (2) kann man das besser modizifizieren (z.B. wenn er beim letzten knoten ist und zum anfang zurück soll einfach die MoveNext Methode umschreiben sind 2-3 Zeilen) und (3) sieht's schicker aus (sehr wichtig!)