Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
0 / 0 / 0
Регистрация: 02.01.2019
Сообщений: 57
1

Как вернуть удаленный узел обратно в treeView

04.08.2019, 22:07. Показов 3022. Ответов 14

Author24 — интернет-сервис помощи студентам
Всем привет, первый раз задаю вопрос, пользователь выбирает вегетарианство и удаляются узлы связанные с мясом
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void ВегетарианствоToolStripMenuItem_Click(object sender, EventArgs e)
        {
            TreeNode node = this.treeView1.Nodes.Cast<TreeNode>().FirstOrDefault(x => x.Name == "meat");
            if (node != null)
            {
                this.treeView1.Nodes.Remove(node);
            }
 
 
            TreeNode node2 = this.treeView1.Nodes.Cast<TreeNode>().FirstOrDefault(x => x.Name == "semimanufactures");
            if (node != null)
            {
                this.treeView1.Nodes.Remove(node2);
            }
        }
Теперь же нужно по нажатию на:

C#
1
2
3
4
private void ОбычноеToolStripMenuItem_Click(object sender, EventArgs e)
        {
            
        }
Возвращались удаленные узлы, ну как сделать это я незнаю, прошу помочь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.08.2019, 22:07
Ответы с готовыми решениями:

Как раскрыть узел treeView?
...программно.

TreeView как перейти в нужный узел
Друзья,есть компонент TreeView как перейти в его нужный узел программно, щелкнув в stringgrid...

TreeView - как раскрыть узел по индексу?
Добрый день, есть у меня дерево с данными, туда загружаю XML файл разной структуры, мне нужно как...

Как сделать программно узел в treeview выделенным
Как сделать программно узел в treeview выделенным?

14
1144 / 853 / 262
Регистрация: 30.04.2009
Сообщений: 3,581
05.08.2019, 10:01 2
Самое простое хранить ноды в полях класса.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
private TreeNode _meatNode;
 
//...
 
private void BuildTreeView() 
{
     // ...
     _meatNode = this.treeView1.Nodes.Cast<TreeNode>().FirstOrDefault(x => x.Name == "meat");
}
 
private void ВегетарианствоToolStripMenuItem_Click(object sender, EventArgs e)
{
      if (_meatNode != null)
      {
           this.treeView1.Nodes.Remove(_meatNode );
      }
}
 
private void ОбычноеToolStripMenuItem_Click(object sender, EventArgs e)
{
      if (_meatNode != null)
      {
           this.treeView1.Nodes.Add(_meatNode);
      }
}
0
0 / 0 / 0
Регистрация: 02.01.2019
Сообщений: 57
05.08.2019, 12:53  [ТС] 3
По нажатию на *обычное* элемент не возвращается
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
private TreeNode _meatNode;
 
 
        private void BuildTreeView()
        {
            _meatNode = this.treeView1.Nodes.Cast<TreeNode>().FirstOrDefault(x => x.Name == "meat");
        }
 
 
        private void ВегетарианствоToolStripMenuItem_Click(object sender, EventArgs e)
        {
            TreeNode node = this.treeView1.Nodes.Cast<TreeNode>().FirstOrDefault(x => x.Name == "meat");
            if (node != null)
            {
                this.treeView1.Nodes.Remove(node);
            }
 
 
            TreeNode node2 = this.treeView1.Nodes.Cast<TreeNode>().FirstOrDefault(x => x.Name == "semimanufactures");
            if (node != null)
            {
                this.treeView1.Nodes.Remove(node2);
            }
        }
 
 
        private void ОбычноеToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (_meatNode != null)
            {
                this.treeView1.Nodes.Add(_meatNode);
            }
        }
    }
0
1144 / 853 / 262
Регистрация: 30.04.2009
Сообщений: 3,581
05.08.2019, 13:37 4
DiZiNnEs, BuildTreeView, условно, - метод где ты заполняешь дерево. Вот туда после заполнения и надо добавить этот код.
Советую начать анализировать предлагаемые решения вместо бездумного копирования.
0
0 / 0 / 0
Регистрация: 02.01.2019
Сообщений: 57
05.08.2019, 13:50  [ТС] 5
Так, а что сюда писать ?
C#
1
2
3
private TreeNode _meatNode;
 
//...
0
1144 / 853 / 262
Регистрация: 30.04.2009
Сообщений: 3,581
05.08.2019, 14:30 6
Цитата Сообщение от DiZiNnEs Посмотреть сообщение
Так, а что сюда писать ?
Туда ничего
0
0 / 0 / 0
Регистрация: 02.01.2019
Сообщений: 57
05.08.2019, 14:45  [ТС] 7
Прошу извинить меня, ну я делаю все как вы сказали заполнил BuildTreeView ;
C#
1
2
3
4
5
6
private void BuildTreeView()
        {           
            _meatNode = this.treeView1.Nodes.Cast<TreeNode>().FirstOrDefault(x => x.Name == "meat");
          
            _meatNode = this.treeView1.Nodes.Cast<TreeNode>().FirstOrDefault(x => x.Name == "semimanfactures");          
        }
Дальше добавил в ОбычноеToolStripMenuItem_Click условие ;
C#
1
2
3
4
5
6
7
private void ОбычноеToolStripMenuItem_Click(object sender, EventArgs e)
        {    
            if (_meatNode != null)
            {
                this.treeView1.Nodes.Add(_meatNode);
            }
        }
Как бы, при нажатие на эту кнопку должны добавляться элементы с BuildTreeView, ну этого не происходит, и при нажатиие на кнопу не происходит вообще ничего, я что-то сделал не так ?
0
1144 / 853 / 262
Регистрация: 30.04.2009
Сообщений: 3,581
05.08.2019, 15:04 8
Покажите код где заполняется дерево.
0
0 / 0 / 0
Регистрация: 02.01.2019
Сообщений: 57
05.08.2019, 15:20  [ТС] 9
Вы про TreeNode ? он у меня пустой
C#
1
private TreeNode _meatNode;
а так вот полный код
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
private TreeNode _meatNode;
 
        private void BuildTreeView()
        {           
            _meatNode = this.treeView1.Nodes.Cast<TreeNode>().FirstOrDefault(x => x.Name == "meat");
          
            _meatNode = this.treeView1.Nodes.Cast<TreeNode>().FirstOrDefault(x => x.Name == "semimanfactures");          
        }
 
 
        private void ВегетарианствоToolStripMenuItem_Click(object sender, EventArgs e)
        {
            TreeNode node = this.treeView1.Nodes.Cast<TreeNode>().FirstOrDefault(x => x.Name == "meat");
            if (node != null)
            {
                this.treeView1.Nodes.Remove(node);
            }
 
 
            TreeNode node2 = this.treeView1.Nodes.Cast<TreeNode>().FirstOrDefault(x => x.Name == "semimanufactures");
            if (node != null)
            {
                this.treeView1.Nodes.Remove(node2);
            }
        }
 
 
        private void ОбычноеToolStripMenuItem_Click(object sender, EventArgs e)
        {    
            if (_meatNode != null)
            {
                this.treeView1.Nodes.Add(_meatNode);
            }
        }
0
1144 / 853 / 262
Регистрация: 30.04.2009
Сообщений: 3,581
05.08.2019, 16:46 10
Цитата Сообщение от DiZiNnEs Посмотреть сообщение
а так вот полный код
Это кусок кода, а нужен полный, весь код который есть в файле.
0
0 / 0 / 0
Регистрация: 02.01.2019
Сообщений: 57
05.08.2019, 17:17  [ТС] 11
Вот:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Net;
 
 
namespace KitchenAlways
{
    public partial class Kitchen : Form
    {
        public Kitchen()
        {
            InitializeComponent();
 
            //NotifyIcon
            this.ShowInTaskbar = false;
            notifyIcon1.Click += notifyIcon1_Click;
            // задаем иконку всплывающей подсказки
            notifyIcon1.BalloonTipIcon = ToolTipIcon.Info;
            // задаем текст подсказки
            notifyIcon1.BalloonTipText = "Нажмите, чтобы отобразить окно";
            // устанавливаем зголовк
            notifyIcon1.BalloonTipTitle = "Подсказка";
            // отображаем подсказку 15 секунд
            notifyIcon1.ShowBalloonTip(15);
            //NotifyIcon End
        }
        void notifyIcon1_Click(object sender, EventArgs e)
        {
            this.WindowState = FormWindowState.Normal;
        }
 
 
        
        private void TreeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
 
            //this.treeView1.Nodes[1].Remove(); // Удаление по индексу
            //this.treeView1.Visible = false;
            //treeView1.Nodes[1].Collapse();
        }
 
        private void CheckBox1_CheckedChanged(object sender, EventArgs e)
        {
            CheckBox checkBox = (CheckBox)sender;
            if (checkBox.Checked == true)
            {
                this.BackColor = Color.DarkSlateGray;
 
                this.ForeColor = Color.White;
 
 
                    treeView1.BackColor = Color.DarkSlateGray;
 
                    treeView1.ForeColor = Color.White;
 
 
                        richTextBox1.BackColor = Color.DarkSlateGray;
 
                        richTextBox1.ForeColor = Color.White;
 
 
                            pictureBox1.BackColor = Color.DarkSlateGray;
 
                
                                menuStrip1.BackColor = Color.DarkSlateGray;
 
                                 menuStrip1.ForeColor = Color.White;
                
               
            }
            else
            {
                this.BackColor = Color.White;
 
                this.ForeColor = Color.Black;
 
 
                    treeView1.BackColor = Color.White;
 
                    treeView1.ForeColor = Color.Black;
 
 
                        richTextBox1.BackColor = Color.White;
 
                        richTextBox1.ForeColor = Color.Black;
 
 
 
                            menuStrip1.BackColor = Color.White;
 
                            menuStrip1.ForeColor = Color.Black;
 
                            pictureBox1.BackColor = Color.White;                
            }
        }
 
        private void ГлавноеToolStripMenuItem_Click(object sender, EventArgs e)
        {
            
        }
 
 
 
        private TreeNode _meatNode;
 
        private void BuildTreeView()
        {           
            _meatNode = this.treeView1.Nodes.Cast<TreeNode>().FirstOrDefault(x => x.Name == "meat");
          
            _meatNode = this.treeView1.Nodes.Cast<TreeNode>().FirstOrDefault(x => x.Name == "semimanfactures");          
        }
 
 
        private void ВегетарианствоToolStripMenuItem_Click(object sender, EventArgs e)
        {
            TreeNode node = this.treeView1.Nodes.Cast<TreeNode>().FirstOrDefault(x => x.Name == "meat");
            if (node != null)
            {
                this.treeView1.Nodes.Remove(node);
            }
 
 
            TreeNode node2 = this.treeView1.Nodes.Cast<TreeNode>().FirstOrDefault(x => x.Name == "semimanufactures");
            if (node != null)
            {
                this.treeView1.Nodes.Remove(node2);
            }
        }
 
        
        private void ОбычноеToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (_meatNode != null)
            {
                this.treeView1.Nodes.Add(_meatNode);
            }
            
        }
        
    }
}
0
1144 / 853 / 262
Регистрация: 30.04.2009
Сообщений: 3,581
05.08.2019, 20:29 12
В конструктор добавьте
C#
1
_meatNode = this.treeView1.Nodes.Cast<TreeNode>().FirstOrDefault(x => x.Name == "meat");
0
0 / 0 / 0
Регистрация: 02.01.2019
Сообщений: 57
05.08.2019, 23:47  [ТС] 13
Добавил
C#
1
2
3
4
5
6
7
8
private void ОбычноеToolStripMenuItem_Click(object sender, EventArgs e)
        {
            _meatNode = this.treeView1.Nodes.Cast<TreeNode>().FirstOrDefault(x => x.Name == "meat");
            if (_meatNode != null)
            {
                this.treeView1.Nodes.Add(_meatNode);               
            }           
        }
Ну при срабатывание этого кода
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void ВегетарианствоToolStripMenuItem_Click(object sender, EventArgs e)
        {
            TreeNode node = this.treeView1.Nodes.Cast<TreeNode>().FirstOrDefault(x => x.Name == "meat");
            if (node != null)
            {
                this.treeView1.Nodes.Remove(node);
            }
 
 
            TreeNode node2 = this.treeView1.Nodes.Cast<TreeNode>().FirstOrDefault(x => x.Name == "semimanufactures");
            if (node != null)
            {
                this.treeView1.Nodes.Remove(node2);
            }
        }


Узлы удаляются

После срабатывание этого кода
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
private void ОбычноеToolStripMenuItem_Click(object sender, EventArgs e)
        {
            _meatNode = this.treeView1.Nodes.Cast<TreeNode>().FirstOrDefault(x => x.Name == "meat");
            if (_meatNode != null)
            {
                this.treeView1.Nodes.Add(_meatNode);               
            }           
        }

Узлы не возвращаются, и ничего не происходит!

А теперь если не удалять узлы а сразу приступить к работе данного кода
C#
1
2
3
4
5
6
7
8
private void ОбычноеToolStripMenuItem_Click(object sender, EventArgs e)
        {
            _meatNode = this.treeView1.Nodes.Cast<TreeNode>().FirstOrDefault(x => x.Name == "meat");
            if (_meatNode != null)
            {
                this.treeView1.Nodes.Add(_meatNode);               
            }           
        }
То выходит ошибка о том что невозможно добавить 2 одинаковых узла:
System.ArgumentException: "Невозможно добавить или вставить элемент 'Мясная еда' в несколько позиций. Сначала удалите его из текущей позиции или создайте его копию.
Имя параметра: node"


Как бы код работает, ну узлы не возвращаются
0
1144 / 853 / 262
Регистрация: 30.04.2009
Сообщений: 3,581
06.08.2019, 00:20 14
Лучший ответ Сообщение было отмечено DiZiNnEs как решение

Решение

На пальцах:

Пока в treeView есть все ноды, нужно найти нужные из них и сохранить в полях класса.
Это надо сделать пока в treeView есть все ноды, до удаления. Это надо сделать одноразово. Не в обработчике меню где ноды удаляются. Не в обработчике где ноды восстанавливаются. А в конструкторе формы.
Конструктор это:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        public Kitchen()
        {
            InitializeComponent();
 
            //NotifyIcon
            this.ShowInTaskbar = false;
            notifyIcon1.Click += notifyIcon1_Click;
            // задаем иконку всплывающей подсказки
            notifyIcon1.BalloonTipIcon = ToolTipIcon.Info;
            // задаем текст подсказки
            notifyIcon1.BalloonTipText = "Нажмите, чтобы отобразить окно";
            // устанавливаем зголовк
            notifyIcon1.BalloonTipTitle = "Подсказка";
            // отображаем подсказку 15 секунд
            notifyIcon1.ShowBalloonTip(15);
            //NotifyIcon End
 
            // например здесь, главное чтобы после вызова InitializeComponent, где заполняется TreeView
            _meatNode = this.treeView1.Nodes.Cast<TreeNode>().FirstOrDefault(x => x.Name == "meat");
            
        }
1
0 / 0 / 0
Регистрация: 02.01.2019
Сообщений: 57
06.08.2019, 13:10  [ТС] 15
Спасибо заработало)
0
06.08.2019, 13:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.08.2019, 13:10
Помогаю со студенческими работами здесь

Как сделать программно узел в treeview выделенным?
Идея такая: Я ищу по узлам дерева нужный узел по заданному критерию и хочу его выделить...

Модификация TreeView: добавляем StringGrid как узел
На сколько я понимаю в тут требуется модификация Node TreeView.... Добавить чтение из Xml я думаю...

Как запретить менять выделенный узел TreeView?
Мне надо сделать так, чтоб если значение было false, пользователь не мог бы выделить другой узел...

Как корректно проверить и добавить новый узел TreeView?
Проблемма такая: Есть уже сформированная структура в TreeView, я её изменяю, добавляю и удаляю...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru