|
При нажатии на Сумма в примере ArbitraryMethod из Лекция 7, VS 2013 выдается ошибка: Необработанное исключение типа "System.InvalidOperationException" в System.Windows.Forms.dll Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "lblResult" не из того потока, в котором он был создан. Затем: Необработанное исключение типа "System.InvalidOperationException" в mscorlib.dll Дополнительные сведения: Для каждой асинхронной операции метод EndInvoke может вызываться только один раз. |
Работа с элементами управления
StatusBar
Элемент управления StatusBar применяется в программах для вывода информации в строку состояния — небольшую полоску, расположенную внизу приложения. В Microsoft Word, например, на ней отображается количество страниц, язык ввода, состояние проверки правописания и другие параметры. Добавим к приложению Notepad C# строку состояния, на которой осуществляется подсчет вводимых символов и выводится системное время.
Добавляем на форму blank элемент управления StatusBar. Удаляем содержимое поля свойства Text. В поле свойства Panels щелкаем на кнопку (…). Открывается StatusBarCollectionEditor, в котором мы создаем панели для отображения. Создайте две панели, дважды щелкая на кнопке Add, и установите им следующие свойства (измененные значения выделяются жирным шрифтом) (рис. 2.20 и рис. 2.21):
Значения некоторых свойств панели приводятся в таблице 2.2.
| Свойство | Значение |
|---|---|
| Alignment | Выравнивание содержимого свойства Text на панели |
| AutoSize | Изменение размеров панели по содержимому |
| BorderStyle | Внешний вид панели – утопленная, приподнятая или без выделения |
| Icon | Добавление иконки |
| Style | Стиль панели |
| Text | Текст, располагаемый на панели |
| ToolTipText | Всплывающая подсказка — появляется при наведении курсора на панель |
| Width | Ширина панели в пикселях |
| Name | Название панели для обращения к ней в коде |
Свойства панели, назначаемые в окне редактора StatusBarCollectionEditor, можно изменять в коде —именно так мы сейчас и поступим.
После завершения работы над панелями закрываем редактор. Свойству ShowPanels элемента управления StatusBar устанавливаем значение True. На форме немедленно отображаются две панели.
Выделяем элемент управления RichTextBox, в окне его свойств переключаемся на события и создаем обработчик для события TextChanged:
private void richTextBox1_TextChanged(object sender, System.EventArgs e)
{
//Свойству Text панели sbAmount устанавливаем надпись "Аmount of symbols"
//и длину текста в RichTextBox.
sbAmount.Text = "Аmount of symbols" + richTextBox1.Text.Length.ToString();
}Свойство Text панели sbAmount мы изменяем программно: даже если бы мы ничего не написали в окне редактора StatusBarCollectionEditor, при возникновении события TextChanged на панели появится надпись.
Займемся теперь второй панелью — той, на которую будем выводить системное время. В конструкторе формы blank добавляем код:
public blank()
{
InitializeComponent();
//Свойству Text панели sbTime устанавливаем системное время,
// конвертировав его в тип String
sbTime.Text = Convert.ToString(System.DateTime.Now.ToLongTimeString());
//В тексте всплывающей подсказки выводим текущую дату
sbTime.ToolTipText = Convert.ToString(System.DateTime.Today.ToLongDateString());
}Запускаем приложение. Панель с выводимым временем располагается достаточно необычно (рис. 2.22), при необходимости для вывода времени в привычном правом нижнем углу можно добавить третью пустую панель.
Закрывание формы
При запуске приложения Notepad С# на форме имеются три стандартные кнопки — "Свернуть", "Развернуть" и "Закрыть". Большинство пользователей предпочитают использовать именно кнопку "Закрыть" для выхода из приложения. Тем не менее принято дублировать кнопку формы пунктом меню Exit. В обработчике этой кнопки добавляем код
private void mnuExit_Click(object sender, System.EventArgs e)
{
this.Close();
}Метод Close закрывает форму и может быть назначен другим элементам управления — например, кнопке.
CheckBox
Чекбоксы относятся к так называемым кнопкам отложенного действия, т. е. их нажатие не запускает немедленно какого-либо процесса. С их помощью пользователь устанавливает определенные параметры, результат действия которых скажется после запуска других элементов управления. Добавим в приложение Notepad C# форму для поиска заданного текста, в которой будут использованы элементы управления CheckBox. В окне Solution Explorer щелкаем правой кнопкой мыши на названии проекта — NotepadCSharp — и в появившемся меню выбираем пункт Add Windows Form. Называем новую форму FindForm.cs и устанавливаем следующие свойства:
| FindForm, форма, свойство | Значение |
|---|---|
| Name | FindForm |
| FormBorderStyle | FixedToolWindow |
| Size | 328; 112 |
| Text | Find |
Располагаем на форме TextBox, две кнопки и два элемента CheckBox так, как показано на рис. рис. 2.23:
Устанавливаем следующие свойства элементам управления:
Выбор первого чекбокса — cbMatchCase — будет устанавливать поиск слова с учетом регистра, второго – cbMatchWhole — поиск по целому слову. Обратите внимание на свойство кнопок DialogResult — выбирая соответствующие свойства, мы устанавливаем обработчики для кнопок без обращения к коду. Значение ОК закрывает форму, выполняя установленное действие, — в данном случае — поиск; значение Cancel просто закрывает форму. В главном меню формы frmmain добавляем разделительную линию и пункт Find и устанавливаем значения свойств: Name — mnuFind, Shortcut — CtrlF, Text — &Find. Переходим в обработчик этого пункта:
private void mnuFind_Click(object sender, System.EventArgs e)
{
//Создаем новый экземпляр формы FindForm
FindForm frm = new FindForm();
//Если выбран результат DialogResult.Cancel, закрываем форму (до этого
//мы использовали DialogResult.OK)
if(frm.ShowDialog(this) == DialogResult.Cancel) return;
////Переключаем фокус на данную форму.
blank form = (blank)this.ActiveMdiChild;
////Указываем, что родительской формой является форма frmmain
form.MdiParent = this;
//Вводим переменную для поиска в определенной части текста —
//поиск слова будет осуществляться от текущей позиции курсора
int start = form.richTextBox1.SelectionStart;
//Вызываем предопределенный метод Find элемента richTextBox1.
form.richTextBox1.Find(frm.FindText, start, frm.FindCondition);
}Основой поиска будет метод Find элемента управления RichTextBox. Нам остается лишь указать параметры поиска, которые могут принимать различные значения (рис. 2.24):

Рис. 2.24. Параметры метода Find. Щелкая на маленькую кнопку всплывающей подсказки Intel Sense, выбираем разные подсказки для групп передаваемых параметров
В коде формы FindForm осталось реализовать логику работы, зависящую от положения элементов CheckBox:
// Создаем перечисление, возвращающее параметр FindCondition
public RichTextBoxFinds FindCondition
{
get
{
//Выбраны два чекбокса
if (cbMatchCase.Checked && cbMatchWhole.Checked)
{
// Возвращаем свойство MatchCase и WholeWord
return RichTextBoxFinds.MatchCase| RichTextBoxFinds.WholeWord;
}
//Выбран один чекбокс
if (cbMatchCase.Checked )
{
// Возвращаем свойство MatchCase
return RichTextBoxFinds.MatchCase;
}
//Выбран другой чекбокс
if (cbMatchWhole.Checked )
{
// Возвращаем свойство WholeWord
return RichTextBoxFinds.WholeWord;
}
//Не выбран ни один чекбокс
return RichTextBoxFinds.None;
}
}
Листинг
2.11.
И наконец, создаем свойство FindText, возвращающее в качестве переменной поиска введенный текст в текстовое поле формы FindForm:
public string FindText
{
get{return txtFind.Text;}
set{txtFind.Text = value;}
}Запускаем приложение. Выбирая различные варианты, можно однократно искать заданное слово (рис. 2.25):
Свойство TabIndex элементов управления
Многие пользователи предпочитают работать по большей части с клавиатурой и прибегать к помощи мыши только там, где без нее нельзя обойтись. При работе с формой Find было бы удобно ввести слово в текстовое поле, затем, нажав клавишу Tab и Enter, осуществить поиск, — или, дважды нажав клавишу Tab, переключить фокус ввода на чекбокс Match Case. Для этого в режиме дизайна формы Find следует установить свойство TabIndex элементов управления в виде последовательной нумерации, начиная с нуля:
При такой нумерации фокус ввода будет последовательно переходить в порядке возрастания — от элемента txtFind до btnCancel. Свойство TabIndex имеет особенно большое значение при создании ряда текстовых полей, где пользователю будет предлагаться ввести информацию.





