Вопрос по asp.net, treeview – ASP.NET TreeView и выбор выбранного узла

13

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

UPDATE: When I have some time, I'm going to have to dive into the bowels of the TreeView control and dig out what and where it handles the click events and subclass the TreeView to expose a new event OnSelectedNodeClicked.

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

UPDATE: I have come up with a solution below that sub-classes the TreeView control.

Ваш Ответ

8   ответов
-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>
1

установите свойство .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);
Error: User Rate Limit Exceeded BlackMael
4

что выбрано, и используйте код в обработчике событий 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();
}
Error: User Rate Limit Exceeded BlackMael
8

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

protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e){
  // Do whatever you're doing
  TreeView1.SelectedNode.Selected = false;
}
Error: User Rate Limit Exceeded BlackMael
Error: User Rate Limit Exceeded
0

ь, является ли он выбранным узлом.

Error: User Rate Limit Exceeded BlackMael
1

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


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

илось время разобраться, как создать подкласс TreeView для обработки выбранного узла, по которому щелкают.

Вот мое решение, которое выставляет новое событие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
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded BlackMael
1

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

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

Error: User Rate Limit Exceeded BlackMael

Похожие вопросы