web-dev-qa-db-fra.com

ASP.NET TreeView et sélectionnant le fichier sélectionné Node

Comment capturer l'événement du clic sur le fichier sélectionné Node d'une arborescence d'une arborescence? Il ne tire pas le sélectionné car la sélection n'a évidemment pas changé, mais alors quel événement Puis-je attraper pour que je sache que le fichier sélectionné Node a été cliqué?

UPDATE : Lorsque j'ai un peu de temps, je vais devoir plonger dans les entrailles du contrôle de l'arbreView et creuser quoi et où il gère le clic Événements et sous-classe The TreeView pour exposer un nouvel événement sur la sociétéNODECLICKED.

Je ferai probablement cela au cours des vacances de Noël et je ferai rapport avec les résultats.

MISE À JOUR : Je suis arrivé à une solution ci-dessous qui sous-classes le contrôle des arbres.

13
BlackMael

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 sélectionnéeNodéchaged.

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

Après une période quelque peu longue, j'ai enfin eu du temps pour examiner la sous-classement de l'arborescence pour gérer un Node en étant cliqué.

Voici ma solution qui expose un nouvel événement sélectionnoodeclicked que vous pouvez gérer à partir de la page ou du tout. ( si nécessaire, il s'agit d'une tâche simple au refacteur dans 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
6
BlackMael

Stockez ce qui est sélectionné et utilisez le code dans le gestionnaire d'événements de page_load pour comparer ce qui est sélectionné à ce que vous avez stocké. Page_LOAD est appelé à chaque poste de retour même si la valeur sélectionnée ne change pas, contrairement à la sélectionnéeNodechanged.

Exemple

Texte alt 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();
}
4
Larry Smithmier

Lorsque vous ajoutez des nœuds à l'arborescence de l'événement _TREENODEPOPOPOPULATION (), définissez la propriété .Selectionaction sur le nœud.

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

c #:

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


TreeTypes.Nodes[TreeTypes.Nodes.IndexOf(node)].Select();
1
Randa Hesham
protected void Page_Load(object sender, EventArgs e) 
    {
        if (!IsPostBack)
        {
            TreeView1.SelectedNode.Selected = false;
        }
    }

travaille pour moi

1
Evren

Vous pouvez toujours utiliser l'événement MouseDown ou MouseUp et vérifier si le nœud sélectionné.

0
Blackadder

J'utilise la propriété ShowCheckBox et la propriété cochée pour "mettre en surbrillance" l'élément sélectionné. Lorsque l'événement SelectedNodeChanged soulève:

  1. Je me suis mis sur FALSE la propriété ShowCheckBox et la propriété Checked pour l'ancien sélectionnée et que j'ai défini sur true la propriété ShowCheckBox et la propriété Checked pour le Nouvelle sélectionnée.
  2. J'utilise le nœud sélectionné pour une action
  3. Enfin, je désélectionne l'élément sélectionné: myTreeView.SelecteNode.Selected = false
0
French Refilou