2008-09-20 129 views
13

如何捕獲單擊TreeView的選定節點的事件? 它不會觸發SelectedNodeChanged因爲選擇顯然沒有改變,但然後我可以捕獲什麼事件,所以我知道選定的節點被點擊?ASP.NET TreeView和選擇節點

UPDATE: 當我有一段時間,我將不得不潛入TreeView控件的深處,挖掘出了什麼以及它處理的點擊事件和子類的TreeView,露出一個新的事件OnSelectedNodeClicked。

我可能會在聖誕假期做這個,我會報告結果。

UPDATE: 我已經想出了一個解決方案,下面是TreeView控件的子類。

回答

8

最簡單的方法 - 如果它不干擾其餘代碼 - 就是簡單地將節點設置爲未在SelectedNodeChanged方法中選中。

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

不幸的是我仍然希望看到所選擇的節點爲被實際選擇 – BlackMael 2008-09-22 07:06:48

+0

@Wayne這一個解決我的問題。謝謝 – HOY 2013-07-10 13:46:22

0

您可以隨時使用MouseDown或MouseUp事件並檢查它是否爲選定節點。

+0

在這一點上,我關心的是ASP.NET TreeView控件。我假設你指的是WinForm或WPF控件?或者你是指DOM事件?我真的不想深入研究爲此編寫一些客戶端代碼。 – BlackMael 2008-09-22 07:11:24

4

存儲選定內容並使用Page_Load事件處理程序中的代碼將所選內容與您存儲的內容進行比較。即使選定的值沒有改變,每次回發都會調用Page_Load,與SelectedNodeChanged不同。

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

這不能幫助不幸,因爲任何事情都可能導致回發。我仍然不知道SelectedNode是否被點擊 – BlackMael 2008-09-22 07:08:57

1

當你在_TreeNodePopulate()事件增加了樹節點,設置.SelectionAction屬性在節點上。

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已經設置。問題仍然是我不知道是否選擇已選節點導致回發。 – BlackMael 2008-12-11 03:19:36

6

經過了一段時間,我終於有一段時間瞭解如何繼承TreeView來處理被點擊的選定節點。

這是我的解決方案,它揭示了一個新事件SelectedNodeClicked您可以從Page或任何地方處理。 (如果需要的話它是一個簡單的任務,重構爲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

恥辱的代碼visualiser似乎不喜歡VB.NET :( – BlackMael 2008-12-21 06:06:22

1

保護無效的Page_Load(對象發件人,EventArgs的)

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

作品對我來說

1

C#:

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


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

我有一個問題米看起來像但我解決了它!

在服務器端代碼:

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

在客戶端代碼:

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