Domanda

Ho una pagina ASP.Net 2.0 che contiene due UpdatePanels. Il primo pannello contiene un TreeView. Il secondo pannello contiene un'etichetta ed è attivato da una selezione nella struttura. Quando seleziono un nodo, l'etichetta viene aggiornata come previsto e il TreeNode su cui ho fatto clic viene evidenziato e il nodo precedentemente selezionato non viene più evidenziato. Tuttavia, se un nodo è originale evidenziato (selezionato) nel codice dietro l'evidenziazione non viene rimosso quando si seleziona un altro nodo.

Il markup

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

Il codice dietro

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

All'inizio viene selezionato il primo nodo. Perché la sua evidenziazione non viene rimossa quando si seleziona un altro nodo?

Inoltre, ho posto un'altra circa la stessa configurazione per la quale non ho una risposta. Qualsiasi aiuto sarebbe apprezzato.

Modifica So che l'impostazione ChildrenAsTriggers = " false " funzionerà, ma voglio evitare di rendere nuovamente l'albero in quanto può essere molto grande.

È stato utile?

Soluzione 3

Questo potrebbe essere un po 'un trucco ma questo cancellerà la selezione sul client ed eviterà di aggiornare il pannello.

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

Rimuove lo stile / la classe selezionati da tutti i nodi dell'albero a meno che il suo valore non sia contenuto nel campo nascosto '_SelectedNode'. GetElementsByClassName e RemoveClassName sono nella mia libreria js ma sono abbastanza ovvi.

Altri suggerimenti

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

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

È necessario impostare la selezione su false per tutti i nodi.

Uso qualcosa del genere per una delle mie applicazioni (con le mie treeview tvCategories):

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top