ASP.NET TreeView и выбор выбранного Node

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

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

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

UPDATE: Я нашел решение под этими подклассами элемента управления TreeView.

Ответ 1

Самый простой способ - если это не мешает остальной части вашего кода - просто установить node как не выбранный в методе SelectedNodeChanged.

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

Ответ 2

После некоторого длительного периода времени у меня наконец-то появилось некоторое время, чтобы посмотреть, как подкласс TreeView обрабатывать выбранный Node.

Вот мое решение, которое предоставляет новое событие SelectedNodeClicked, которое вы можете обрабатывать со страницы или где угодно. (При необходимости это простая задача для рефакторинга на С#)

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

Ответ 3

Сохраните то, что выбрано, и используйте код в обработчике событий 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>

С#

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

Когда вы добавляете узлы в дерево в событии _TreeNodePopulate(), установите для свойства .SelectionAction значение 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);

Ответ 5

protected void Page_Load (отправитель объекта, EventArgs e)

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

работает для меня

Ответ 6

С#:

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


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

Ответ 7

Вы всегда можете использовать событие MouseDown или MouseUp и проверить, не выбран ли он node.

Ответ 8

У меня проблема, но я ее решил!

на стороне сервера:

    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>