Опубликован: 11.09.2006 | Доступ: свободный | Студентов: 7646 / 472 | Оценка: 4.26 / 3.45 | Длительность: 30:46:00
ISBN: 978-5-9556-0080-2
Лекция 2:

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

StatusBar

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

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

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

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

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

Форма FindForm в режиме дизайна

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

Параметры метода Find. Щелкая на маленькую кнопку всплывающей подсказки Intel Sense, выбираем разные подсказки для групп передаваемых параметров

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

Поиск слова в тексте

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

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

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

Элемент управления TabIndex
TxtFind 0
BtnOK 1
CbMatchCase 2
CbMatchWhole 3
BtnCancel 4

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

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

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

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

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

Затем:

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

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

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

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