2010-04-16 12 views
0

Dans le MSDN est writen à propos TreeNode que:TreeView Control comportement événement inattendu

"Par défaut, un nœud est en mode de sélection."

"Pour mettre un noeud en mode de sélection, définissez la propriété NavigateUrl du noeud sur une chaîne vide."

"Lorsqu'un noeud est en mode de sélection, utilisez la propriété SelectAction pour spécifier le ou les événements à déclencher lors de la sélection d'un noeud." "Définition de la valeur TreeNodeSelectAction TreeNodeSelectAction.Select Déclenche l'événement SelectedNodeChanged lorsqu'un noeud est sélectionné."

S'il vous plaît voir TreeNode

est ici le problème et peut-être un bug dans le contrôle:

Quand je mets l'objet TreeNode valeur PopulateOnDemand true et appelle la fonction collapse() sur ce nœud. Ensuite, l'événement TreeNodeExpanded est déclenché en plus de l'événement SelectedNodeChanged. Ceci est en contradiction complète avec ce qui est écrit dans le MSDN. Selon le MSDN, cela devrait se produire uniquement si la propriété TreeNodeSelectAction est définie sur TreeNodeSelectAction.SelectExpand.

Est-ce que certains savent quelle est la cause de cela?

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); 

    } 
} 

//MSDN : Occurs when a node with its PopulateOnDemand property set to true is expanded in //the TreeView control. 
protected void TreeView1_TreeNodePopulate(object sender, TreeNodeEventArgs e) 
{ 
    LoadChildNode(e.Node);  
} 

private void PopulateTopNodes(string pathToRootFolder) 
{ 
    DirectoryInfo dirInfo = new DirectoryInfo(pathToRootFolder); 
    DirectoryInfo[] dirs = dirInfo.GetDirectories(); 
    foreach (DirectoryInfo dir in dirs) 
    { 
     string relativePath = (dir.FullName).Replace(pathToRootFolderPrefix, ""); 
     TreeNode folderNode = new TreeNode(dir.Name, relativePath); 

     if (dir.GetDirectories().Length > 0) 
     { 
      folderNode.PopulateOnDemand = true; 
      folderNode.Collapse(); 

     } 
     folderNode.NavigateUrl = ""; 
     folderNode.SelectAction = TreeNodeSelectAction.Select; 
     TreeView1.Nodes.Add(folderNode); 
    } 
} 

private void LoadChildNode(TreeNode treeNode) 
{ 


    string d = treeNode.NavigateUrl; 
    string action = treeNode.SelectAction.ToString(); 


    string fullPath = Path.Combine(pathToRootFolderPrefix, treeNode.Value); 
    DirectoryInfo dirInfo = new DirectoryInfo(fullPath); 


    DirectoryInfo[] dirs = dirInfo.GetDirectories(); 
    foreach (DirectoryInfo dir in dirs) 
    { 


     string relativePath = (dir.FullName).Replace(pathToRootFolderPrefix, ""); 
     TreeNode folderNode = new TreeNode(dir.Name, relativePath); 

     if(dir.GetDirectories().Length>0){ 
      folderNode.PopulateOnDemand = true; 
      folderNode.Collapse(); 

     } 
     folderNode.NavigateUrl = ""; 
     folderNode.SelectAction = TreeNodeSelectAction.Select; 
     treeNode.ChildNodes.Add(folderNode); 
    } 
} 

//MSDN:Occurs when a node is selected in the TreeView control. 
protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e) 
{ 


} 

Merci

Répondre

0

Je suis ne sais pas ASP.Net, mais la simple lecture de votre code que vous définissez à SelectExpand mais dans vos commentaires ci-dessus, il semble comme vous pensez que vous le définissez à sélectionner (ou ce n'est qu'une faute de frappe dans l'exemple de code?). Dans les deux méthodes de votre échantillon, il est écrit:

folderNode.SelectAction = TreeNodeSelectAction.SelectExpand; 
+0

Merci pour votre réponse! C'est juste une faute de frappe dans l'échantillon. Je vais corriger le code. Dans mon code, il s'agit de TreeNodeSelectAction.Select; – ProgNet