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>