Динамическое добавление элементов windows forms

Обновлено: 07.07.2024

Но что делать, если нужно изменить содержимое Panel в среде выполнения? Соответствующий процесс должен показаться вам очень знакомым, если вы внимательно прочитали материал книги, посвященный работе с Windows Forms. Давайте добавим в текущую страницу кнопку (с названием btnAddWidgets), которая будет динамически добавлять в Panel пять новых типов TextBox, и еще одну кнопку, которая будет выполнять очистку Panel от всех элементов управления. Обработчики событий Click для этих кнопок приведены ниже.

protected void btnAddWidgets_Click(object sender, EventArgs e)

for (int i = 0; i ‹ 5; i++)

// Назначение имени, чтобы позже получить соответствующее

// текстовое значение с помощью метода

TextBox t = new TextBox();

t.ID = string.Format("newTextBox", i);

protected void btnRemovePanelItems_Click(object sender, EventArgs e)

protected void btnGetTextBoxValues_Click(object sender, System.EventArgs e)

for(int i = 0; i ‹ Request.Form.Count; i++)

textBoxValues += string.Format("‹li›‹/li›‹br›", Request.Form[i]);

Исходный код. Файлы примера DynamicCtrls размещены в подкаталоге, соответствующем главе 23.

Удаление элементов АСЕ

Удаление элементов АСЕ Функция DeleteAce удаляет АСЕ, определяемый с помощью индекса аналогично тому, как это делается в случае функции

Добавление и удаление элементов Web-страницы

Добавление и удаление элементов Web-страницы А теперь — высший пилотаж Web-программирования! Программное добавление на Web-страницу новых элементов и программное же их удаление. Для этого применяют методы объекта DomHelper.Метод append добавляет новый элемент Web-страницы в

Добавление и удаление элементов Web-страницы

Добавление и удаление элементов Web-страницы А теперь — высший пилотаж Web-программирования! Программное добавление на Web-страницу новых элементов и программное же их удаление. Для этого применяют методы объекта DomHelper.Метод append добавляет новый элемент Web-страницы в

Добавление в проект элементов и редактирование их свойств

Добавление в проект элементов и редактирование их свойств С помощью панели инструментов вкладки Building (Строение) можно вносить в проект здания недостающие элементы: окна, двери, лестницы и др. Кроме того, можно редактировать проект в объемном 3D-виде, что очень наглядно.

Добавление элементов управления из панели инструментов Toolbox

Добавление элементов управления из панели инструментов Toolbox Теперь заготовка формы на экране, и можно добавлять в нее элементы управления - всякие разные штучки в форме, с помощью которых взаимодействуют люди. Элементы управления берутся из панели элементов управления

Добавление новых элементов в панель элементов управления

Добавление новых элементов в панель элементов управления Чтобы получить возможность использовать элемент управления ActiveX, выполните следующее.1. Установите программное обеспечение элемента управления на жесткий диск.Мне кажется, это имеет смысл.2. Зарегистрируйте

Добавление и удаление элементов таблицы

Добавление и удаление элементов таблицы При редактировании таблицы иногда бывает необходимо добавлять в нее дополнительные элементы – строки или столбцы. Для этого выделите такое количество строк или столбцов, какое нужно добавить. Затем перейдите на вкладку Работа с

Добавление элементов управления в форму вручную

Добавление элементов управления в форму вручную Независимо от того, какой именно элемент управления вы выбираете для размещения в форме, последовательность шагов, которые при этом выполняются, оказывается одной и той же. Во-первых, вы должны определить члены-переменные,

Добавление элементов управления в форму в Visual Studio 2005

Добавление элементов управления в форму в Visual Studio 2005 Теперь, когда вы понимаете суть процесса добавления элементов управления в форму, давайте посмотрим, как Visual Studio 2005 может автоматизировать этот процесс. Создайте новый проект Windows Application, выбрав дня него произвольное

Динамическое позиционирование элементов управления Windows Forms

Динамическое позиционирование элементов управления Windows Forms Чтобы завершить эту главу, давайте рассмотрим несколько подходов, которые можно использовать для управления размещением элементов управления в форме. Если при создании типа Form вы предполагаете, что элементы

Добавление и удаление объектов

Добавление и удаление объектов Ну хорошо, со стандартными плашками-надписями мы уже наигрались. А что делать, если их нам, по каким-то таинственным причинам, не хватает? Как добавить в нашу «рыбу» новую надпись, картинку, объект? Давайте начнем с надписи. Чтобы создать

