ASP.NET TreeView and Selecting the Selected Node

后端 未结 9 1543
無奈伤痛
無奈伤痛 2020-12-14 11:02

How do I capture the event of the clicking the Selected Node of a TreeView? It doesn\'t fire the SelectedNodeChanged since the selection has obviously not c

相关标签:
9条回答
  • 2020-12-14 11:25

    i have a problem look like but i solved it !

    in server side code :

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

    in client side code :

     <style type="text/css">
         .SelectedTreeNodeStyle { font-weight: bold;}
     </style>
    
    0 讨论(0)
  • 2020-12-14 11:29

    You can always use the MouseDown or MouseUp event and check to see if it the selected node.

    0 讨论(0)
  • 2020-12-14 11:34

    When you're adding nodes to the tree in the _TreeNodePopulate() event, set the .SelectionAction property on the node.

    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 讨论(0)
  • 2020-12-14 11:34

    I use the ShowCheckBox property and the Checked property to "highlight" the selected item. When the SelectedNodeChanged event raises:

    1. I set to false the ShowCheckBox property and the Checked property for the old selected one and I set to true the ShowCheckBox property and the Checked property for the new selected one.
    2. I use the selected node for any action
    3. Finally, I unselect the selected item: myTreeView.SelecteNode.Selected = false
    0 讨论(0)
  • 2020-12-14 11:35

    After a somewhat lengthy period, I have finally had some time to look into how to subclass the TreeView to handle a Selected Node being clicked.

    Here is my solution which exposes a new event SelectedNodeClicked which you can handle from the Page or wherever. (If needed it is a simple task to refactor into 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 讨论(0)
  • 2020-12-14 11:36

    Easiest way - if it doesn't interfere with the rest of your code - is to simply set the node as not selected in the SelectedNodeChanged method.

    protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e){
      // Do whatever you're doing
      TreeView1.SelectedNode.Selected = false;
    }
    
    0 讨论(0)
提交回复
热议问题