С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/55: Рейтинг темы: голосов - 55, средняя оценка - 4.60
2 / 2 / 1
Регистрация: 10.03.2013
Сообщений: 100

Удалить динамически созданные объекты

17.02.2015, 08:04. Показов 11656. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!

У меня есть панелька. Я хочу динамически на ней создавать контролы.
Контролы будут создаваться группами. Например, создам textBox и listBox.
Когда они станут не нужны, хочу удалить их из панели создать там richTextBox.
И наоборот. Т.е. создавать и удалять группы по мере надобности.

Пробую удалять при помощи Dispose() перебирая все контролы в панели
C#
1
2
3
4
5
6
7
8
9
10
11
12
        private void Form1_Load(object sender, EventArgs e)
        {
           //создание контролов 
           ListBox lbxCognates = new ListBox() { Parent = panel1, Dock = DockStyle.Bottom, Height = 350, Font = new Font("Arial Unicode MS", 10) };
           TextBox tbxEnterWord = new TextBox() { Parent = panel1, Dock = DockStyle.Top, Font = new Font("Arial", 16) };
        }
 
        // Удаление контролов
        private void button1_Click(object sender, EventArgs e)
        {
           foreach (Control ctrl in panel1.Controls) ctrl.Dispose();
        }
При нажатии на button1 удаляются не все контролы а один. При нажатии еще раз button1 - еще один.
Почему не все разом за один проход?

И еще. Правильный ли у меня подход - создавать контролы и затем удалять их по мере ненадобности?
Или лучше скрывать их при помощи Hide() или удалять их из коллекции при помощи panel1.Controls.Remove(.....
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.02.2015, 08:04
Ответы с готовыми решениями:

Удалить динамически созданные textBox
Здравствуйте! По нажатии кнопки создаю textBox. как при нажатии другой кнопки удалить последний созданный? private void...

Динамически созданные компоненты
Имеется форма с созданным на ней datagridview. Остальные компоненты по мере необходимости создаются динамически. Динамически созданная...

Как переместить созданные объекты
Я создаю некоторое количество объектов, в моём случае это кубики. Мне нужно перемещать их всех. Пробовал так: if(e.KeyCode == Keys.D){ ...

20
93 / 94 / 51
Регистрация: 19.06.2013
Сообщений: 323
17.02.2015, 10:10
А не проще сделать так?
C#
1
2
3
4
5
// Удаление контролов
private void button1_Click(object sender, EventArgs e)
{
    panel1.Controls.Clear();
}
Добавлено через 3 минуты
Цитата Сообщение от Андрей69 Посмотреть сообщение
Правильный ли у меня подход - создавать контролы и затем удалять их по мере ненадобности?
В зависимости от поставленной задачи. Если Вам нужно, чтобы при появлении контрола в нем сохранялась какая-то информация с предыдущего использования (текст, размеры и.т.д), то придется скрывать. Если нет, удаляйте и создавайте по-новой Экономия!

Добавлено через 10 минут
Удаление по группам. Сначала узнаем, что за тип у контрола:
C#
1
2
3
4
5
6
7
8
private void button1_Click(object sender, EventArgs e)
{
    foreach (Control ctrl in this.panel1.Controls)
    {
        if (ctrl.GetType().Name == "ListBox")
            ctrl.Dispose();
    }
}
0
2 / 2 / 1
Регистрация: 10.03.2013
Сообщений: 100
17.02.2015, 20:25  [ТС]
Цитата Сообщение от BroDIK Посмотреть сообщение
А не проще сделать так?
// Удаление контролов
private void button1_Click(object sender, EventArgs e)
{
panel1.Controls.Clear();
}
Разве так можно уладить контрол? Так можно убрать ссылку на объект в списке контролов (panel1.Controls), а не сам контрол.
Разве нет?
Не получится так, что не уничтожая объекты, я буду создавать новые и новые с каждым вызовом?
Не приведет ли это к засорению памяти?
0
116 / 116 / 42
Регистрация: 27.02.2013
Сообщений: 899
17.02.2015, 20:33
Андрей69, При создании контролов задавайте им имена через свойство Name и тогда сможете в любой момент удалить их из коллекции методом RemoveByKey:
C#
1
 this.Controls.RemoveByKey("UrlGroup");
1
2 / 2 / 1
Регистрация: 10.03.2013
Сообщений: 100
17.02.2015, 21:38  [ТС]
Цитата Сообщение от blackstar Посмотреть сообщение
удалить их из коллекции методом RemoveByKey:
Повторю вопрос. Удаление из коллекции является удалением самого объекта?
Я создаю где то объект TextBox. Прописываю его в коллекции панели (Parent = panel1).
Означает ли что удаляя из коллекции (panel1.Controls.RemoveByKey()) удаляется и объект?
0
 Аватар для Metall_Version
2152 / 1289 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
17.02.2015, 21:41
Цитата Сообщение от Андрей69 Посмотреть сообщение
Повторю вопрос. Удаление из коллекции является удалением самого объекта?
ты объект не удалишь, это .net - он сам удаляет объекты когда хочет
удалил из колекции и он удалился из формы (или панели где он был)

не заморачивайся удалением объектов
1
2 / 2 / 1
Регистрация: 10.03.2013
Сообщений: 100
17.02.2015, 22:00  [ТС]
Цитата Сообщение от Metall_Version Посмотреть сообщение
не заморачивайся удалением объектов
Извини, но мне нужно понять, что бы потом как раз не заморачиваться

Дам пример
C#
1
2
3
4
5
6
            TextBox tbx2 = new TextBox() { Parent = panel1, Dock = DockStyle.Bottom, Font = new Font("Arial", 16) };
            tbx2.Text = "Text";
 
            panel1.Controls.Clear();
 
            panel1.Controls.Add(tbx2);
Что имеем: Создаю объект, прописываю в коллекцию panel1. Задаю значение свойству объекта tbx2.Text = "Text".
Очищаю коллекцию. Снова прописываю объект в panel1. Значение "Text" сохранилось.
Значит объект не был удален (я имею ввиду все ссылки на него а не сборщик мусора)
0
 Аватар для Metall_Version
2152 / 1289 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
17.02.2015, 22:07
Цитата Сообщение от Андрей69 Посмотреть сообщение
Значит объект не был удален
пока есть ссылки на объект, он не будет удален
у нас ссылка tbx2 если является полем класса, то пока жив объект этого класса, сам tbx2 тоже будет жить.
если это ссылка (tbx2 ) объявлена в методе, то вне контекста к ней и не обратишься, и если очистишь панель, то и в последствии удалится этот текст бокс tbx2 как объект.
1
2 / 2 / 1
Регистрация: 10.03.2013
Сообщений: 100
17.02.2015, 22:13  [ТС]
Либо я вас не понимаю, либо плохо задаю вопрос.
Цитата Сообщение от Metall_Version Посмотреть сообщение
у нас ссылка tbx2 если является полем класса,
Написал так
C#
1
2
3
4
5
6
7
8
9
        private void button3_Click(object sender, EventArgs e)
        {
            TextBox tbx2 = new TextBox() { Parent = panel1, Dock = DockStyle.Bottom, Font = new Font("Arial", 16) };
            tbx2.Text = "Text";
 
            panel1.Controls.Clear();
 
            panel1.Controls.Add(tbx2);
        }
tbx2 не является полем класса.
Цитата Сообщение от Metall_Version Посмотреть сообщение
если очистишь панель, то и в последствии удалится этот текст бокс tbx2 как объект
Не удалился. Значение "Text" сохранилось. Да и компилятор не ругался что нет объекта, когда делал panel1.Controls.Add(tbx2);
0
1167 / 885 / 517
Регистрация: 09.04.2014
Сообщений: 2,095
17.02.2015, 22:18
Цитата Сообщение от Metall_Version Посмотреть сообщение
не заморачивайся удалением объектов
значит ли это, что Dispose() метод не нужный?
0
 Аватар для Metall_Version
2152 / 1289 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
17.02.2015, 22:19
эм здесь область действия ссылки tbx2 заканчивается как только метод закончится.
то есть в методе это после panel1.Controls.Clear(); и до конца tbx2 еще есть.
я имел ввиду что если после метода сделать очистку коллекции, и попытаться найти tbx2 ,то не удастся
0
2 / 2 / 1
Регистрация: 10.03.2013
Сообщений: 100
17.02.2015, 22:24  [ТС]
nedel,
А вы что скажете

Добавлено через 4 минуты
Цитата Сообщение от Metall_Version Посмотреть сообщение
то есть в методе это после panel1.Controls.Clear(); и до конца tbx2 еще есть.
Вот. Решили, что очистка коллекции не удаляет сам объект в моем случае. Теперь вернусь к началу темы.
Как мне удалять объекты? Видимо Dispose()? Но у меня с этим была проблема. Но могу циклом удалить
объекты, родителем которых является panel1.
C#
1
2
3
        {
           foreach (Control ctrl in panel1.Controls) ctrl.Dispose();
        }
Как быть?
0
 Аватар для Metall_Version
2152 / 1289 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
17.02.2015, 22:26
Цитата Сообщение от nedel Посмотреть сообщение
значит ли это, что Dispose() метод не нужный?
как этот метод относится к удаление контролов ?

Добавлено через 52 секунды
Цитата Сообщение от Андрей69 Посмотреть сообщение
Но могу за один проход удалить
объекты, родителем которых является panel1.
еще раз
Цитата Сообщение от Metall_Version Посмотреть сообщение
ты объект не удалишь, это .net - он сам удаляет объекты когда хочет
Цитата Сообщение от Metall_Version Посмотреть сообщение
пока есть ссылки на объект, он не будет удален
0
2 / 2 / 1
Регистрация: 10.03.2013
Сообщений: 100
17.02.2015, 22:33  [ТС]
Цитата Сообщение от Metall_Version Посмотреть сообщение
пока есть ссылки на объект, он не будет удален
Подскажите, где после foreach (Control ctrl in panel1.Controls) ctrl.Dispose() должна остаться хоть одна ссылка на любой и TextBox? (пример весь, из контекста не вырван)
C#
1
2
3
4
5
6
7
8
9
10
        private void Form1_Load(object sender, EventArgs e)
        {
            TextBox tbx1 = new TextBox() { Parent = panel1, Dock = DockStyle.Top, Font = new Font("Arial", 16) };
            TextBox tbx2 = new TextBox() { Parent = panel1, Dock = DockStyle.Bottom, Font = new Font("Arial", 16) };
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            foreach (Control ctrl in panel1.Controls) ctrl.Dispose();
        }
0
 Аватар для Metall_Version
2152 / 1289 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
17.02.2015, 22:37
Андрей69, для чего вы используйте метод .Dispose() ? это не правильно. он не для этого предназначен.

вот удаляет все контролы из коллекции
C#
1
 panel1.Controls.Clear();
0
2 / 2 / 1
Регистрация: 10.03.2013
Сообщений: 100
17.02.2015, 22:41  [ТС]
Не обижайтесь, но похоже теперь вы готовы прочитать начала топика еще раз.
Там два вопроса : по конкретной проблеме и второй - правильно ли я поступаю (даже если решить указанную проблему.)
0
 Аватар для Metall_Version
2152 / 1289 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
17.02.2015, 22:52
Лучший ответ Сообщение было отмечено Андрей69 как решение

Решение

Андрей69, в общем удаляй через Controls.Clear() или Controls.Remove, там три метода
если контролы после удаления должны будут опять восстанавливаться, то либо хайдить их, либо заранее прописывать в списке или массиве (который сделать полем класса формы).

можно хранить контролы изначально в разных группах списков/массивов, чтобы потом удалять необходимые из панели. а не все сразу (то есть выборочно) или давать контролам осмыссленые имена, и по этим именам потом удалять
1
2 / 2 / 1
Регистрация: 10.03.2013
Сообщений: 100
17.02.2015, 22:59  [ТС]
Metall_Version,
Спасибо за ответ.
Я не спорю с вами. Мне просто нужно понять.
Приведет ли такая конструкция к засорению памяти (пример чисто теоретический)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        private void Form1_Load(object sender, EventArgs e)
        {
            TextBox tbx1 = new TextBox() { Parent = panel1, Dock = DockStyle.Top, Font = new Font("Arial", 16) };
            TextBox tbx2 = new TextBox() { Parent = panel1, Dock = DockStyle.Bottom, Font = new Font("Arial", 16) };
 
            panel1.Controls.Clear();
 
            panel1.Controls.Add(tbx1);
            panel1.Controls.Add(tbx2);
 
            panel1.Controls.Clear();
 
            panel1.Controls.Add(tbx1);
            panel1.Controls.Add(tbx2);
 
            //и так много раз
         }
0
 Аватар для Metall_Version
2152 / 1289 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
17.02.2015, 23:10
Цитата Сообщение от Андрей69 Посмотреть сообщение
Приведет ли такая конструкция к засорению памяти (пример чисто теоретический)
вы понимаете что от этих методов памяти занимаемой программой больше не становится (только память на ссылки (64 бита в х64 и 32 бита в х32 системе) tbx1 в коллекции) то есть в любом случае как был один объект текст бокса, так он и будет один, даже после помещения его в панель.
C#
1
2
panel1.Controls.Add(tbx1);
panel1.Controls.Add(tbx2);
Добавлено через 2 минуты
то есть на память такое не влияет. и если это повторять сто раз (то добавлять то удалять)
то память будет то увеличиватся на мизер (количество контролов помещенных в панель * на 32 бита (х86 ОС))
при методах
C#
1
2
3
panel1.Controls.Add(tbx1);
 ....
panel1.Controls.Add(tbxN);
а при методе Controls.Clear(); будет ровно на столько же очищаться
1
2 / 2 / 1
Регистрация: 10.03.2013
Сообщений: 100
17.02.2015, 23:21  [ТС]
Цитата Сообщение от Metall_Version Посмотреть сообщение
этих методов памяти занимаемой программой больше не становится
Вы правы. Я не удачный пример создал. Гоняю ссылки, а объекты стоят в стороне и курят А если создавать много объектов

Приведет ли такая конструкция к засорению памяти?
C#
1
2
3
4
5
            for (int i = 0; i < 100; i++)
            {
                panel1.Controls.Add( new TextBox() );
                panel1.Controls.Clear();
            }
И последнее. Вопрос так же чисто академический. Почему у меня не уничтожались все контролы за один клик, как я писал раньше. Уничтожались по одному. Один клик - один контрол
C#
1
2
3
4
        private void button1_Click(object sender, EventArgs e)
        {
           foreach (Control ctrl in panel1.Controls) ctrl.Dispose();
        }
Или так нельзя?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.02.2015, 23:21
Помогаю со студенческими работами здесь

Подписать на событие динамически созданные TextBox
Создаю массив TextBox-ов : TextBox tb = new TextBox; for (int i = 0; i &lt; tb.Length; i++) { ...

Динамически созданные элементы. Подписка на события
Подскажите пожалуйста как создать событие для каждой программно созданной кнопки? И ещё мне нужно чтобы при следующем запуске программы...

Обработка нажатий на динамически созданные Buttons
Доброго времени суток!вот с такая проблема: пишу программу для бронирования мест в кинотеатре, в зависимости от зала динамически создаю...

Вывод записей Vk в динамически созданные Label
Ребята помогите пожалуйста. Как можно вывести нормально разборчиво записи из вк в различные леболы. И при этом сделать возможный вывод...

Как перемещать созданные объекты в picturebox мышкой
Подскажите как перемещать созданные объекты по пикчербоксу, кликать на объект и чтобы после этого они становились доступными для...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru