Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
 Аватар для TrueSize
2 / 2 / 0
Регистрация: 11.05.2011
Сообщений: 131

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

01.11.2012, 01:42. Показов 3290. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Возник такой вопрос.
Создал кодом checkbox, вот класс который этим занимается:
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
 
    class CreateControls
    {
        int x, y;
        string name;
        string text;
        Control cont = new Control();
 
        /// <summary>
        /// Добавить чекбокс
        /// </summary>
        /// <param name="name">Имя чекбокса</param>
        /// <param name="text">Надпись на чекбоксе</param>
        /// <param name="x">расположние по Х</param>
        /// <param name="y">расположение по Y</param>
        /// <param name="cont">Контейнер</param>
        public CreateControls(string name, string text, int x, int y, Control cont )
        {
            this.name = name;
            this.text = text;
            this.x = x;
            this.y = y;
            this.cont = cont;
            CreateCheckBox();
        }
 
 
        void CreateCheckBox()
        {
            CheckBox ckbx = new CheckBox();
            ckbx.AutoSize = true;
            ckbx.Location = new System.Drawing.Point(x, y);
            ckbx.Name = name;
            ckbx.Size = new System.Drawing.Size(80, 17);
            ckbx.TabIndex = 2;
            ckbx.Text = text;
            ckbx.UseVisualStyleBackColor = true;
            cont.Controls.Add(ckbx);
        }
 
 
    }
Вот, непосредственно, создается checkbox:
C#
1
CreateControls c1 = new CreateControls("chb1", "тру", 20, 36, groupBox1);
Все работает, контрол создается, отображается на форме, но вопрос в том: как мне к нему обращаться в коде и работать с ним дальше?

PS Я не опытный, поэтому сильно не обращайте внимание на кривую реализацию класса (я не против конструктивной критики. Но это второстепенно).
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.11.2012, 01:42
Ответы с готовыми решениями:

Как обратиться к динамически созданным контроллам
Добрый день. Столкнулся с проблемой: после того, как была динамически создана кнопка, дальнейшая работа с ней не получается. Конкретизирую:...

