2

我有一个继承自 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

4

3 回答 3

2

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

TreeNode除了子类化和添加Tag属性之外,一些必要的重要步骤是:

您必须继承TreeView并覆盖该CreateNode方法:

public sealed class TaggedTreeView : TreeView {
   protected override TreeNode CreateNode() {
      return new TaggedTreeNode(this, false);
   }
}

这可以防止sTreeView覆盖新节点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属性的值。

于 2015-01-06T19:29:30.733 回答
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
    }
}
于 2009-09-17T11:34:55.743 回答
0

我假设您将节点创建为ExtendedTreeNodes.

我注意到 XxxView(ListView、TreeView、DataGridView)控件往往会意外地克隆事物。你实施了ICloneable.Clone ()吗?

这可能有效;TreeNodeClone ()虚拟实现。

我发现它更容易,但使用树节点的 Tag 属性实现扩展属性:

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

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

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;
}
于 2009-09-17T11:35:20.690 回答