При нажатии на Сумма в примере ArbitraryMethod из Лекция 7, VS 2013 выдается ошибка: Необработанное исключение типа "System.InvalidOperationException" в System.Windows.Forms.dll Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "lblResult" не из того потока, в котором он был создан. Затем: Необработанное исключение типа "System.InvalidOperationException" в mscorlib.dll Дополнительные сведения: Для каждой асинхронной операции метод EndInvoke может вызываться только один раз. |
Работа с элементами управления (продолжение)
Добавление пунктов контекстного меню в режиме запуска приложения. Элемент управления ComboBox
В зависимости от различных событий, происходящих на форме, содержание контекстного меню может меняться. Создайте новое приложение и назовите его MenuRunTime. Добавляем на форму элемент управления GroupBox (контейнер) и размещаем внутри него две надписи, текстовое поле, кнопку, ComboBox (выпадающий список) (см. рис. 3.6).
Устанавливаем следующие свойства кнопки, текстового поля и выпадающего списка:
Добавляем на форму элементы управления ContextMenu и ColorDialog. Свойству СontextMenu формы Form1 устанавливаем значение добавленного контекстного меню — сontextMenu1. Вводим пункты контекстного меню:
В обработчике пункта меню 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).
Добавление пунктов главного меню в режиме работы приложения ничем не отличается от рассмотренного – если бы мы поместили на форму главное меню, предпоследняя строчка обработчика кнопки btnAdd приняла бы вид:
//Добавляем пункт в главное меню mainMenu1 mainMenu1.MenuItems.Add(mnu);
На диске, прилагаемом к книге, вы найдете приложение MenuRunTime (Code\Glava3\MenuRunTime).