none
Как получить доступ к данным объекта по его узлу (через treeview)

    Question

  • Доброго времени, подскажите как реализовать задумку:

    есть класс директории, класс типа файла и класс содержимого файла (строка)

    класс директории содержит списки вложенных директорий, файлов и узел для treeview

    классы файла и строки тоже содержат свои узлы для treeview

    создаются экземпляры этих классов и по всем этим узлам выстраивается дерево

     

    Собственно задача - при выборе узла получить доступ к полям соответствующего объекта, как бы её решить? Т.е., как я понимаю, мне нужно каким-то получить родительский объект...

    Заранее очень благодарен =)

    Friday, April 22, 2011 7:35 PM

Answers

  • Некрасивый способ - просто приведи e.Node к нужному тебе типу.
    if (e.Node is STFString)
    {
      var stringNode = (STFString)e.Node;
      ...
    }
    
    или
    
    var stringNode = e.Node as STFString;
    if (stringNode != null)
    {
      ...
    }
    
    
    Красивый способ - не делай if по типу класса, а сделай общего родителя (или интерфейс) для всех трех классов. Приводи сразу к типу родителя, и вызывай у него виртуальную фунцию, которую каждый из наследников может переопределить.

    My blog | My pet project
    • Marked as answer by Kenuat Saturday, April 23, 2011 3:11 PM
    Saturday, April 23, 2011 10:09 AM
    Moderator

All replies

  • Так, создал свой класс узла, дочерний от обычного: STFStringNode : TreeNode

    Добавил в его конструктор параметр дочернего объекта (назвал Daddy)

      class STFStringNode : TreeNode
      {
        public STFFile Daddy;
    
        public STFStringNode(STFFile file)
        {
          this.Daddy = file;
        }
      }
    

    Класс строки:

      class STFString
      {
        public string Text;
        public STFStringNode Node;
    
        public STFString(string text, STFFile parent)
        {
          this.Text = text;
          this.Node = new STFStringNode(parent);
          this.Node.Tag = "string";
        }
      }
    

    В дебагере вижу, что в объекте e (при выборе строке в treeveiw) содержится следующее:

    e - Node - STFStringNode - Daddy - все внутренности нужного мне объекта

    Но как добраться до этих внутренностей я не пойму... т.е. сам синтаксис

    Буду благодарен любой помощи.

    Friday, April 22, 2011 9:07 PM
  • Не совсем понял, зачем еще два класса объявлять?

    У TreeNode есть свойство Tag. При создании ноды выставляй его в нужную строку. В обработчике события - доставай строку из Tag: (string)e.Node.Tag.


    My blog | My pet project
    Friday, April 22, 2011 10:41 PM
    Moderator
  • Не совсем понял, зачем еще два класса объявлять?

    У TreeNode есть свойство Tag. При создании ноды выставляй его в нужную строку. В обработчике события - доставай строку из Tag: (string)e.Node.Tag.


    My blog | My pet project

    Большое спасибо за ответ.

    3 моих класса - для своих целей (STFString, STFFile, STFDir), они совершенно разные, каждый со своим поведением.

    Узлы в каждом из этих классов создаются уже с инициализированным свойством Tag (для правильной обработки при выборе в tree view) - обычная строка. Поэтому создал дочерний класс STFStringNode с дополнительным свойством для хранения родительского объекта.

    В общем-то можно засовывать в Tag узла в классе STFString его родителя, а не строку, но тогда как осуществить проверку на тип объекта в этом свойстве?

    Или может быть можно ещё куда-нибудь записывать тип узла?


    Saturday, April 23, 2011 7:11 AM
  • Добавил в тэг узла объект его родителя, но столкнулся с той же проблемой - в дебагере вижу в тэге содержание нужного мне объекта, но как обратиться к этим данным не знаю...
    Saturday, April 23, 2011 7:59 AM
  • Некрасивый способ - просто приведи e.Node к нужному тебе типу.
    if (e.Node is STFString)
    {
      var stringNode = (STFString)e.Node;
      ...
    }
    
    или
    
    var stringNode = e.Node as STFString;
    if (stringNode != null)
    {
      ...
    }
    
    
    Красивый способ - не делай if по типу класса, а сделай общего родителя (или интерфейс) для всех трех классов. Приводи сразу к типу родителя, и вызывай у него виртуальную фунцию, которую каждый из наследников может переопределить.

    My blog | My pet project
    • Marked as answer by Kenuat Saturday, April 23, 2011 3:11 PM
    Saturday, April 23, 2011 10:09 AM
    Moderator
  • Огромнейшее спасибо! =) Пока сделал грязным способом, попробую дорасти до интерфейсов.
    Saturday, April 23, 2011 3:12 PM