6.12.5. Удаление элементов map

6.12.5. Удаление элементов map Существуют три формы функции-члена erase() для удаления элементов отображения. Для единственного элемента используется erase() с ключом или итератором в качестве аргумента, а для последовательности эта функция вызывается с двумя итераторами.

Добавление элементов управления в TTabbedNotebook и TNotebook

Добавление элементов управления в TTabbedNotebook и TNotebook Я несколько раз видел в конференциях вопросы типа "как мне добавить элементы управления в TTabbedNotebook или TNotebook во время выполнения программы?". Теперь, когда у меня выдалось несколько свободных минут, я попытаюсь осветить

Добавление и удаление

Добавление и удаление Добавление переходов в проект выполняется во многом аналогично добавлению в проект видеосцен: понравившийся переход нужно просто перетащить в окно Фильм. Однако при выборе положения перехода следует учитывать некоторую особенность: переход можно

Удаление элементов Проводника

Удаление элементов Проводника Существует возможность запрета отображения некоторых элементов Проводника. В данном разделе книги мы подробнее познакомимся с этой возможностью.Удаление меню ФайлС помощью несложной операции можно удалить меню Файл из главного меню как

Всем привет.
Черный плащ спешит на помощь, поэтому сегодня опять топик про вопрос на форуме MSDN. Ну, а так как у меня уже был цикл статей про позднее связывание, то давайте я его и продолжу.
Коротенько суть проблемы: Пользователь вводит некоторые данные, на основе которых принимается решение, какой компонент создать. Ну а дальше, т.к. все компоненты ведут себя одинаково, то работа с ними должна идти через схожий функционал (имена свойств и методов заранее известны).

Для демонстрации, я воспользуюсь двумя компонентами, позволяющими вводить строку и сообщать о том, что пользователь ввел бяку.
Для реализации задумки, создадим интерфейс, который будет реализовывать публичный контракт:


Добавляем ему поддержку нашего интерфейса и реализуем соответствующие методы:

public partial class FirstControl : UserControl , IBaseAbstractControl

<
public FirstControl()
<
InitializeComponent();
>

<
MessageBox .Show( "Вы ввели неправильные данные" );
>
>

Получилось достаточно просто. Добавляем второй UserControl, вот с таким дизайном (я заполнил Items у ComboBox всякими разными строками):


Также наследуем его от интерфейса и реализуем свойства и метод:

public partial class SecondControl : UserControl , IBaseAbstractControl

<
public SecondControl()
<
InitializeComponent();
>

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


Ну и пишем обработчики кнопок:

<
public Form1()
<
InitializeComponent();
>

private void btCreateControl_Click( object sender, EventArgs e)

<
switch (comboBox1.SelectedIndex)
<
case 0:
_control = new FirstControl ();
break ;
case 1:
_control = new SecondControl ();
break ;
default :
MessageBox .Show( " Выбирите способ ввода " );
return ;
>
btCreateControl.Enabled = false ;
_control.Header = " Введите текст не менее тре символов " ;
panel1.Controls.Add(( Control )_control);
btCheckText.Enabled = true ;
>

private void btCheckText_Click( object sender, EventArgs e)

<
if (_control.InputString.Length < 3)
<
_control.ShowError();
>
else
<
MessageBox .Show( " Вы ввели текст : " + _control.InputString);
>
>
>

Как видно, про компоненты что то говориться, только в момент вызова конструктора. Вся остальная работа ведется через интерфейс. Т.е. мы вызываем конструктор компонента в зависимости от выбора пользователя, результат записываем в переменную типа наш интерфейс. Устанавливаем текст, помещаем компонент в приготовленную специально для него панель. Ну и в обработчике второй кнопки получаем текст из компонента и, при необходимости, сообщаем что его нам ввели неправильно.
Ну и вот так выглядит приложение в процессе работы:

Расставим первую группу элементов. Наша цель, по нажатию кнопки, в определённом месте получить новую (созданную) кнопку и добавить для неё событие нажатия, которое выполнит изменение текста кнопки. Также добавим кнопку по уничтожению этой добавленной кнопки. И, наконец, добавим кнопку, которая автоматически добавит массив однотипных текстовых полей.

Расставим первую группу следующим образом:


Рис. 4. 1. Начальная расстановка элементов

