Опубликован: 11.09.2006 | Уровень: специалист | Доступ: свободно
Лекция 3:

Работа с элементами управления (продолжение)

Добавление элементов управления в режиме работы приложения. Элементы управления CheckBox, GroupBox и RadioButton

При размещении на форме элемента управления в режиме дизайна, среда создает код в области Windows Form Designer generated code, описывающий этот элемент. Если мы назначим в обработчике заданного элемента управления генерацию аналогичного кода, то в запущенном приложении можно будет добавлять на форму другие элементы, активизируя этот обработчик. Для добавления элементов управления используется объект ControlsCollection, содержащий ряд методов (см. таблицу 3.1). Под коллекцией элементов понимается их упорядоченная последовательность.

Таблица 3.1. Некоторые методы ControlsCollection
Метод Описание
Add Добавление элемента в коллекцию
AddRange Добавление массива элементов
Clear Удаление всех элементов из коллекции
Remove Удаление элемента из коллекции
RemoveAt Удаление элемента по заданному индексу
Count Общее число элементов в коллекции

Рассмотрим на практике добавление элементов управления. Создайте новое приложение и назовите его RegistrationForm. Располагаем на форме три надписи, два текстовых поля, кнопку, элементы CheckBox и GroupBox (рис. 3.3):

Приложение RegistrationForm. Расположение элементов на форме в режиме дизайна

Рис. 3.3. Приложение RegistrationForm. Расположение элементов на форме в режиме дизайна

Устанавливаем следующие значения свойств формы и элементов управления:

Form1, форма, свойство Значение
Size 392; 320
Text Регистрация программы
label1, свойство Значение
Location 32; 8
Size 224; 24
Text Выберите тип регистрации
label2, свойство Значение
Location 16; 32
Size 48; 23
Text Name
label3, свойство Значение
Location 16; 64
Size 40; 23
Text PIN
Button1, свойство Значение
Location 80; 248
Size 144; 23
Text Регистрация
TextBox1, свойство Значение
Location 96; 32
Size 184; 20
Text
TextBox2, свойство Значение
Location 96; 64
Size 184; 20
Text
CheckBox1, свойство Значение
Location 40; 40
Size 232; 24
Text Расширенные возможности
GroupBox1, свойство Значение
Location 16; 80
Size 344; 144
Text Введите регистрационые данные

Элемент CheckBox обычно применяется для выбора отложенного действия, но в данном случае при его выборе немедленно будет появляться дополнительное текстовое поле и надпись. Щелкаем дважды на этом элементе в режиме дизайна — при этом создается событие CheckedChanged:

private void checkBox1_CheckedChanged(object sender, System.EventArgs e)
 {
   //Создаем новый экземпляр lbl класса Label:
   Label lbl = new Label();
   //Определяем расположение  надписи — свойство Location
   lbl.Location = new System.Drawing.Point(16, 96);
   //Устанавливаем размер надписи
   lbl.Size = new System.Drawing.Size(32, 23);
   //Задаем имя:
   lbl.Name = "labelll";
   //Определяем порядок переключения при нажатии клавиши Tab
   lbl.TabIndex = 2;
   //Устнаавливаем текст надписи на форме
   lbl.Text = "PIN2";
   //Добавляем элемент в коллекцию, вызывая метод Add
   groupBox1.Controls.Add(lbl);


   TextBox txt = new TextBox();
   txt.Location = new System.Drawing.Point(96, 96);
   txt.Size = new System.Drawing.Size(184, 20);
   txt.Name = "textboxx";
   txt.TabIndex = 1;
   txt.Text = "";
   groupBox1.Controls.Add(txt);
 
 }
Листинг 3.1.

Запускаем приложение. При выборе пункта "Расширенные возможности" на форме появляется третье текстовое поле. Для определения параметров добавляемого элемента, таких как размер и расположение, лучше всего добавить элемент в режиме дизайна формы, скопировать нужные параметры из области Windows Form Designer generated code, а затем удалить его.

Добавим на форму два элемента RadioButton (переключателя) — при последовательном их выборе дополнительные текстовое поле и надпись будут появляться или исчезать. Устанавливаем значения свойства Text этим элементам "Полная" и "Ограниченная". Дважды щелкаем на каждый из переключателей, переходя в их код. В обработчике первого элемента RadioButton вставляем скопированный код из обработчика чекбокса. При выборе второго переключателя вся группа элементов, содержащаяся в GroupBox, будет удалена, а затем в новую группу добавятся два текстовых поля и две надписи:

private void radioButton2_CheckedChanged(object sender, System.EventArgs e)
 {
   //Удаляем все элементы из коллекции
   groupBox1.Controls.Clear();
   
   //Добавляем первую надпись
   Label lbl1 = new Label();
   lbl1.Location = new System.Drawing.Point(16, 32);
   lbl1.Name = "labelfirst";
   lbl1.Size = new System.Drawing.Size(48, 23);
   lbl1.TabIndex = 4;
   lbl1.Text = "Name";
   groupBox1.Controls.Add(lbl1);
   
   //Добавляем вторую надпись
   Label lbl2 = new Label();
   lbl2.Location = new System.Drawing.Point(16, 64);
   lbl2.Name = "labelsecond";
   lbl2.Size = new System.Drawing.Size(40, 23);
   lbl2.TabIndex = 3;
   lbl2.Text = "PIN";
   groupBox1.Controls.Add(lbl2);

   //Добавляем первое текстовое поле
   TextBox txt1 = new TextBox();
   txt1.Location = new System.Drawing.Point(96, 32);
   txt1.Name = "textBox1";
   txt1.Size = new System.Drawing.Size(184, 20);
   txt1.TabIndex = 0;
   txt1.Text = "";
   groupBox1.Controls.Add(txt1);

   //Добавляем  второе  текстовое поле
   TextBox txt2 = new TextBox();
   txt2.Location = new System.Drawing.Point(96, 64);
   txt2.Name = "textBox2";
   txt2.Size = new System.Drawing.Size(184, 20);
   txt2.TabIndex = 1;
   txt2.Text = "";
   groupBox1.Controls.Add(txt2);
 }
Листинг 3.2.

Запускаем приложение. При выборе переключателя cо значением свойства Text "Полная" снова появляются дополнительные элементы (рис. 3.4):

Результат запуска приложения RegistrationForm

Рис. 3.4. Результат запуска приложения RegistrationForm

На диске, прилагаемом к книге, вы найдете приложение RegistrationForm (Code\Glava3\ RegistrationForm).

Удаление заданного элемента в режиме работы приложения

В рассмотренном выше примере мы удаляли всю коллекцию элементов. Рассмотрим более сложный пример — удаление добавленного элемента по щелчку правой кнопкой мыши на нем. Создайте новое приложение и назовите его AddRemoveControls. Устанавливаем свойству AutoScroll формы значение True для возможности прокрутки формы. Добавляем на форму кнопку и помещаем ее в верхний левый угол формы. В поле свойства Text кнопки вводим Clone. Переходим в обработчик кнопки:

private void button1_Click(object sender, System.EventArgs e)
{
  //Создаем экземпляр btn класса Button
  Button btn = new Button();
  //Определяем количество элементов управления
  Control prev = (Control)this.Controls[this.Controls.Count-1];
  //Устанавливаем позицию добавляемых кнопок
  int x1 = prev.Location.X;
  int y1 = prev.Location.Y;
  int height = prev.Height;
  int width = prev.Width;
  btn.Location = new Point(x1+ width+5, y1 + height +5);
  btn.Width = prev.Width;
  btn.Height = prev.Height;
  //Добавляем событие для новой кнопки и обработчик button1_Click
  btn.Click+= new EventHandler(button1_Click);
  //Устанавливаем свойство Text кнопки
  btn.Text = "Clone";
  //Добавляем экземпляр в коллекцию
  this.Controls.Add(btn);
  //Определяем обработчик для события MouseUp экземпляра кнопки btn
  btn.MouseUp+= new MouseEventHandler(button1_MouseUp);
}

Переключаемся в режим дизайна формы, выделяем кнопку, в окне Properties нажимаем на кнопку событийКнопка(Events) и дважды щелкаем в поле события MouseUp:

private void button1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
  if(e.Button==MouseButtons.Right)
  {
 //Удаляем данную кнопку
 this.Controls.Remove((Control)sender);
  }
}

Запускаем приложение. При щелчке левой кнопкой мыши на любой из кнопок добавляется еще одна, а при щелчке правой кнопкой мыши на заданной кнопке она исчезает (рис. 3.5):

Результат запуска приложения AddRemoveControls

Рис. 3.5. Результат запуска приложения AddRemoveControls

На диске, прилагаемом к книге, вы найдете приложение AddRemoveControls (Code\Glava3\ AddRemoveControls).

Елена Дьяконова
Елена Дьяконова

При нажатии на Сумма в примере ArbitraryMethod из Лекция 7, VS 2013 выдается ошибка: 

Необработанное исключение типа "System.InvalidOperationException" в System.Windows.Forms.dll

Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "lblResult" не из того потока, в котором он был создан.

Затем:

Необработанное исключение типа "System.InvalidOperationException" в mscorlib.dll

Дополнительные сведения: Для каждой асинхронной операции метод EndInvoke может вызываться только один раз.

Александр Сороколет
Александр Сороколет

Свойство WindowState формы blank Maximized. Не открывается почемуто на всё окно, а вот если последующую форму бланк открыть уже на макс открывается :-/