2009-09-17 2 views
2

У меня есть класс, который наследует TreeNode, называемый ExtendedTreeNode. Чтобы добавить объект этого типа в дерево, это не проблема. Но как получить объект из дерева?Как наследовать от класса treenode?

Я попытался это:

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

+0

Все добавленные вами узлы типа ExtendedTreeNode? или вы также добавляете обычные объекты TreeNode? Возможно, вы могли бы показать, как вы добавляете их в TreeView. – SwDevMan81

+0

Да, все узлы должны иметь тип ExtendedTreeNode – Martijn

+0

Как-то (по крайней мере, в ASP.NET) 'TreeView' преобразует унаследованные' TreeNode' в 'TreeNode'. Я попробовал переопределить «Clone», но это не помогло. Мои расширенные 'TreeNode' все равно превращаются в обычные. Думаю, мне нужно будет использовать отражатель или что-то посмотреть, что происходит. –

ответ

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 
    } 
} 
+0

Когда я делаю ExtendedTreeNode enode = node как ExtendedTreeNode; enode всегда равно нулю. Как так? – Martijn

+0

при использовании в качестве литья (называемое безопасным литьем), если сбой кастинга, объект имеет значение null –

+0

Как мне заставить это работать? Или что происходит не так? – Martijn

0

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

Я заметил, что элементы управления 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; 
} 
+0

Нет, у меня нет внедренного ICloneble.Clone() Должен ли я это сделать? Если да, то как? – Martijn

+0

Свойство Tag для TreeNode не существует? – Martijn

+0

объект TreeNode.Tag существует в Windows Forms. Не уверен в ASP.NET, но почему бы и нет? – XXXXX

1

Я нашел пример Microsoft для того, как реализовать ASP.NET TreeView с тегами here.

Некоторых важных шагов, которые необходимы, помимо всего подклассов 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 между обратными передачами.

+0

Почему бы просто не публиковать объект Tag {get; set;}? – dlchambers

+0

@dlchambers Конечно, я, вероятно, просто копировал реализацию MS. может фактически расширять «TreeNode» любым способом; добавление «тега» - это всего лишь одна возможность. –