ASP.NET TreeView и выбор выбранного узла
Как мне записать событие нажатия на выбранный узел TreeView? Он не запускает SelectedNodeChanged, так как выбор, очевидно, не изменился, но тогда какое событие я могу поймать, чтобы я знал, что выбранный узел был нажат?
ОБНОВЛЕНИЕ: Когда у меня будет время, мне придется погрузиться в недра элемента управления TreeView и выяснить, что и где он обрабатывает события щелчка, и создать подкласс TreeView, чтобы представить новое событие OnSelectedNodeClicked.
Я, вероятно, сделаю это во время рождественских каникул и сообщу результаты.
ОБНОВЛЕНИЕ: я нашел решение ниже этого подкласса элемента управления TreeView.
8 ответов
Самый простой способ - если он не мешает остальной части вашего кода - просто установить узел как не выбранный в методе SelectedNodeChanged.
protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e){
// Do whatever you're doing
TreeView1.SelectedNode.Selected = false;
}
После довольно продолжительного периода времени у меня наконец-то появилось время разобраться, как создать подкласс 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
Сохраните то, что выбрано, и используйте код в обработчике событий 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();
}
Защищенная пустота Page_Load(отправитель объекта, EventArgs e)
{
if (!IsPostBack)
{
TreeView1.SelectedNode.Selected = false;
}
}
работает для меня
Когда вы добавляете узлы в дерево в событии _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);
C#:
TreeNode node = TreeTypes.FindNode(obj.CustomerTypeId.ToString());
TreeTypes.Nodes[TreeTypes.Nodes.IndexOf(node)].Select();
Я использую ShowCheckBox
свойство и свойство Checked, чтобы "выделить" выбранный элемент. КогдаSelectedNodeChanged
событие вызывает:
- Я установил ложь
ShowCheckBox
собственность иChecked
свойство для старого выбранного, и я установил значение true дляShowCheckBox
собственность иChecked
недвижимость для нового выбранного. - Я использую выбранный узел для любого действия
- Наконец, я снимаю выделение с выбранного элемента:
myTreeView.SelecteNode.Selected = false
Вы всегда можете использовать событие MouseDown или MouseUp и проверить, является ли он выбранным узлом.
У меня есть проблема, но я решил ее!
в коде на стороне сервера:
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>