Я нашел пример Microsoft для того, как реализовать ASP.NET TreeView
с тегами здесь .
Некоторые важные шаги, которые необходимо выполнить, кроме простого создания подкласса TreeNode
и добавления свойства Tag
:
Вы должны создать подкласс TreeView
и переопределить метод CreateNode
:
public sealed class TaggedTreeView : TreeView {
protected override TreeNode CreateNode() {
return new TaggedTreeNode(this, false);
}
}
Это не позволяет TreeView
перезаписывать ваши новые узлы с TreeNode
s вместо вашего расширенного типа узла.
Вам понадобится этот конкретный конструктор. (Кажется, он работает с использованием конструктора по умолчанию, но есть хороший шанс, что есть веская причина, почему он использовал этот.)
public sealed class TaggedTreeNode : TreeNode {
object _Tag;
public object Tag { get { return _Tag; } set { _Tag = value; } }
...
protected internal TaggedTreeNode(TreeView owner, bool isRoot)
: base(owner, isRoot) {
}
Чтобы использовать расширенный TreeView
, вам понадобится строка Register
, как показано ниже в вашей разметке для импорта типа:
<%@ Register TagPrefix="asp" Namespace="MyNamespace" Assembly="MyAssembly" %>
...
<asp:TaggedTreeView ID="taggedTreeView" runat="server" />
Вы также должны переопределить LoadViewState
и SaveViewState
в своем унаследованном TreeNode
классе:
public sealed class TaggedTreeNode : TreeNode {
...
protected override void LoadViewState(object state) {
var arrState = (object[])state;
_Tag = arrState[0];
base.LoadViewState(arrState[1]);
}
protected override object SaveViewState() {
var arrState = new object[2];
arrState[1] = base.SaveViewState();
arrState[0] = _Tag;
return arrState;
}
Это позволяет TreeView
сохранять значение ваших Tag
свойств между постбэками.