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

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

Добавление пунктов контекстного меню в режиме запуска приложения. Элемент управления ComboBox

В зависимости от различных событий, происходящих на форме, содержание контекстного меню может меняться. Создайте новое приложение и назовите его MenuRunTime. Добавляем на форму элемент управления GroupBox (контейнер) и размещаем внутри него две надписи, текстовое поле, кнопку, ComboBox (выпадающий список) (см. рис. 3.6).

Приложение MenuRunTime в режиме дизайна

Рис. 3.6. Приложение MenuRunTime в режиме дизайна

Устанавливаем следующие свойства кнопки, текстового поля и выпадающего списка:

textBox1, свойство Значение
Name txtMenuText
Text
comboBox1, свойство Значение
Name cmbShortCuts
Text
button1, свойство Значение
Name btnAdd
Text Добавить

Добавляем на форму элементы управления ContextMenu и ColorDialog. Свойству СontextMenu формы Form1 устанавливаем значение добавленного контекстного меню — сontextMenu1. Вводим пункты контекстного меню:

Name Text Shortcut
mnuChangeColor Изменить цвет CtrlG
mnuExit Выход AltF4

В обработчике пункта меню mnuChangeColor вызываем диалог colorDialog1 и присваиваем выбранное значение цвета фоновому цвету формы:

private void mnuChangeColor_Click(object sender, System.EventArgs e)
{
  if(colorDialog1.ShowDialog()==DialogResult.OK)
  {
 this.BackColor =colorDialog1.Color;
  }
}

В обработчике пункта меню "Выход" просто закрываем форму:

private void mnuExit_Click(object sender, System.EventArgs e)
{
  this.Close();
}

Элемент ComboBox обычно заполняется значениями в режиме дизайна — для этого используется его свойство Items. Однако в нашем примере при загрузке формы мы заполним его всеми значениями сочетаний клавиш, поддерживаемых средой CLR:

private void Form1_Load(object sender, System.EventArgs e)
{
  object[] sc = new object[Enum.GetValues(typeof (Shortcut)).Length];
  Enum.GetValues(typeof(Shortcut)).CopyTo(sc,0);
  cmbShortCuts.Items.AddRange(sc);
}

В обработчике кнопки btnAdd будет создаваться новый пункт меню и добавляться в контекстное меню сontextMenu1:

private void btnAdd_Click(object sender, System.EventArgs e)
{
   //Если значение текстового поля пустое, выводим сообщение
   if(txtMenuText.Text=="")
   {
     //Текст сообщения
     MessageBox.Show("Введите текст для пункта меню");
     return;
   }
    //Если не выбрано значение сочетания клавиш, выводим сообщение
    if(cmbShortCuts.SelectedItem==null)
   {
      //Текст сообщения
     MessageBox.Show("Выберите сочетание клавиш");
     return;

   }
   //Создаем новый экземпляр mnu класса пунктов  меню MenuItem
   MenuItem mnu = new MenuItem();
   //Устанавливаем в качестве текста пункта значение, введенное в txtMenuText
   mnu.Text = txtMenuText.Text;
   //Устанавливаем в качестве сочетания клавиш данного пункта 
   //выбранное значение из cmbShortCuts
   mnu.Shortcut=(Shortcut)cmbShortCuts.SelectedItem;
   //Добавляем пункт в контекстное меню contextMenu1
   contextMenu1.MenuItems.Add(mnu);
   //Определяем обработчик для события Click экземпляра  mnu
   mnu.Click += new System.EventHandler(this.NewmnuChangeColor_Click);
    }
Листинг 3.3.

В обработчике нового пункта снова будем вызывать диалог colorDialog1:

//Обработчик события Click экземпляра mnu
private void NewmnuChangeColor_Click(object sender, System.EventArgs e)
{
  if(colorDialog1.ShowDialog()==DialogResult.OK)
  {
 this.BackColor =colorDialog1.Color;
  }
}

Запускаем приложение. Цвет формы можно изменить, выбрав соответствующий пункт меню или используя сочетание клавиш Ctrl+G (рис. 3.7). После введения текста пункта, выбора ярлыка и нажатия кнопки "Добавить" новый пункт доступен в меню (рис. 3.8).

Контекстное меню приложения MenuRunTime

Рис. 3.7. Контекстное меню приложения MenuRunTime
Новый пункт "Снова изменить цвет" в контекстном меню

Рис. 3.8. Новый пункт "Снова изменить цвет" в контекстном меню

Добавление пунктов главного меню в режиме работы приложения ничем не отличается от рассмотренного – если бы мы поместили на форму главное меню, предпоследняя строчка обработчика кнопки btnAdd приняла бы вид:

//Добавляем пункт в главное меню mainMenu1
mainMenu1.MenuItems.Add(mnu);

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

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

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

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

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

Затем:

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

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

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

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