2015-10-14 3 views
1

Я использую класс, производный от TreeNode, так что я могу добавить пользовательские свойства для каждого узлаРодитель свойство производного класса TreeNode

public class CustomNode : TreeNode 
{ 
    public int preloadIndex; 
    public string uniqueID = "0"; 
    public int layer; 
    public string internalName; 
    public bool lsActive; 
} 

В какой-то момент мой код собирает кучу узлов в списке, и Мне нужно получить пользовательские свойства от родителей каждого из этих узлов.

List<CustomNode> NodeList = new List<CustomNode>; 
//some nodes are collected into the list 

foreach (var aNode in NodeList) 
{ 
    CustomNode parentNode = (CustomNode)aNode.Parent; 
    int parentIndex = parentNode.preloadIndex; 
    string parentID = parentNode.uniqueID; 
} 

Проблема заключается в том aNode.Parent возвращает TreeNode вместо моего пользовательского класса, и его отливки, как я пытался выше не работает.

Необработанное исключение типа «System.InvalidCastException» произошло в myProject.exe Дополнительная информация: Не удалось привести объект типа «System.Windows.Forms.TreeNode» к типу «myProject.CustomNode».

Кастинг aNode.parent as CustomNode не работает eiher, он возвращает null. TreeNodeCollection.Find также возвращает TreeNode.

Есть ли какой-либо способ получить родительский узел, желательно без перебора по всему TreeView?

+0

Как вы объявить Материнская собственность? Я предполагаю, что это в классе TreeNode, но каков его тип? –

+0

Я не уверен на 100%, если это сработает, но вы попробовали «aNode.Parent as CustomNode»? – Rariolu

+0

@EmmanuelDURIN Я не объявлял его, он унаследован от базового класса TreeNode. Теперь это похоже на причину моей проблемы, когда вы упомянули об этом.Есть ли способ определить свойство Parent как CustomNode и в то же время сохранить его функциональность? – Radu

ответ

0

Я думаю, что вопрос здесь является понятие наследства. В принципе, вы не можете заставить объект стать тем, кем он никогда не был. Просто потому, что CustomNode происходит от TreeNode не имеет значения TreeNode является CustomNode.

Действительно решение лежит в коде, который вы нам пока не показали, а именно о создании вашего TreeView. Именно здесь вам нужно создать экземпляр вашего CustomNode и добавить его в ваш TreeView. Ваш CustomNode может переопределить или «теневое» событие и свойства в соответствии с вашими потребностями.

В вашем случае другое решение может быть найдено в вашем NodeList объекте. Если, и только если, то каждый CustomNode вам нужен в том списке, в том числе все родители и дети, то вы можете просто изменить List на Dictionary с ключом CustomNode.Name. Так что ваш код станет:

 var nodeList = new Dictionary<string, CustomNode>(); 
     //some nodes are collected into the list, like this: 
     var cn = new CustomNode(); 
     nodeList.Add(cn.Name, cn); 

     foreach (var aNode in nodeList.Values) 
     { 
      var parentNode = nodeList[aNode.Parent.Name]; 
      int parentIndex = parentNode.preloadIndex; 
      string parentID = parentNode.uniqueID; 
     } 
+0

Вы абсолютно правы! У меня создалось впечатление, что мои «TreeView.Nodes» содержат только объекты «CustomNode», но, как оказалось, некоторые из них были «TreeNode», и это вызывало проблему. Спасибо, что указали. Ваше решение «Словарь» также интересно, я буду помнить об этом. – Radu

+0

Нет, решение 'Dictionary' является слабым решением проблемы. Если вы можете разобраться с проблемой 'TreeView', то это определенно путь. Удачи. – Ambie

+0

Хорошо, спасибо снова – Radu

0

Напишите переопределение метода родителя в вашем пользовательскомNode. (Непроверенные код)

public class CustomNode : TreeNode 
{ 
    public int preloadIndex; 
    public string uniqueID = "0"; 
    public int layer; 
    public string internalName; 
    public bool lsActive; 

    public new CustomNode Parent() 
    { 
     return (CustomNode)base.Parent; 
    } 

} 
+0

К сожалению, этот код возвращает ту же ошибку, когда он пытается использовать базу '(CustomNode) base.Parent' – Radu

+0

На самом деле ваш код должен быть правильным. Как отметил @Ambie, причина лежала где-то еще в моем коде. В любом случае, спасибо! – Radu

0

Radu, изменить свой код в:

CustomNode parentNode = aNode.Parent as CustomNode; 
if (parentNode != null){ 
    int parentIndex = parentNode.preloadIndex; 
    string parentID = parentNode.uniqueID; 
} 

СОС оператор возвращает нулевое значение, если это не CustomNode

С уважением

Смежные вопросы