Как обращаться к динамически созданным TextBox на Panel
на панели создаются текстовые поля for (int i = 0; i &lt;= Convert.ToInt32(textBox3.Text); i++) { ...

Как правильно пользоваться созданным контролом в виде отдельной dll?
Всем здравствуйте. До сих пор я каждый раз вставлял в тело проекта созданный мной контрол вместе со всеми его модулями (классами) и уж...

9
15 / 15 / 3
Регистрация: 27.11.2011
Сообщений: 63
01.11.2012, 10:38
Ты создал объект cont - экземпляр класса Control. Этот класс наследует явную реализацию интерфейса IContainer от класса Container. Но это дебри. В общем это значит, что этот объект может логически(!!!) иметь список подчиненных элементов, в нашем случае объектов типа Control. Так вот. В коде ты как раз и создал такой контейнер, логически подцепив к нему ckbx. После создания экземпляра класса CreateControls, можешь смело обращаться к его полю (сделай его public) cont. То бишь:

C#
1
2
CreateControls c1 = new CreateControls("chb1", "тру", 20, 36, groupBox1);
Control myChildControl = c1.Controls[0];// заметь, в списке c1.Controls хранятся экземпляры типа именно Control
Ну а дальше все нужное делаешь этим объектом. Если нужно работать с ним как с CheckBox, делаешь приведение:
C#
1
2
3
4
5
CheckBox myCheckBox = myChildControl as CheckBox;
if (myCheckBox != null)
{
// необходимые операции
}
з.ы. надеюсь более-менее понятно
з.ы.ы. необязательно инициализировать сразу
C#
1
Control cont = new Control();
,
можно в конструкторе,и, наверное, так будет правильнее:
C#
1
Control cont;
1
 Аватар для TrueSize
2 / 2 / 0
Регистрация: 11.05.2011
Сообщений: 131
01.11.2012, 22:26  [ТС]
Привожу объект к checkbox вот этим кодом
C#
1
2
3
4
5
CheckBox myCheckBox = myChildControl as CheckBox;
if (myCheckBox != null)
{
// необходимые операции
}
Все работает, но как мне (например), отловить событие CheckedChanged?


Цитата Сообщение от chr00me Посмотреть сообщение
з.ы.ы. необязательно инициализировать сразу
C#
1
 Control cont = new Control();
,
можно в конструкторе,и, наверное, так будет правильнее:
C#
1
 Control cont;
Вот эта часть не совсем понятна...
Я сделал его public вот так:
C#
1
public Control cont = new Control();
0
15 / 15 / 3
Регистрация: 27.11.2011
Сообщений: 63
01.11.2012, 23:02
Сначала про инициализацию контрола в классе CreateControls.
Смотри, ты при инициализации класса(сиречь типа) в строке
C#
1
Control cont = new Control();
выделяешь определенное количество памяти под экземпляр класса Control, но в данном контексте, ты не используешь этот свежесозданный контрол, а в конструкторе, в строке
C#
1
this.cont = cont;
указываешь на другой(созданный из-вне) контрол, ссылку на который ты передаешь через фактический(или формальный, не помню) параметр конструктора. Вот и получается, что на
C#
1
new Control()
теперь нет ссылок. Сборщик мусора, конечно, не зря ест свои ресурсы, он автоматом уничтожит этот объект, но зачем беднягу лишний раз напрягать?

Теперь про событие. Вот ты привел этот контрол к типу CheckBox. Теперь можно навешивать обработчики на события. Что-то вроде:
C#
1
2
3
4
5
6
myCheckBox.CheckedChanged += new EventHandler(myCheckBox_CheckedChanged);
 
private void myCheckBox_CheckedChanged(object sender, EventArgs e)
{
  // что-то делаешь
}
Конечно лучше сразу навесить, если все уже известно, что необходимо, в методе void CreateCheckBox():
C#
1
ckbx.CheckedChanged += new EventHandler(myCheckBox_CheckedChanged);
Надеюсь более-менее ясно.
з.ы.Сорри за возможные синтаксические ошибки в коде, писал прям тут.
з.ы.ы. Почитай про события и делегаты, вникни как следует, это в разы облегчит понимание.
0
 Аватар для TrueSize
2 / 2 / 0
Регистрация: 11.05.2011
Сообщений: 131
01.11.2012, 23:39  [ТС]
Ясно, спасибо.
А есть способ более правильно и эффективно создавать контролы?

Добавлено через 8 минут
И будет ли толк от этого, если сделать метод CreateCheckBox(); не void, а CheckBox?
0
15 / 15 / 3
Регистрация: 27.11.2011
Сообщений: 63
01.11.2012, 23:44
На самом деле да. Класс UserControl специально создан для таких целей. И еще, есть библиотеки DevExpress, они платные, но там уже готовых конторлов на любой специфический вкус припасено

Толк будет, если тебе такое нужно. Это уже наверное ближе к разряду "стиль программирования", так что тут однозначного ответа правильно-неправильно нет.
1
 Аватар для TrueSize
2 / 2 / 0
Регистрация: 11.05.2011
Сообщений: 131
02.11.2012, 01:18  [ТС]
Ну, основная цель у меня была- это создать чекбокс (кодом), который не будет отличатся от созданного в графическом редакторе и пользоваться им так же легко как и обычным...
0
15 / 15 / 3
Регистрация: 27.11.2011
Сообщений: 63
02.11.2012, 19:08
Цитата Сообщение от TrueSize Посмотреть сообщение
это создать чекбокс (кодом)
А ты загляни в [имя_формы].Designer.cs своей формы, там все как раз и создается кодом.
0
 Аватар для TrueSize
2 / 2 / 0
Регистрация: 11.05.2011
Сообщений: 131
02.11.2012, 23:57  [ТС]
Цитата Сообщение от chr00me Посмотреть сообщение
А ты загляни в [имя_формы].Designer.cs своей формы, там все как раз и создается кодом.
Оттуда все было взято
0
15 / 15 / 3
Регистрация: 27.11.2011
Сообщений: 63
03.11.2012, 00:37
Так разницы абсолютно никакой. Когда создается форма(дизайнером), класс формы делится на партиалы(сиречь части) и раскидывается по двум файлам. Файл [имя_формы].Designer.cs парсится дизайнером и дает возможность накидать все ручками. Да, может хардкорные С++ -ки закидают меня помидорами и скажут, что это не тру, но все же это намного удобнее, если понимаешь, как все работает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.11.2012, 00:37
Помогаю со студенческими работами здесь

Связать переменную с програмно созданным контролом
Всем привет. Вот такая задачка возникла. Необходимо связать переменную с CEdit для обмена данными введенными пользователем. Если все...

Как обратиться к динамически созданным кнопкам?
Доброго времени. Создаю неизвестное заранее количество кнопок (напротив таблицы) и назначаю обработчик t_bttnClick, что нужно написать в...

Как обращаться к динамически созданным объектам
Доброго времени суток. Возникла следующая необходимость, создать указанное кол-во динамических объектов(lineedit, к примеру)и в последствии...

Как обращаться к динамически созданным кнопкам?
Есть код Private Sub UserForm_Initialize() Dim cmd(n) As MSForms.CommandButton For i = 1 To n Set cmd(i) =...

Как работать с MultiPage контролом?
Господа программеры, объясните, пожалуйста как работать с MultiPage контролом. Не получается привязать контрол (например кнопку) к...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru