Généralement, lorsqu'une interface utilisateur affiche une arborescence de fichiers et de dossiers, elle n'analyse pas toute la hiérarchie en une seule fois. Au lieu de cela, il rassemble juste assez d'informations pour les nœuds qui sont développés. Ensuite, lorsque l'utilisateur développe un nœud, il va alors chercher à savoir ce qui doit être placé sous ce nœud. La raison en est simplement que le nombre de fichiers et de répertoires sur les lecteurs système de beaucoup de gens peut devenir très important, et donc votre application va geler pendant un petit moment s'ils demandent à voir la racine du lecteur C :.
Il est légèrement différent selon que vous utilisez WPF ou Windows Forms. Dans WPF, l'événement Expanded est sur le TreeViewItem
lui-même, alors que dans Windows Forms, il existe plusieurs événements d'expansion sur le TreeView
(et aucun événement sur TreeNode
). Mais le modèle est sensiblement le même.
Lorsque vous ajoutez un nœud d'arborescence qui représente un dossier, créez un nœud factice en dessous. Donnez-lui une identification spéciale (un drapeau spécial dans la propriété Tag, ou peut-être un nom unique qui contient des caractères de système de fichiers non-valides). Cela permettra à l'utilisateur de développer ce noeud. Ensuite, dans votre gestionnaire d'événements d'expansion, regardez le premier nœud enfant - s'il s'agit du nœud factice spécial, supprimez-le puis créez l'ensemble réel des nœuds enfants pour ce nœud. Cela garantira que vous ne rassemblez les nœuds réels qu'une seule fois par répertoire.
est ici une idée approximative pour 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);
}
}
};
Le _dummyTag peut juste être un champ:
private static readonly object _dummyTag = new object();
Merci utile –