2008-09-20 115 views
13

¿Cómo puedo capturar el evento de hacer clic en el nodo seleccionado de un TreeView? No desencadena el SelectedNodeChanged dado que la selección obviamente no ha cambiado, pero ¿qué evento puedo detectar entonces sé que se hizo clic en el nodo seleccionado?ASP.NET TreeView y selección del nodo seleccionado

ACTUALIZACIÓN: Cuando tengo algo de tiempo, voy a tener que sumergirse en las entrañas del control TreeView y desenterrar qué y dónde se maneja los eventos de clic y subclase el TreeView para exponer un nuevo evento OnSelectedNodeClicked.

Probablemente lo haga durante las vacaciones de Navidad y le informaré con los resultados.

ACTUALIZACIÓN: He encontrado una solución debajo de las subclases del control TreeView.

Respuesta

8

La manera más fácil, si no interfiere con el resto de su código, es simplemente configurar el nodo como no seleccionado en el método SelectedNodeChanged.

protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e){ 
    // Do whatever you're doing 
    TreeView1.SelectedNode.Selected = false; 
} 
+0

Lamentablemente todavía quieren ver el nodo seleccionado como ser en realidad seleccionado – BlackMael

+0

@Wayne éste resolvió mi problema. Gracias – HOY

0

Siempre puede utilizar el evento MouseDown o MouseUp y comprobar si es el nodo seleccionado.

+0

Me preocupa el control ASP.NET TreeView en este momento. Supongo que te refieres a los controles WinForm o WPF quizás? ¿O te refieres a eventos DOM? Realmente no quiero profundizar en la creación de scripts de algún código de cliente para esto. – BlackMael

4

Almacene lo que se ha seleccionado y use el código en el controlador de eventos Page_Load para comparar lo que se ha seleccionado con lo que ha almacenado. Se requiere la función Page_Load para cada publicación posterior incluso si el valor seleccionado no cambia, a diferencia de SelectedNodeChanged.

Ejemplo

alt text http://smithmier.com/TreeViewExample.png

html

<form id="form1" runat="server"> 
<div> 
    <asp:TreeView ID="TreeView1" runat="server" OnSelectedNodeChanged="TreeView1_SelectedNodeChanged" 
     ShowLines="True"> 
     <Nodes> 
      <asp:TreeNode Text="Root" Value="Root"> 
       <asp:TreeNode Text="RootSub1" Value="RootSub1"></asp:TreeNode> 
       <asp:TreeNode Text="RootSub2" Value="RootSub2"></asp:TreeNode> 
      </asp:TreeNode> 
      <asp:TreeNode Text="Root2" Value="Root2"> 
       <asp:TreeNode Text="Root2Sub1" Value="Root2Sub1"> 
        <asp:TreeNode Text="Root2Sub1Sub1" Value="Root2Sub1Sub1"></asp:TreeNode> 
       </asp:TreeNode> 
       <asp:TreeNode Text="Root2Sub2" Value="Root2Sub2"></asp:TreeNode> 
      </asp:TreeNode> 
     </Nodes> 
    </asp:TreeView> 
    <asp:Label ID="Label1" runat="server" Text="Selected"></asp:Label> 
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 
    <asp:Label ID="Label2" runat="server" Text="Label"></asp:Label></div> 
</form> 

C#

protected void Page_Load(object sender, EventArgs e) 
{ 
    if(TreeView1.SelectedNode!=null && this.TextBox1.Text == TreeView1.SelectedNode.Value.ToString()) 
    { 
     Label2.Text = (int.Parse(Label2.Text) + 1).ToString(); 
    } 
    else 
    { 
     Label2.Text = "0"; 
    } 
} 
protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e) 
{ 
    this.TextBox1.Text = TreeView1.SelectedNode.Value.ToString(); 
} 
+0

Esto no ayuda desafortunadamente porque cualquier cosa podría causar la devolución de datos. Todavía no puedo decir si se hizo clic en SelectedNode – BlackMael

1

Al añadir nodos al árbol en el caso _TreeNodePopulate(), establecer el .SelectionAction propiedad en el nodo.

TreeNode newCNode; 
newCNode = new TreeNode("New Node"); 

newCNode.SelectAction = TreeNodeSelectAction.Select; 

//now you can set the .NavigateUrl property to call the same page with some query string parameter to catch in the page_load() 

newCNode.NavigateUrl = "~/ThisPage.aspx?args=" + someNodeAction 

RootNode.ChildNodes.Add(newCNode); 
+0

SelectAction ya está configurado. El problema todavía es que no sé si la selección de un nodo ya seleccionado provocó la devolución de datos. – BlackMael

6

Después de un período bastante largo, por fin he tenido algo de tiempo para examinar la manera de subclase el TreeView para manejar un nodo seleccionado se ha hecho clic.

Aquí está mi solución que expone un nuevo evento SelectedNodeClicked que puede manejar desde la página o donde sea. (Si necesita es una tarea sencilla para refactorizar en C#)

Imports System.Web.UI 
Imports System.Web 


Public Class MyTreeView 
    Inherits System.Web.UI.WebControls.TreeView 

    Public Event SelectedNodeClicked As EventHandler 

    Private Shared ReadOnly SelectedNodeClickEvent As Object 

    Private Const CurrentValuePathState As String = "CurrentValuePath" 

    Protected Property CurrentValuePath() As String 
    Get 
     Return Me.ViewState(CurrentValuePathState) 
    End Get 
    Set(ByVal value As String) 
     Me.ViewState(CurrentValuePathState) = value 
    End Set 
    End Property 

    Friend Sub RaiseSelectedNodeClicked() 

    Me.OnSelectedNodeClicked(EventArgs.Empty) 

    End Sub 

    Protected Overridable Sub OnSelectedNodeClicked(ByVal e As EventArgs) 

    RaiseEvent SelectedNodeClicked(Me, e) 

    End Sub 

    Protected Overrides Sub OnSelectedNodeChanged(ByVal e As System.EventArgs) 

    MyBase.OnSelectedNodeChanged(e) 

    ' Whenever the Selected Node changed, remember its ValuePath for future reference 
    Me.CurrentValuePath = Me.SelectedNode.ValuePath 

    End Sub 

    Protected Overrides Sub RaisePostBackEvent(ByVal eventArgument As String) 

    ' Check if the node that caused the event is the same as the previously selected node 
    If Me.SelectedNode IsNot Nothing AndAlso Me.SelectedNode.ValuePath.Equals(Me.CurrentValuePath) Then 
     Me.RaiseSelectedNodeClicked() 
    End If 

    MyBase.RaisePostBackEvent(eventArgument) 

    End Sub 

End Class 
+0

Avergonzar al visualizador de código no parece gustarle VB.NET :( – BlackMael

+0

¿Lo dejé caer en un control ascx entonces? – bdwakefield

1

protected void Page_Load (object sender, EventArgs e)

{ 
    if (!IsPostBack) 
    { 
     TreeView1.SelectedNode.Selected = false; 
    } 
} 

funciona para mí

+0

Quiero que el nodo seleccionado se muestre realmente como seleccionado, así que esto no ayuda – BlackMael

1

C#:

TreeNode node = TreeTypes.FindNode(obj.CustomerTypeId.ToString()); 


TreeTypes.Nodes[TreeTypes.Nodes.IndexOf(node)].Select(); 
-1

tengo un problema m parece pero lo resolví!

en el código del lado del servidor:

protected void MainTreeView_SelectedNodeChanged(object sender, EventArgs e) 
    { 
     ClearTreeView(); 
     MainTreeView.SelectedNode.Text = "<span class='SelectedTreeNodeStyle'>" + MainTreeView.SelectedNode.Text + "</span>"; 
     MainTreeView.SelectedNode.Selected = false; 

    } 

    public void ClearTreeView() 
    { 
     for (int i = 0; i < MainTreeView.Nodes.Count; i++) 
     { 
      for(int j=0;j< MainTreeView.Nodes[i].ChildNodes.Count;j++) 
      { 
       ClearNodeText(MainTreeView.Nodes[i].ChildNodes[j]); 
      } 
      ClearNodeText(MainTreeView.Nodes[i]); 
     } 
    } 

    public void ClearNodeText(TreeNode tn) 
    { 
     tn.Text = tn.Text.Replace("<span class='SelectedTreeNodeStyle'>", "").Replace("</span>", ""); 
    } 

en código del lado del cliente:

<style type="text/css"> 
    .SelectedTreeNodeStyle { font-weight: bold;} 
</style> 
Cuestiones relacionadas