如何继承treenode类?

时间:2009-09-17 11:13:33

标签: c# asp.net treeview treenode

我有一个继承自TreeNode的类,名为ExtendedTreeNode。要将此类型的对象添加到树视图中不是问题。但是如何从树视图中检索对象?

我试过这个:

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()
    {
    }
}

这样我就可以将节点添加到我的树视图中:

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

3 个答案:

答案 0 :(得分:1)

您可以尝试以下操作来获取父级下的所有节点:

TreeNode[] parentNode = treeView1.Nodes.Find (parentid, true);
foreach(TreeNode node in parentNode)
{
    ExtendedTreeNode ext_tree_node = node as ExtendedTreeNode;
    if(ext_tree_node != null)
    {
        // Do your work
    }
}

答案 1 :(得分:1)

我找到了一个关于如何使用标记here实现ASP.NET TreeView的Microsoft示例。

除了继承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" />

您还必须覆盖继承的LoadViewState类中的SaveViewStateTreeNode

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属性的值。

答案 2 :(得分:0)

我假设您将节点创建为ExtendedTreeNode s。

我注意到XxxView(ListView,TreeView,DataGridView)控件倾向于意外地克隆事物。您是否已实施ICloneable.Clone ()

这可能有用; TreeNode虚拟地实现了Clone ()

我发现使用treenode的Tag属性实现扩展属性更容易:

TreeNode node = tvManual.Find("path/to/node");
return node.Tag as ExtendedTreeNode;

我强烈建议不要使用Clone ();这是一个脆弱的模式。使用Tag属性:

class ExtendedInfo
{
    string NavigateUrl;
    string ImageUrl;
    int UniqueId;

    // other custom properties go here
}

// ...

void CreateTreeNode ()
{
    TreeNode TN = new TreeNode();

    string parent = "parent";    

    TN.Text = "<span class='Node'>" + doc.Title + "</span>";
    TN.Value = doc.ID.ToString();
    TN.ToolTip = doc.Title;

    ExtendedInfo extInfo = new ExtendedInfo;
    extInfo.NavigateUrl = "ViewDocument.aspx?id=" + doc.ID + "&doc=general&p=" + parent;
    extInfo.ImageUrl = "Graphics/algDoc.png";
    extInfo.UniqueId = counter;

    TN.Tag = extInfo;
}

// ...

ExtendedInfo GetExtendedInfo (TreeNode node)
{
    return node.Tag as ExtendedInfo;
}