ASP.NET TreeView并选择选定的节点
时间:2020-03-06 14:28:38 来源:igfitidea点击:
如何捕获单击TreeView的"选定节点"的事件?
由于选择显然没有改变,因此它不会触发SelectedNodeChanged,但是我可以捕获什么事件,所以我知道单击了Selected Node?
更新:
有空的时候,我将不得不深入TreeView控件的内容,并挖掘出它处理单击事件的内容和位置,并将TreeView子类化以公开新事件OnSelectedNodeClicked。
我可能会在圣诞节期间这样做,并将结果报告给我。
更新:
我在下面提出了一个解决方案,该解决方案将TreeView控件子类化。
解决方案
如果不干扰其余代码,最简单的方法是将节点设置为在SelectedNodeChanged方法中未选择。
protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e){ // Do whatever you're doing TreeView1.SelectedNode.Selected = false; }
我们始终可以使用MouseDown或者MouseUp事件,并检查它是否为选定的节点。
存储选择的内容,并在Page_Load事件处理程序中使用代码将选择的内容与已存储的内容进行比较。与SelectedNodeChanged不同,即使选定的值没有更改,也会为每个回发调用Page_Load。
例子
替代文字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(); }
在_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);
经过一段漫长的时间后,我终于有一些时间来研究如何对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
受保护的void Page_Load(对象发送者,EventArgs e)
{ if (!IsPostBack) { TreeView1.SelectedNode.Selected = false; } }
为我工作