J'ai un dossier public sur le serveur qui contient des sous-dossiers imbriqués récursivement. Dans les différents dossiers Leaf contient des images. Je voulais créer un navigateur de fichiers côté serveur qui affichera les images à l'utilisateur. J'utilise le ASP.NET TreeView Contrôle. Je crée les nœuds d'arbre à l'aide de PopulateOnDemand. Si l'utilisateur clique sur un répertoire de feuilles, je souhaite que les images de ce dossier soient affichées dans un contrôle DataList.Problème de contrôle TreeView
Le problème est que lorsque je clique sur un nœud de l'arbre secondaire (après que j'élargissions nœud parent) Tous les sous arbre disparaît et étendu que le nœud parent est montré sans signe + à côté !!
(je mets PopulateNodesFromClient de la propriété TreeView true)
Quelqu'un peut-il me dire quel est le problème ??
Merci
Voici le code:
<asp:TreeView ID="TreeView1" runat="server" AutoGenerateDataBindings="False"
onselectednodechanged="TreeView1_SelectedNodeChanged"
ontreenodepopulate="TreeView1_TreeNodePopulate">
</asp:TreeView>
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
string path = Server.MapPath(".");
PopulateTopNodes(path);
}
}
private void PopulateTopNodes(string pathToRootFolder)
{
DirectoryInfo dirInfo = new DirectoryInfo(pathToRootFolder);
DirectoryInfo[] dirs = dirInfo.GetDirectories();
foreach (DirectoryInfo dir in dirs)
{
TreeNode folderNode = new TreeNode(dir.Name,dir.FullName);
if (dir.GetDirectories().Length > 0)
{
folderNode.PopulateOnDemand = true;
folderNode.Collapse();
}
TreeView1.Nodes.Add(folderNode);
}
}
protected void TreeView1_TreeNodePopulate(object sender, TreeNodeEventArgs e)
{
if (IsCallback == true)
{
if (e.Node.ChildNodes.Count == 0)
{
LoadChildNode(e.Node);
}
}
}
private void LoadChildNode(TreeNode treeNode)
{
DirectoryInfo dirInfo = new DirectoryInfo(treeNode.Value);
DirectoryInfo[] dirs = dirInfo.GetDirectories();
foreach (DirectoryInfo dir in dirs)
{
TreeNode folderNode = new TreeNode(dir.Name, dir.FullName);
if(dir.GetDirectories().Length>0){
folderNode.PopulateOnDemand = true;
folderNode.Collapse();
}
treeNode.ChildNodes.Add(folderNode);
}
}
protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
{
// Retrieve the images here
}
Cher Jan, Nous vous remercions de votre réponse. Lorsque la propriété TreeView.PopulateNodesFromClient est définie sur true (valeur par défaut), TreeView effectue un rappel côté client pour récupérer les noeuds dont il a besoin. Un noeud donné est renseigné une seule fois à la demande. Après cela, les valeurs restent disponibles sur le client et aucun rappel n'est effectué si le même nœud est réduit et développé. C'est ainsi que le contrôle est censé se comporter. (Peut-être que l'utilisation de l'événement SelectedNodeChanged avec PopulateNodesFromClient etc. est à l'origine de ce bogue?) Je vais jeter un coup d'œil sur l'exemple que vous recommandez. Merci – ProgNet
J'ai pris mon exemple de [ici] (http://www.aspnettutorials.com/tutorials/controls/treeview-open-files-cs.aspx) – ProgNet
Pour moi, il semble que la différence entre votre code et l'exemple est que tout ce qu'ils font dans Page_Load est configuré le nœud racine - tout le reste est rempli par les appels client. Vous chargez tous les nœuds dans Page_Load. –