我有一个继承自 TreeNode 的类,称为 ExtendedTreeNode。将这种类型的对象添加到 TreeView 中不是问题。但是如何从 TreeView 中检索对象呢?
我已经尝试过这个:
TreeNode node = tvManual.Find("path/to/node"); // tvManual is a treeview
return ((ExtendedTreeNode)node).Property;
但这行不通。我收到此错误:无法将类型“System.Web.UI.WebControls.TreeNode”的对象转换为类型“PCK_Web_new.Classes.ExtendedTreeNode”。
我需要做什么才能使这项工作成功?
------------解决方案-----------------
[编辑]我的自定义 TreeNode 类如下所示:
public class ExtendedTreeNode : TreeNode
{
private int _UniqueId;
public int UniqueId
{
set { _UniqueId = value; }
get { return _UniqueId; }
}
public ExtendedTreeNode()
{
}
}
这样我就可以将节点添加到我的 TreeView 中:
ExtendedTreeNode TN2 = new ExtendedTreeNode();
TN2.Text = "<span class='Node'>" + doc.Title + "</span>";
TN2.Value = doc.ID.ToString();
TN2.NavigateUrl = "ViewDocument.aspx?id=" + doc.ID + "&doc=general&p=" + parent;
TN2.ImageUrl = "Graphics/algDoc.png";
TN2.ToolTip = doc.Title;
TN2.UniqueId = counter;
tvManual.FindNode(parent).ChildNodes.Add(TN2);
这样我就可以检索我的 ExtendedTreeNode 对象:
TreeNode node = tvManual.Find("path/to/node");
ExtendedTreeNode extNode = node as ExtendedTreeNode;
return extNode.UniqueId;
我正在使用.NET 3.5 SP1
最佳答案
我找到了一个 Microsoft 示例,说明如何使用标记 here 实现 ASP.NET TreeView
.
除了子类化 TreeNode
和添加 Tag
属性之外,还需要执行一些重要步骤:
您必须子类化 TreeView
并重写 CreateNode
方法:
public sealed class TaggedTreeView : TreeView {
protected override TreeNode CreateNode() {
return new TaggedTreeNode(this, false);
}
}
这可以防止 TreeView
使用 TreeNode
而不是扩展类型的节点覆盖您的新节点。
您需要有可用的特定构造函数。 (它似乎也可以使用默认构造函数,但很有可能他们使用这个构造函数是有充分理由的。)
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" />
您还必须在继承的 TreeNode
类中重写 LoadViewState
和 SaveViewState
:
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
属性的值。
关于c# - 如何继承TreeNode类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1438198/