Теги узлов Treeview создаются странным образом

У меня есть древовидный элемент управления с динамически создаваемыми узлами / дочерними узлами. Когда пользователь щелкает по конкретному узлу, отображение таблицы должно обновляться некоторой соответствующей информацией / настройками узла. Чтобы отслеживать, какой узел щелкают, я добавил настраиваемый тег (класс под названием «NodeTag», содержащий два поля) к узлу после того, как он был создан во время выполнения. Я подписался на событие 'AfterSelect' элемента управления treeview и хотел бы проверить SelectedNode.Tag, но, как ни странно, у меня всегда был последний объект тега для всех выбранных объектов: все узлы имеют NodeTag.Nodename = "GLBS" "и NodeTag.NodeNumber = 0. Вот рис, где выбран« Текущий сеанс », выбранный текст узла правильный, а тег - нет.

Текущий сеанс выбран как узел

Вот код:

TreeNode SessionNode = new TreeNode("Current Session");
            //Add Tag object to the new node
            NodeTag nt = new NodeTag();
            nt.NodeName = "SESS";
            nt.NodeNumber = 0;
            SessionNode.Tag = (object) nt;
            tv_project.Nodes.Add(SessionNode);


            MainProject.ProjectNode = new TreeNode("Project - " + e.ProjName + " - " + e.ProjOwner);
            //Add Tag object to the new node
            nt.NodeName = "PROJ";
            nt.NodeNumber = 0;
            MainProject.ProjectNode.Tag = (object) nt;
            SessionNode.Nodes.Add(MainProject.ProjectNode);


            TreeNode SettingsNode = new TreeNode("Global Settings");
            //Add Tag object to the new node
            nt.NodeName = "GLBS";
            nt.NodeNumber = 0;
            SettingsNode.Tag = (object) nt;
            SettingsNode.ForeColor = Color.Red;
            MainProject.ProjectNode.Nodes.Add(SettingsNode);

person JustGreg    schedule 05.05.2014    source источник
comment
Почему в первом разделе (когда name = SESS) вы конвертируете объект nt в Object до того, как вставляете его в тег оды, а в третьем разделе (name = GLBS) вы этого не делаете?   -  person user3165438    schedule 05.05.2014
comment
Моя вина, исправлено в моем посте. До сих пор не работает.   -  person JustGreg    schedule 05.05.2014
comment
Каковы результаты при отладке? Каково числовое значение узла SESS сразу после его инициализации, после создания узла PROJ и после создания узла GLBS?   -  person user3165438    schedule 05.05.2014
comment
После инициализации: - SessionNode {Text = Current Session} System.Windows.Forms.TreeNode Тег после добавления тега: правильный, с 'SESS' и 0. Первый узел равен нулю. MainProject.ProjectNode также правильно создается со своим тегом ('PROJ', 0) и т. Д. Однако при добавлении в SessionNode свойство Tag SessionNode обновляется до ('PROJ', 0).   -  person JustGreg    schedule 05.05.2014
comment
У вас есть знак "+" рядом с узлом в боли "Наблюдать". Щелчок по нему откроет значения свойств узла. Рядом со свойством Tag есть еще один знак "+". Щелчок покажет имя и числовое значение узла. Это значения, которые нужно проверить. Пожалуйста, проверь это. Я здесь, чтобы помочь.   -  person user3165438    schedule 05.05.2014
comment
Резюме: Когда я добавил MainProject.ProjectNode в SessionNode, первый и последний узлы SessionNode были правильно заменены на только что добавленный ProjectNode. Дочерняя заметка создается в древовидной структуре, однако поле родительского тега перезаписывается дочерним тегом, от ('SESS', 0) до ('PROJ', 0).   -  person JustGreg    schedule 05.05.2014
comment
Вот почему вы получаете в конце значение «GBLS» - так как это последнее значение, которое имеет приоритет над своими родителями. Странный. Попробуйте опубликовать его как новый вопрос и дайте мне знать, что происходит. Спасибо.   -  person user3165438    schedule 05.05.2014
comment
Хорошо, и спасибо, что помогли мне так далеко. Еще одна вещь: когда поле nt.NodeName изменяется на 'PROJ', он мгновенно обновляет SessionNode.Tag: imgur.com/dvc3tYx   -  person JustGreg    schedule 05.05.2014


Ответы (1)


У меня есть решение!

Вы создаете экземпляр NodeTag только в первый раз, а затем просто изменяете его.
Вам нужно создать отдельный nt для каждого узла:

TreeNode SessionNode = new TreeNode("Current Session");
        //Add Tag object to the new node
        NodeTag nt = new NodeTag();
        nt.NodeName = "SESS";
        nt.NodeNumber = 0;
        SessionNode.Tag = (object) nt;
        tv_project.Nodes.Add(SessionNode);


        MainProject.ProjectNode = new TreeNode("Project - " + e.ProjName + " - " + e.ProjOwner);
        //Add Tag object to the new node
        NodeTag nt1 = new NodeTag();
        nt1.NodeName = "PROJ";
        nt1.NodeNumber = 0;
        MainProject.ProjectNode.Tag = (object) nt1;
        SessionNode.Nodes.Add(MainProject.ProjectNode);


        TreeNode SettingsNode = new TreeNode("Global Settings");
        //Add Tag object to the new node
        NodeTag nt2 = new NodeTag();
        nt2.NodeName = "GLBS";
        nt2.NodeNumber = 0;
        SettingsNode.Tag = (object) nt2;
        SettingsNode.ForeColor = Color.Red;
        MainProject.ProjectNode.Nodes.Add(SettingsNode);
person user3165438    schedule 05.05.2014
comment
Спасибо user3165438! :-) - person JustGreg; 05.05.2014