Здесь у нас есть такие элементы как MenuStrip (меню сверху), GroupBox (рамка с текстом), кнопки Button, NumericUpDown (элемент «ползунка») и элемент StatusStrip (отдельное поле внизу).


Рис. 4. 2. Панель элементов: NumericUpDown


Рис. 4. 3. Панельэлементов: StatusStrip

(Name): MainMenu
ToolTip на Hint: Меню
Первый главный пункт: Файл
Первый всплывающий пункт: вводим произвольное имя, далее выделяем этот пункт меню, жмём по нему правую кнопку мыши и выбираем Преобразовать в ->Separator
Второй всплывающий пункт: Выход


Рис. 4. 4. Типы для пункта меню (текущий выделенный элемент 1: преобразуем в Separator)

Событие Click пункта меню Выход:

privatevoidвыходToolStripMenuItem_Click(object sender, EventArgs e)

Добавим «горячую» клавишу. Для этого выделим элемент меню и войдём в его свойства. Ищем там пункт ShortcutKeys. Выставляем галочку в Ctrl(Модификаторы), и ищем в списке Клавиши нужную: E:


Добавим также отображение текстовой строки для будущей строки состоящая. В поле ShortcutKeyDislpayString впишем: Ctrl+E.

Теперь нажатие выбранного сочетания Ctrl+E приведёт к закрытию приложения (сочетание клавиш имитирует нажатие пункта меню Выход и соответственно выполнения события нажатия).

Выберем для StatusStrip отображаемый тип, в который будем заносить что-либо. Например, мы хотим сделать из него элемент строки состояния (отображающий текст подсказки внизу и индикатор выполнения прохождения процесса). Для этого выделим элемент, нажмём символ «стрелки вниз» и выберем сначала StatusLabel, затем ProgressBar (после добавления элемента, «чистый» макет появится справа).


Рис. 4. 4. Добавление нового элемента для строки состояния

StatusStrip:

(Name): MainStatus
ToolTip на Hint: Строкасостояния

StatusLabel:

(Name): StatusLabel
Text: <пусто>

PrgoressBar:

(Name): StatusProgressBar

Организуем вывод подсказки в строке состояния для кнопки Выход. Для этого инициализируем событие MouseEnter(ожидание получения фокуса). Кодсобытиямодифицируем:

privatevoidвыходToolStripMenuItem_MouseEnter(object sender, EventArgs e)

StatusLabel.Text = выходToolStripMenuItem.Text + " (" + выходToolStripMenuItem.ShortcutKeyDisplayString + ")";

При потере фокуса с элемента организуем стандартное обнуление строки состояния. Событие MouseEnter для всей формы (выделяем заголовок формы для перехода к свойствам формы):

privatevoid LWP05Main_MouseEnter(object sender, EventArgs e)

ИсобытиеMouseLeaveпунктаменюВыход:

privatevoidвыходToolStripMenuItem_MouseLeave(object sender, EventArgs e)

Добавимвизуальныйэффект. При нажатии на кнопку выход приложение будет замирать на секунду. И в строке состояния будет заполняться индикатор прогресса на 100%. После этого приложение закроется.

Добавим таймер с панели элементов:


(Name): TimerOneSecond
Interval:

^ Интервал между событиями Elapsed в миллисекундах.

Единственное событие таймера инициализируем двойным нажатием на иконку таймера в конструкторе форм (Tick) и модифицируем:


privatevoid TimerOneSecond_Tick(object sender, EventArgs e)

Модифицируем событие нажатия кнопки Выход:

privatevoidвыходToolStripMenuItem_Click(object sender, EventArgs e)

TimerOneSecond.Tick += newEventHandler(TimerOneSecond_Tick); // Прошласекунда: генерируемсобытие "одинтакт" таймера

StatusProgressBar.Maximum = 100; // Устанавливаем максимум для индикатора

StatusProgressBar.Value = 100; // Переводим текущее значение на максимум

Компилируем, проверяем работоспособность. Индикатор заполняется после нажатия кнопки, затем через секунду приложение закрывается. При наведении на пункт меню отображаются все подсказки.

Основы «украшательств» мы разобрали. Теперь перейдём к кнопкам. Начнём с кнопки Добавить:

Button (Добавить):

(Name): button1
Text: Добавить
ToolTip на Hint: Добавить элемент управления

СобытиеClickкнопкиДобавить:

