ASP.NET TreeView и выбор выбранного узла - PullRequest
13 голосов
/ 20 сентября 2008

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

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

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

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

Ответы [ 8 ]

8 голосов
/ 20 сентября 2008

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

protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e){
  // Do whatever you're doing
  TreeView1.SelectedNode.Selected = false;
}
6 голосов
/ 21 декабря 2008

После довольно продолжительного периода времени у меня наконец-то появилось время разобраться, как создать подкласс 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
4 голосов
/ 20 сентября 2008

Сохраните то, что выбрано, и используйте код в обработчике события Page_Load, чтобы сравнить то, что выбрано, с тем, что вы сохранили. Page_Load вызывается для каждого поста обратно, даже если выбранное значение не меняется, в отличие от SelectedNodeChanged.

Пример

альтернативный текст 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();
}
1 голос
/ 02 сентября 2012

C #:

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


TreeTypes.Nodes[TreeTypes.Nodes.IndexOf(node)].Select();
1 голос
/ 01 декабря 2010

защищенный void Page_Load (отправитель объекта, EventArgs e)

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

у меня работает

1 голос
/ 10 декабря 2008

Когда вы добавляете узлы в дерево в событии _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 голосов
/ 12 января 2015

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

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

    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>
0 голосов
/ 20 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...