Как наследовать от класса treenode? - PullRequest
2 голосов
/ 17 сентября 2009

У меня есть класс, который наследуется от 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 ]

1 голос
/ 06 января 2015

Я нашел пример 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 свойств между постбэками.

1 голос
/ 17 сентября 2009

Вы можете попробовать следующее, чтобы получить все узлы под вашим родителем:

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
    }
}
0 голосов
/ 17 сентября 2009

Я предполагаю, что вы создаете узлы как ExtendedTreeNode s.

Я заметил, что элементы управления XxxView (ListView, TreeView, DataGridView) имеют тенденцию к неожиданному клонированию. Вы реализовали ICloneable.Clone ()?

Это может сработать; TreeNode реализует Clone () виртуально.

Мне проще, хотя реализовать расширенные свойства с помощью свойства Tag в treenode:

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;
}
...