2008-10-15 15 views
3

J'ai une page ASP.Net 2.0 qui contient deux UpdatePanels. Le premier panneau contient un TreeView. Le deuxième panneau contient une étiquette et est déclenché par une sélection dans l'arborescence. Lorsque je sélectionne un nœud, l'étiquette est mise à jour comme prévu et le TreeNode sur lequel j'ai cliqué devient en surbrillance et le nœud précédemment sélectionné n'est plus surligné. Cependant, si un nœud est en surbrillance (sélectionné) dans le code, la surbrillance n'est pas supprimée lors de la sélection d'un autre nœud.Comment effacer la sélection précédente lorsqu'un fichier asp: TreeView se trouve dans un UpdatePanel?

Le balisage

<asp:UpdatePanel ID="UpdatePanel1" runat="server" ChildrenAsTriggers="false" UpdateMode="Conditional"> 
    <ContentTemplate> 
     <asp:TreeView ID="TreeView1" runat="server" OnSelectedNodeChanged="TreeView1_SelectedNodeChanged"> 
     <SelectedNodeStyle BackColor="Pink" /> 
     </asp:TreeView> 
    </ContentTemplate> 
</asp:UpdatePanel> 
<asp:UpdatePanel ID="UpdatePanel2" runat="server" ChildrenAsTriggers="True"> 
    <ContentTemplate> 
     <asp:Label ID="Label1" runat="server" Text=" - "></asp:Label> 
    </ContentTemplate> 
    <Triggers> 
     <asp:AsyncPostBackTrigger ControlID="TreeView1" EventName="SelectedNodeChanged" /> 
    </Triggers> 
</asp:UpdatePanel> 

Le code derrière

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     TreeView1.Nodes.Add(new TreeNode("Test 1", "Test One")); 
     TreeView1.Nodes.Add(new TreeNode("Test 2", "Test Two")); 
     TreeView1.Nodes.Add(new TreeNode("Test 3", "Test Three")); 
     TreeView1.Nodes.Add(new TreeNode("Test 4", "Test Four")); 
     TreeView1.Nodes[0].Selected = true; 
    } 
} 

protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e) 
{ 
    Label1.Text = TreeView1.SelectedValue; 
} 

Le au début du premier noeud est sélectionné. Pourquoi sa surbrillance n'est-elle pas supprimée lors de la sélection d'un autre noeud?

En outre, j'ai demandé un autre question about the same setup pour lequel je n'ai pas de réponse. Toute aide serait appréciée.

Modifier Je sais que le réglage ChildrenAsTriggers="false" fonctionnera mais je veux éviter de rendre l'arbre à nouveau car il peut être très volumineux.

Répondre

0

Cela peut être un peu un hack mais cela effacera la sélection sur le client et éviter la mise à jour du panneau .

Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(function BeginRequestHandler(sender, args) 
    { 
     var elem = args.get_postBackElement(); 
     var selectedClassName = elem.id + '_1'; 

     var arrAllElements = GetElementsByClassName(selectedClassName, elem); 
     var selectedNode = $get(elem.id + '_SelectedNode').value; 

     for(var i = 0; i < arrAllElements.length; i++) 
     { 
     if(arrAllElements[i].childNodes[0].id != selectedNode) 
      RemoveClassName(arrAllElements[i], selectedClassName); 
     } 
    } 
); 

Il supprime le style/classe sélectionnée de tous les nœuds d'arbres à moins que sa valeur est contenue dans le champ caché le « _SelectedNode ». GetElementsByClassName et RemoveClassName sont dans ma propre bibliothèque js mais sont assez évidentes.

1

Vous devez définir la sélection sur false pour tous les nœuds.

J'utilise quelque chose comme ça pour un de mes applications (avec mes tvCategories TreeView):

public void RefreshSelection(string guid) 
{ 
    if (guid == string.Empty) 
     ClearNodes(tvCategories.Nodes); 
    else 
     SelectNode(guid, tvCategories.Nodes); 

} 

private void ClearNodes(TreeNodeCollection tnc) 
{ 
    foreach (TreeNode n in tnc) 
    { 
     n.Selected = false; 
     ClearNodes(n.ChildNodes); 
    } 
} 
private bool SelectNode(string guid, TreeNodeCollection tnc) 
{ 
    foreach (TreeNode n in tnc) 
    { 
     if (n.Value == guid) 
     { 
      n.Selected = true; 
      return true; 
     } 
     else 
     { 
      SelectNode(guid, n.ChildNodes); 
     } 
    } 

    return false; 
} 
+0

Mais cela se produit côté serveur. Je ne veux pas que le panneau contenant l'arbre soit mis à jour. – tpower

+1

Je ne régénère pas les trois ici, juste en changeant la sélection, non? –

2
/// <summary> 
    /// Remove selection from TreeView 
    /// </summary> 
    /// <param name="tree"></param> 
    public static void ClearTreeView(TreeView tree) 
    { 

     if (tree.SelectedNode != null) 
     { 
      tree.SelectedNode.Selected = false; 
     } 
    }