Свойство TabIndex элементов управления




Сохранение файла при закрытии формы

 

Всякий раз, когда мы закрываем документ Microsoft Word, в который внесли изменения, появляется окно предупреждения, предлагающее сохранить документ. Добавим аналогичную функцию в наше приложение. В классе blank: System.Windows.Forms.Form формы blankсоздаем переменную, которая будет фиксировать сохранение документа:

public bool IsSaved = false;

В обработчик методов Save и Save As формы frmmain добавляем изменение значения этой переменной:

private void mnuSave_Click(object sender, System.EventArgs e){ … frm.IsSaved = true;} private void mnuSaveAs_Click(object sender, System.EventArgs e){ … frm.IsSaved = true;}

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

private void blank_Closing(object sender, System.ComponentModel.CancelEventArgs e){ //Если переменная IsSaved имеет значение true, т. е. новый документ //был сохранен (Save As) или в открытом документе были сохранены изменения (Save), //то выполняется условие if(IsSaved ==true) //Появляется диалоговое окно, предлагающее сохранить документ. if(MessageBox.Show("Do you want save changes in " + this.DocName + "?", "Message", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) //Если была нажата кнопка Yes, вызываем метод Save { this.Save(this.DocName); } }

Запускаем приложение. При закрытии формы blank или frmmain появляется окно предупреждения (рис. 2.17):

Рис. 2.17. Окно предупреждения при закрытии формы

FontDialog

 

Продолжим работу над приложением Notepad C#. Добавим теперь возможность выбирать шрифт, его размер и начертание. В режиме дизайна перетащим на форму frmmain из окна ToolBox элемент управления FontDialog. Не изменяя ничего в свойствах этого элемента, переходим в обработчик пункта Font главного меню:

private void mnuFont_Click(object sender, System.EventArgs e){ //Переключаем фокус на данную форму. blank frm = (blank)this.ActiveMdiChild; //Указываем, что родительской формой является форма frmmain frm.MdiParent = this; //Вызываем диалог fontDialog1.ShowColor = true; //Связываем свойства SelectionFont и SelectionColor элемента RichTextBox //с соответствующими свойствами диалога fontDialog1.Font = frm.richTextBox1.SelectionFont; fontDialog1.Color = frm.richTextBox1.SelectionColor; //Если выбран диалог открытия файла, выполняем условие if (fontDialog1.ShowDialog() == DialogResult.OK) { frm.richTextBox1.SelectionFont = fontDialog1.Font; frm.richTextBox1.SelectionColor = fontDialog1.Color; } //Показываем форму frm.Show();}

Запускаем приложение, и в окне Output появляется список ошибок (рис. 2.18).

Рис. 2.18. Список ошибок — NotepadCSharp.blank.richTextBox1 недоступен из-за своего уровня защиты

 

В чем же дело? При расположении на форме blank элемента управления RichTextBox среда Visual Studio.NET сгенерировала экземплярrichTextBox1 класса System.Windows.Forms.RichTextBox с модификатором доступа private, из-за чего при обращении к нему и возникает исключение:

private System.Windows.Forms.RichTextBox richTextBox1;

Изменим модификатор на public и снова запустим приложение. При выборе пункта меню Font теперь можно менять параметры текущего текста.

 

ColorDialog

 

Диалоговое окно FontDialog содержит список цветов, которые могут быть применены к тексту, но предлагаемый список ограничен. Более интересной представляется возможность назначать пользовательский цвет, который может быть определен в большом диапазоне (рис. 2.19):

Рис. 2.19. Диалоговое окно ColorDialog

 

Из окна ToolBox добавляем элемент управления ColorDialog и, вновь не изменяя его свойств, переходим к обработчику пункта Color главного меню формы frmmain:

private void mnuColor_Click(object sender, System.EventArgs e){ blank frm = (blank)this.ActiveMdiChild; frm.MdiParent = this; colorDialog1.Color = frm.richTextBox1.SelectionColor; if (colorDialog1.ShowDialog() == DialogResult.OK) { frm.richTextBox1.SelectionColor = colorDialog1.Color; } frm.Show();}

Обратите внимание на то, что код для ColorDialog в точности такой же, как и часть кода для свойства Color диалога FontDialog. Это и не удивительно: ведь мы связываем эти диалоги со свойствами одного и того же объекта — RichTextBox.

 

StatusBar

Элемент управления StatusBar применяется в программах для вывода информации в строку состояния — небольшую полоску, расположенную внизу приложения. В Microsoft Word, например, на ней отображается количество страниц, язык ввода, состояние проверки правописания и другие параметры. Добавим к приложению Notepad C# строку состояния, на которой осуществляется подсчет вводимых символов и выводится системное время.

Добавляем на форму blank элемент управления StatusBar. Удаляем содержимое поля свойства Text. В поле свойства Panels щелкаем на кнопку (…). Открывается StatusBarCollectionEditor, в котором мы создаем панели для отображения. Создайте две панели, дважды щелкая на кнопке Add, и установите им следующие свойства (измененные значения выделяются жирным шрифтом) (рис. 2.20 и рис. 2.21):

 

Рис. 2.20. Свойства панели sbAmount

Рис. 2.21. Свойства панели sbTime

 

Значения некоторых свойств панели приводятся в таблице 2.2.

Таблица 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), при необходимости для вывода времени в привычном правом нижнем углу можно добавить третью пустую панель.

Рис. 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:

Рис. 2.23. Форма FindForm в режиме дизайна

 

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

TextBox, свойство Значение
Name txtFind
Size 192; 20
Text  
checkBox1, свойство Значение
Name cbMatchCase
Text Match &Case
       

 

checkBox2, свойство Значение
Name cbMatchWhole
Text Match &whole word
button1, свойство Значение
Name btnOK
DialogResult OK
Text &OK
       

 

button2, свойство Значение
Name btnCancel
DialogResult Cancel
Text &Cancel

 

Выбор первого чекбокса — 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:

// Создаем перечисление, возвращающее параметр FindConditionpublic 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; }}

И наконец, создаем свойство FindText, возвращающее в качестве переменной поиска введенный текст в текстовое поле формы FindForm:

public string FindText{ get{return txtFind.Text;} set{txtFind.Text = value;}}

Запускаем приложение. Выбирая различные варианты, можно однократно искать заданное слово (рис. 2.25):

Рис. 2.25. Поиск слова в тексте

Свойство TabIndex элементов управления

 

Многие пользователи предпочитают работать по большей части с клавиатурой и прибегать к помощи мыши только там, где без нее нельзя обойтись. При работе с формой Find было бы удобно ввести слово в текстовое поле, затем, нажав клавишу Tab и Enter, осуществить поиск, — или, дважды нажав клавишу Tab, переключить фокус ввода на чекбокс Match Case. Для этого в режиме дизайна формы Find следует установить свойство TabIndex элементов управления в виде последовательной нумерации, начиная с нуля:

Элемент управления TabIndex
TxtFind  
BtnOK  
CbMatchCase  
CbMatchWhole  
BtnCancel  

 

При такой нумерации фокус ввода будет последовательно переходить в порядке возрастания — от элемента txtFind до btnCancel. Свойство TabIndex имеет особенно большое значение при создании ряда текстовых полей, где пользователю будет предлагаться ввести информацию.

Задание



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-12-18 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: