2008-09-20 17 views
13

Comment capturer l'événement de cliquer sur le nœud sélectionné d'un TreeView? Il ne déclenche pas le SelectedNodeChanged puisque la sélection n'a évidemment pas changé mais quel événement puis-je attraper afin que je sache que le nœud sélectionné a été cliqué?ASP.NET TreeView et sélection du nœud sélectionné

MISE À JOUR: Quand j'ai un peu de temps, je vais devoir plonger dans les entrailles du contrôle TreeView et creuser quoi et où il gère les événements de clic et sous-classe TreeView pour exposer un nouvel événement OnSelectedNodeClicked.

Je ferai probablement ceci pendant les vacances de Noël et je rapporterai avec les résultats.

MISE À JOUR: J'ai trouvé une solution ci-dessous qui sous-classe le contrôle TreeView.

Répondre

8

Le moyen le plus simple - s'il n'interfère pas avec le reste de votre code - consiste simplement à définir le nœud comme non sélectionné dans la méthode SelectedNodeChanged.

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

Malheureusement je veux encore voir le nœud sélectionné comme étant effectivement sélectionné – BlackMael

+0

@Wayne celui-ci a résolu mon problème. Merci – HOY

0

Vous pouvez toujours utiliser l'événement MouseDown ou MouseUp et vérifier s'il s'agit du noeud sélectionné.

+0

Je suis concerné par le contrôle TreeView ASP.NET à ce stade. Je suppose que vous faites référence aux contrôles WinForm ou WPF peut-être? Ou faites-vous référence aux événements DOM? Je ne veux pas vraiment plonger dans l'écriture de code client pour cela. – BlackMael

4

Enregistrez ce qui est sélectionné et utilisez du code dans le gestionnaire d'événements Page_Load pour comparer ce qui est sélectionné à ce que vous avez stocké. Page_Load est appelé pour chaque publication même si la valeur sélectionnée ne change pas, contrairement à SelectedNodeChanged.

Exemple

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

Cela n'aide malheureusement pas parce que tout peut provoquer la publication. Je ne peux toujours pas savoir si le noeud SelectedNode a été cliqué – BlackMael

1

Lorsque vous ajoutez des nœuds à l'arbre en cas _TreeNodePopulate(), réglez le .SelectionAction propriété sur le noeud.

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 est déjà défini. Le problème est toujours je ne sais pas si la sélection d'un nœud déjà sélectionné a causé la publication. – BlackMael

6

Après une période assez longue, j'ai enfin eu le temps de se pencher sur la façon de sous-classe TreeView pour gérer un noeud sélectionné clique dessus.

Voici ma solution qui expose un nouvel événement SelectedNodeClicked que vous pouvez gérer depuis la page ou n'importe où. (Si nécessaire, il est une tâche simple à factoriser 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

Honte le code visualiser ne semble pas aimer VB.NET :( – BlackMael

+0

Dropped this dans un contrôle ascx alors? – bdwakefield

1

protected void Page_Load (object sender, EventArgs e)

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

fonctionne pour moi

+0

Je veux que le nœud sélectionné à réellement montrer comme sélectionné donc cela n'aide pas – BlackMael

1

C#:

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


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

J'ai un problème Je ressemble à mais je l'ai résolu!

dans le code côté serveur:

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

dans le code côté client:

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