c# - 如何继承TreeNode类?

标签 c# asp.net treeview treenode

我有一个继承自 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 类中重写 LoadViewStateSaveViewState:

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/

相关文章:

c# - 为任意一组键(任意数据类型)获取可散列对象的最有效方法

c# - 尝试使用 Entity Framework 和迁移创建数据库时出现问题

c# - 多用户 ASP.NET Web 应用程序中静态变量的范围

c# - 修改sql查询,不想使用join操作

mysql - 使用 asp.net 将值插入 SQL Server

jquery - 拖放到可滚动的 div 上

c# - obout TreeView 从 2.0 更新到 3.5

c# - 用c#卡住excel列

c# - 如何检查两个对象的属性是否相等

wpf - 使用 Treeview HierarchicalDataTemplate.Triggers 更改文件夹图标