2008-09-20 4 views
13

Как захватить событие щелчка на выбранном узле TreeView? Он не запускает SelectedNodeChanged, так как выбор явно не изменился, но какое событие я могу поймать, поэтому я знаю, что был выбран выбранный узел?ASP.NET TreeView и выбор выделенного узла

UPDATE: Когда у меня есть время, я буду иметь, чтобы погружаться в недра управления TreeView и откопать что и где он обрабатывает события щелчка и подкласса TreeView, чтобы выставить новое событие OnSelectedNodeClicked.

Я, вероятно, сделаю это за рождественские праздники, и я отчитаю результаты.

ОБНОВЛЕНИЕ: У меня появилось решение под этим подклассами элемента управления 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, с которым вы можете обращаться со страницы или где угодно. (При необходимости это простая задача реорганизовать в 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

Позор код визуализатора, похоже, не похож на 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> 
Смежные вопросы