privatevoid button1_Click(object sender, EventArgs e)

System.Windows.Forms.Button NewButton = new System.Windows.Forms.Button(); // Создаёмкнопку

NewButton.Location = new System.Drawing.Point(17, 70); // Устанавливаемнеобходимыесвойства

NewButton.Name = "NewButton"; // Устанавливаемимякнопки

NewButton.Size = new System.Drawing.Size(237, 23); // Устанавливаемразмеркнопки

NewButton.TabIndex = 0; // Порядок переключение по клавише Tab

NewButton.Text = "NewButton"; // Устанавливаем текст на кнопке

NewButton.Click += new System.EventHandler(NewButton_Click); // button1_Click - функция обработчик события нажатия на кнопку

Controls.Add(NewButton); // Добавляем на форму

NewButton.BringToFront(); // Помещаем элемент на передний план

button2.Enabled = true; // Включаем кнопку Удалить

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

/* Получаем доступ к элементу управления по его имени */

(Controls["NewButton"] asButton).Text = "Ура, заработало!";

Кнопка Удалить:

Button (Удалить):

(Name): button2
Text: Удалить
ToolTip на Hint: Удалить элемент управления
Enabled: False

^ Выключаем кнопку изначально.

СобытиеClickкнопкиУдалить:

privatevoid button2_Click(object sender, EventArgs e)

Controls.Remove((Controls["NewButton"] asButton)); // Удаляемсформыкнопку NewButton

//(Controls["NewButton"] as Button).Dispose(); // Освобождаемресурсызанятыекнопкой

Вторая строчка закомментирована по причине того, что уничтожение виртуального объекта невозможно. Нужно уничтожать конкретный объект либо очистить все ссылки на объект, тогда он будет уничтожен сборщиком мусора. Для этого вставим ещё одну кнопку (button4):


Пусть она выполняет функции выхода из приложения.

Удалим эту кнопку по нажатию на Удалить:

privatevoid button2_Click(object sender, EventArgs e)

Controls.Remove((Controls["NewButton"] asButton)); // Удаляемсформыкнопку NewButton

//(Controls["NewButton"] as Button).Dispose(); // Освобождаемресурсызанятыекнопкой

button2.Enabled = false; // Выключаем кнопку после завершения операций уничтожения кнопок

Кнопка Массив:

Button (Массив):

(Name): button3
Text: Массив
ToolTip на Hint: Добавить массив элементов управления (число выбираем справа)

NumericUpDown:

(Name): NumericButtons
Maximum:

Событие Click кнопки Массив 3, 4 :

privatevoid button3_Click(object sender, EventArgs e)

StatusProgressBar.Value = 0; // Сбрасываеминдикаторпринажатии

StatusProgressBar.Step = 34; // Задаём шаг для индикатора (делим на 3 части 100)

TextBox[] TB = newTextBox[Convert.ToInt32(NumericButtons.Value)]; // Объявляем массив элементов управления по числву выбранному в NumericButtons

for (int i = 0; i < TB.Length; i++) // Организуем цикл по числу элементов массива

StatusProgressBar.PerformStep(); // Увеличиваем значение индикатора

TB[i] = new System.Windows.Forms.TextBox(); // Создаём элемент i

TB[i].Location = new System.Drawing.Point(365 + i * 80, 50); // Позицияэлемента i

TB[i].Name = "textBox" + i.ToString(); // Заполняемэлемент i

TB[i].Size = new System.Drawing.Size(75, 23);

TB[i].Text = "textBox" + i.ToString();

StatusLabel.Text = "Массив элементов управлений успешно создан (" + StatusProgressBar.Value + "%)"; // выводим текст в строку состояния

ПРИМЕЧАНИЕ № 3: Вообще, для того, чтобы динамически добавить какой-то элемент не нужно знать всех его параметров изначально (только если это не ваш собственный элемент управления). Добавляем такой же элемент управления, настраиваем как надо и смотрим код конструктора для этого элемента в файле <имя формы>.desinger.cs.

ПРИМЕЧАНИЕ № 4: Поиск в элементах управления можно реализовать через массив всех элементов определённого типа. Эти элементы, в которых нужно вести поиск и замену должны существовать.

Пример реализации поиска текста в однотипных элементах управления типа TextBox (можно сделать отдельной кнопкой):

foreach (Control control in Controls)

TextBox TB = control asTextBox;

if (TB != null) // Если элемент существует

