Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# Windows Forms

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Андрей69
2 / 2 / 0
Регистрация: 10.03.2013
Сообщений: 72
#1

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

17.02.2015, 08:04. Просмотров 1651. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.02.2015, 08:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Удалить динамически созданные объекты (C#):

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

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

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

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

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

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

20
Андрей69
2 / 2 / 0
Регистрация: 10.03.2013
Сообщений: 72
17.02.2015, 22:41  [ТС] #16
Не обижайтесь, но похоже теперь вы готовы прочитать начала топика еще раз.
Там два вопроса : по конкретной проблеме и второй - правильно ли я поступаю (даже если решить указанную проблему.)
0
Metall_Version
2113 / 1250 / 415
Регистрация: 04.03.2014
Сообщений: 4,095
Завершенные тесты: 2
17.02.2015, 22:52 #17
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Андрей69, в общем удаляй через Controls.Clear() или Controls.Remove, там три метода
если контролы после удаления должны будут опять восстанавливаться, то либо хайдить их, либо заранее прописывать в списке или массиве (который сделать полем класса формы).

можно хранить контролы изначально в разных группах списков/массивов, чтобы потом удалять необходимые из панели. а не все сразу (то есть выборочно) или давать контролам осмыссленые имена, и по этим именам потом удалять
1
Андрей69
2 / 2 / 0
Регистрация: 10.03.2013
Сообщений: 72
17.02.2015, 22:59  [ТС] #18
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
2113 / 1250 / 415
Регистрация: 04.03.2014
Сообщений: 4,095
Завершенные тесты: 2
17.02.2015, 23:10 #19
Цитата Сообщение от Андрей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
Андрей69
2 / 2 / 0
Регистрация: 10.03.2013
Сообщений: 72
17.02.2015, 23:21  [ТС] #20
Цитата Сообщение от 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
Metall_Version
2113 / 1250 / 415
Регистрация: 04.03.2014
Сообщений: 4,095
Завершенные тесты: 2
17.02.2015, 23:56 #21
Цитата Сообщение от Андрей69 Посмотреть сообщение
Приведет ли такая конструкция к засорению памяти?
ну почему засорению, если все 100 контролов вам нужны, то это не засорение,
вообще 100 это не цифра, вполне может столько быть в обычном проекте на винформах и даже больше.
главное понимать что от операций Controls.Add Controls.Clear, память почти не меняется (размерами ссылок можно пренебречь) а меняется только оператором new , который создает новый объект (контрол) в куче.

в после такого кода, память не изменится, ибо мы добавили и сразу удалили (и так 100 раз),
и потом через какое то время сборщик мусора сам почистит все 100 этих созданных текстбоксов, ибо на них нету ссылок ни где более
C#
1
2
3
4
5
            for (int i = 0; i < 100; i++)
            {
                panel1.Controls.Add( new TextBox() );
                panel1.Controls.Clear();
            }


Цитата Сообщение от Андрей69 Посмотреть сообщение
Или так нельзя?
нельзя, это метод не для этих целей, он нужен чтобы освободить ресурсы используемые контролом.
точно почему не знаю, возможно при вызове ctrl.Dispose(); в фориче вызывалось какое-то исключение, и итерации прекращались.
1
17.02.2015, 23:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.02.2015, 23:56
Привет! Вот еще темы с ответами:

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

Как перебрать все объекты созданные в форме? - C#
Подскажите, как перебрать все визуальные и невизуальные объекты в форме. Конструкции: Form1.components.Components и...

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

Делим картинку и выводим в динамически созданные PictureBox - C#
Здравствуйте! Столкнулся с такой задачей: нужно разделить изображение на части и вывести эти части на форму в виде PictureBox. Всё...


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

Или воспользуйтесь поиском по форуму:
21
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru