Frage

Wie kann man leicht durch alle Knoten in einem TreeView iterieren, untersuchen ihre .Checked Eigenschaft und löschen Sie alle Knoten überprüft?

Es scheint einfach, aber Sie sind nicht eine Sammlung über die Sie iterieren, wodurch die Möglichkeit einer „foreach“ Schleife ändern soll. (Der .Nodes.Remove Aufruf die Sammlung zu ändern.) Wenn dies versucht wird, ist der Effekt, dass nur etwa die Hälfte des .Checked Knoten entfernt werden.

Auch wenn man zwei Durchgänge verwenden: zuerst eine Liste von temporären Indizes zu erstellen, und dann durch einen Index auf dem zweiten Durchlauf zu entfernen - die Indizes würden bei jeder Entfernung ändern, um die Integrität der Indexliste invaliding.

Also, was ist der effizienteste Weg, dies zu tun?

Hier ist ein Beispiel für Code, der gut aussieht, aber eigentlich nur entfernt etwa die Hälfte des .Checked Knoten:.

            foreach (TreeNode parent in treeView.Nodes)
            {
                if (parent.Checked)
                {
                    treeView.Nodes.Remove(parent);
                }
                else
                {
                    foreach (TreeNode child in parent.Nodes)
                    {
                        if (child.Checked) parent.Nodes.Remove(child);
                    }
                }
            }

(Ja, die Absicht ist, nur zu beschneiden Knoten von einem Baum, der zwei Ebenen tief ist.)

War es hilfreich?

Lösung

Damit werden die Knoten nach dem Aufzählen sie, entfernen und kann rekursiv für n-Stufen von Knoten verwendet werden.

void RemoveCheckedNodes(TreeNodeCollection nodes)
{
    List<TreeNode> checkedNodes = new List<TreeNode>();

    foreach (TreeNode node in nodes)
    {
        if (node.Checked)
        {
            checkedNodes.Add(node);
        }
        else
        {
            RemoveCheckedNodes(nodes.ChildNodes);
        }
    }

    foreach (TreeNode checkedNode in checkedNodes)
    {
        nodes.Remove(checkedNode);
    }
}

Andere Tipps

Versuchen Sie, durch den Knoten zu Fuß zurück. Auf diese Weise Ihres Index erhöht sich nicht hinter Ihrer Knotengröße:

for( int ndx = nodes.Count; ndx > 0; ndx--)
{
  TreeNode node = nodes[ndx-1];
  if (node.Checked)
  {
     nodes.Remove(node);
  }
   // Recurse through the child nodes...
}

Wenn Sie es tun wollen effizient benötigen Sie den Überblick über die geprüften Knoten zu halten, wie sie geprüft werden. Speichern Sie die überprüften Knoten in einer Liste (und sollten Sie sie nicht markiert sind).

Wenn Sie einen eindeutigen Schlüssel und eine Menge von Knoten Spur halten Sie könnte auch ein Wörterbuch in Betracht ziehen. Aber wenn Sie nur mit 10-50 zu tun haben, ist es wahrscheinlich nicht einen großen Unterschied machen.

Dann statt durch den gesamten Baum Looping Sie nur Schleife durch Ihre (kleinere) Liste der Knoten.

Während Iterieren Sie könnten eine neue Liste von ungeprüften Produkten konstruieren und dann neu binden Ihre treeview zu dieser neuen Liste (die alten verworfen).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top