Wenn eine Benutzeroberfläche eine Baumstruktur mit Dateien und Ordnern anzeigt, wird normalerweise nicht die gesamte Hierarchie in einer einzigen Aufnahme gescannt. Stattdessen sammelt es gerade genug Informationen für die Knoten, die erweitert werden. Dann, wenn der Benutzer einen Knoten erweitert, geht es dann darum, herauszufinden, was unter diesem Knoten platziert werden muss.
Der Grund ist einfach, weil die Anzahl der Dateien und Verzeichnisse auf den Systemlaufwerken vieler Personen sehr groß werden kann, und Ihre Anwendung wird für eine Weile einfrieren, wenn sie das Stammverzeichnis von Laufwerk C: fragen.
Es hängt leicht davon ab, ob Sie WPF oder Windows Forms verwenden. In WPF befindet sich das Expanded-Ereignis auf der TreeViewItem
selbst, während in Windows Forms mehrere Erweiterungsereignisse auf der TreeView
(und keine Ereignisse auf TreeNode
) sind. Aber das Muster ist sehr ähnlich.
Wenn Sie einen Baumknoten hinzufügen, der einen Ordner darstellt, erstellen Sie einen Dummy-Knoten darunter. Geben Sie ihm eine spezielle Kennung (ein spezielles Flag in der Tag-Eigenschaft oder möglicherweise einen eindeutigen Namen mit ungültigen Dateisystemzeichen). Dadurch kann der Benutzer diesen Knoten erweitern. Sehen Sie sich dann in Ihrem Erweiterungsereignis-Handler den ersten untergeordneten Knoten an. Wenn es sich um den speziellen Dummy-Knoten handelt, entfernen Sie ihn und erstellen Sie dann den tatsächlichen untergeordneten Knoten für diesen Knoten. Dadurch wird sichergestellt, dass Sie die realen Knoten nur einmal pro Verzeichnis sammeln.
Hier ist eine grobe Idee für WPF:
TreeViewItem folderNode = new TreeViewItem { Header = Path.GetFileName(folderPath) };
parentNode.Items.Add(folderNode);
// create the dummy item under it
TreeViewItem dummy = new TreeViewItem { Tag = _dummyTag };
folderNode.Items.Add(dummy);
folderNode.Expanded += delegate
{
if (folderNode.Items.Count == 1)
{
if (((TreeViewItem)folderNode.Items[0]).Tag == _dummyTag)
{
folderNode.Items.Clear();
CreateFolderChildren(folderNode, folderPath);
}
}
};
Die _dummyTag kann nur ein Feld sein:
private static readonly object _dummyTag = new object();
sehr hilfreich Dank –