if (TB.Text == "textBox1") // Обращаемся к конкретному элементу правления

TB.Text = "Надейно и заменено";

TB.Text = "Text"; // Меняем текст во всех остальных подобных элементах

Компилируем, проверяем работоспособность. Индикатор заполняется после нажатия кнопки Массив, и добавляется текстовое поле редактирования под номером i, указанным в числовом поле справа от кнопки:


Рис. 4. 5. Окончательная работа блока добавления и уничтожения элементов управления

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



Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни.

Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций.

Для начала изменим размер нашей единственной формы. Для этого можно потянуть за уголок в нужном направлении на странице визуального представления формы 1 . Но также размер можно менять на панели свойств этой формы. Для этого нужно поменять значение размера в пикселях (высоту и ширину) в поле Size.


ПРИМЕЧАНИЕ № 1: Для перехода на визуальное представление формы, необходимо двойным нажатием в обозревателе решений нажать на значок формы () или выбрать вкладку на панели вкладок с именем<имя формы>.cs [Конструктор].

Задаём следующие параметры формы на панели Свойства:

(Name)

изменим с Form1.cs 2 на LWP05Main

^ Поменяем внутреннее имя формы.

^ Поменяем заголовок формы (то что отображается в шапке приложения слева).

изменим изображение (иконку) приложения

^ Необходим файл значка *.ico.

изменим со значений 300; 300 на 640; 480

^ Поменяем размер формы.


ПРИМЕЧАНИЕ № 2: Для того, чтобы поменять имя файла нашей формы, необходимо выполнить следующее: выделить в обозревателе решений значок формы () и нажать правую кнопку мыши, затем выбратьПереименовать. Ввести необходимое новое имя, СОХРАНЯЯ расширение *.cs. После смены имени, автоматически поменяются имена проассоциированных непосредственно с формой файлов:


Получим нечто подобное:


Рис. 3. 1. Модифицированная форма приложения


Добавим на нашу форму ToolTip ().

Параметры добавленного элемента всплывающей подсказки таковы:

(Name):

4. Модификация приложения Windows Forms: динамическое добавление и уничтожение элемента управления

Расставим первую группу элементов. Наша цель, по нажатию кнопки, в определённом месте получить новую (созданную) кнопку и добавить для неё событие нажатия, которое выполнит изменение текста кнопки. Также добавим кнопку по уничтожению этой добавленной кнопки. И, наконец, добавим кнопку, которая автоматически добавит массив однотипных текстовых полей.

Расставим первую группу следующим образом:


Рис. 4. 1. Начальная расстановка элементов

Здесь у нас есть такие элементы как MenuStrip (меню сверху), GroupBox (рамка с текстом), кнопки Button, NumericUpDown (элемент «ползунка») и элемент StatusStrip (отдельное поле внизу).


Рис. 4. 2. Панель элементов: NumericUpDown


Рис. 4. 3. Панель элементов: StatusStrip

ToolTip на Hint:

Первый главный пункт:

Первый всплывающий пункт:

вводим произвольное имя, далее выделяем этот пункт меню, жмём по нему правую кнопку мыши и выбираем Преобразовать в -> Separator

Второй всплывающий пункт:


Рис. 4. 4. Типы для пункта меню (текущий выделенный элемент 1: преобразуем в Separator)

Событие Click пункта меню Выход:

private void выходToolStripMenuItem_Click(object sender, EventArgs e)

Добавим «горячую» клавишу. Для этого выделим элемент меню и войдём в его свойства. Ищем там пункт ShortcutKeys. Выставляем галочку в Ctrl (Модификаторы), и ищем в списке Клавиши нужную: E:


Добавим также отображение текстовой строки для будущей строки состоящая. В поле ShortcutKeyDislpayString впишем: Ctrl+E.

Теперь нажатие выбранного сочетания Ctrl+E приведёт к закрытию приложения (сочетание клавиш имитирует нажатие пункта меню Выход и соответственно выполнения события нажатия).

Выберем для StatusStrip отображаемый тип, в который будем заносить что-либо. Например, мы хотим сделать из него элемент строки состояния (отображающий текст подсказки внизу и индикатор выполнения прохождения процесса). Для этого выделим элемент, нажмём символ «стрелки вниз» и выберем сначала StatusLabel, затем ProgressBar (после добавления элемента, «чистый» макет появится справа).

Читайте также: