Лекция № 2.

Тема: «Построение приложений Windows Form. Формы, текстовые поля, кнопки»

 

План

1. Работа с формами.

2.  Диалоговые сообщения в программах.

3. Текстовые метки.

4. Текстовые поля.

5. Кнопки.

 

1. Работа с формами

Каждое WinForm приложение основано на использовании как минимум одной формы, на которой располагаются нужные визуальные компоненты. При создании нового проекта автоматически создается одна форма с именем Form1, готовая для работы. На панели «Обозреватель решений» Вы увидите файл созданной формы Form1.cs, с помощью которого форму можно будет открыть дойным щелчков, если она окажется закрытой. В этом файле находится полное описание класса формы, включаю коды обработчиков всех событий.

Если раскрыть этот файл с помощью кнопки «+», то отобразятся еще два файла:

- Form1.Designer.cs – содержит информацию о внешнем виде самой формы, всех компонентах на ней, а также заголовки обработчиков событий. Если в файле формы Form1.cs удалить какой-то обработчик события, то при компиляции появится ошибка в файле Form1.Designer.cs. Вам придется удалить из этого файла заголовок удаленного ранее обработчика события;

- Form1.resx – содержит информацию о невидимых компонентах на форме.

Над формами в проекте можно выполнить такие операции:

- для добавления новой формы в контекстном меню проекта выберите команду «Добавить – Форма Windows». В новом окне укажите имя формы и подтвердите операцию;

- для добавления существующей формы из другого проекта в контекстном меню проекта выберите команду «Добавить – Существующий элемент». В окне диалога укажите файл нужной формы и подтвердите операцию. При этом имя добавляемой формы должно быть уникальным в проекте (именно поэтому рекомендуется задавать формам имена, отличные от стандартных);

- для удаления формы в контекстном меню файла формы выберите команду «Удалить» и подтвердите операцию.

Задание главной формы проекта

По умолчанию главной формой проекта является форма, создаваемая автоматически в новом проекте. Именно эта форма запускается первой. Однако, существуют задачи, в которых такую форму нужно заменить на другую. В этом случае двойным щелчком откройте файл Program.cs, найдите команду запуска программы вида:

 

Application.Run(new Form1());

 

И в качестве параметра метода Run укажите имя нужной формы. Например, сделаем главной форму Form2 (при условии, что она имеется в проекте):

 

Application.Run(new Form2());

 

Задание имени для главной формы проекта

Реальные программы могут включать в себя несколько форм, которые могут обмениваться данными между собой, в том числе обращаться к компонентам на других формах. Для этого необходимо, чтобы каждая форма имела уникальное в пределах проекта имя. Однако, с языке C# главная форма проекта имени не имеет (не путать имя файла Form1.cs с именем формы), что не позволяет другим формам обращаться к ее компонентам и другим элементам.

Для решения данной проблемы необходимо внести изменения в файл Program.cs. Например, главная форма проекта описана в классе Form1. Необходимо присвоить главной форме имя:

-          откройте код файла Program.cs и внутри класса Program опишите глобальную статическую переменную для главной формы:

 

static class Program

{

//описываем переменную form1 типа Form1

public static Form1 form1;

. . .

 

- вместо метода Application.Run(new Form1()) добавьте два оператора вида:

 

//создаем экземпляр класса главной формы

Program.form1=new Form1();

//запускаем приложение с указанием главной формы через созданную переменную

Application.Run(Program.form1);

 

После этих изменений главная форма проекта будет доступна по имени Program.form1.

 

Свойства формы

На панели «Свойства» отображаются свойства выделенной формы. В нижней части этой панели можно прочитать краткое описание назначение выделенного свойства. Рассмотрим некоторые из них:

 

Свойство

Описание

Name

Имя формы. Рекомендуется задавать уникальные имена для возможности повторного использования форм в новых проектах

AcceptButton

Задает имя кнопки, которая будет срабатывать при нажатии на Enter

AutoScroll

Включает появление полос прокрутки, если данные на форме не помещаются

BackColor

Цвет фона формы

BackgroundImage

Задает фоновое изображение для формы

BackgroundImageLayout

Задает тип заполнения формы фоновым изображением (растягивание Stretch, масштабирование Zoom, мозаика Tile)

CancelButton

Задает имя кнопки, которая будет срабатывать при нажатии на Escape

ControlBox

Включает отображение системной иконки в заголовке формы

Font

Параметры шрифта на форме

ForeColor

Цвет шрифта на форме

FormBorderStyle

Тип границы окна (обычный Sizable, фиксированный FixedSingle, диалоговое окно FixedDialog)

Height

Высота формы

Left

Отступ формы от левого края экран

Location

Задает положение формы на экране. Включает в себя два подсвойства: Left и Top. Для задания свойства можно использовать команду:

Location = new Point(X,Y);

Icon

Иконка для системного меню в заголовке формы

MaximizeBox

Отображает кнопку разворачивания формы на весь экран

MaximumSize

Допустимый максимальный размер формы по ширине и высоте

MinimizeBox

Отображает кнопку сворачивания формы

MaximumSize

Допустимый минимальный размер формы по ширине и высоте

Opacity

Прозрачность формы (0% - невидимая, 100% - непрозрачная)

ShowInTaskbar

Включает отображение формы в панели задач

Size

Задает размер фомы по ширине и высоте. Включает в себя два подствойства: Width и Height. Для задания свойства можно использовать команду:

Size = new Size(ширина, высота);

StartPosition

Положение формы на экране при запуске

Text

Текст заголовка формы

Top

Отступ формы от верхнего края формы

TopMost

Включает отображение формы поверх остальных окон

TransparencyKey

Задает цвет, который будет невидим на форме. На месте этого цвета на форме буду «отверстия»

Width

Ширина формы

WindowState

Состояние окна формы при запуске (свернутое, обычное, развернутое)

 

Каждое свойство можно задавать как при проектировании формы на панели «Свойства», так и при написании кода.

Например:

 

Text="Моя форма"; //задали текст заголовка формы

Width=800; //задали ширину формы

 

При этом некоторые свойства могут принимать значения из заранее заданного набора. В этом случае существует правило, при котором при наборе в коде некоторого свойства в окне подсказок Вы видите тип этого свойства. После чего после оператора присваивания указываете имя этого типа и через точку выбираете нужное значение для присваивания.

Например, зададим значение для свойства StartPosition/

-          набираем в коде имя нужного свойства и видим в окне описания тип этого свойства FormStartPosition

- после оператора присваивания указываем имя типа, а через точку выбираем в окне подсказки нужное значение

События формы

События позволяют реализовать в приложении большое число функций в виде ответной реакции на действия пользователей или самого приложения. Форма имеет большое число событий, список которых можно просмотреть на панели «Свойства» после щелчка на кнопке панели инструментов «События». Как и при работе со свойствами в нижней части панели можно просмотреть краткое описание выбранного события.

Наиболее используемыми событиями являются:

 

Событие

Описание

Activated

Возникает каждый раз, когда окно формы становится активным

Click

Возникает при щелчке мышью на свободном месте формы

DoubleClick

Возникает при двойном щелчке мышью на свободном месте формы

FormClosed

Возникает после закрытия формы

FormClosing

Возникает при закрытии формы, перед событием FormClosed. В этом событии можно выдать запрос на сохранение изменений или на выход из программы. Можно отменить закрытие формы

Load

Загрузка формы в память до появления на экране. Служит для задания начальных параметров, инициализации глобальных переменных, подключения БД и т.п.

Move

Возникает при перемещении формы по экрану

Resize

Возникает при изменении размера формы

Scroll

Возникает при скролинге содержимого формы

Shown

Возникает при первом отображении формы на экране

 

Для каждого из событий можно написать код, который будет выполняться при наступлении этого события. Такой код называется «обработчиком события». Для создания обработчика нужного события найдите событие в списке и выполните двойной щелчок напротив его имени в колонке справа. В результате Вы будете перемещены в окно редактора кода, где автоматически будет вставлен шаблон подпрограммы выбранного события. Вам остается только написать код внутри этого шаблона.

 

Методы формы

Методы – это действия, которые можно выполнить над экземплярами класса, в данном случае над формой. При вызове метода обязательно в круглых скобках указывается список входных параметров. Если список параметров отсутствует, то указываются пустые круглые скобки.

Среди наиболее используемых методов формы выделяют такие:

- имя_формы.Show(); - отображает форму на экране

- имя_формы.ShowDialog(); - отображает форму на экране в модальном режиме

- имя_формы.Close(); - закрывает форму

- имя_формы.Hide(); - скрывает форму с экрана, оставляя ее в памяти

- имя_формы.Dispose(); - удаляет форму из памяти.

 

Методы Close(), Hide(), Dispose() могут вызываться без указания имени формы. В этом случае они применяются к текущей форме, из который они вызваны.

Несмотря на то, что в проекте может быть создано несколько форм, тем не менее к ним нельзя обращаться в коде, пока их экземпляры не буду созданы в памяти и не присвоены переменным. Например, пусть в проекте имеется форма Form2. Для ее открытия нужно использовать код:

 

//создаем экземпляр формы Form2 и записываем в переменную form2

Form2 form2 = new Form2();

//через переменную отображаем созданную форму на экране

form2.Show();

//в дальнейшем все операции с формой Вы выполняете через переменную form2

  

2.  Диалоговые сообщения в программах.

Диалоговые сообщения используются в программах для решения следующих задач:

- для информирования пользователя о работе программы;

- для выдачи сообщение об ошибках и/или о путях решения;

- для выдачи запросов на подтверждение выполнения операций (удаление, сохранение изменений, закрытия и т.п.).

Каждое диалоговое окно открывается в модальном режиме, и программа приостанавливает свою работу, пока пользователь не закроет диалог.

Для отображения диалоговых сообщений используют метод Show() класса MessageBox, который может быть вызван в разных вариациях:

//самый простой вариант. Диалог отображает указанный текст. Заголовок диалога пустой. Внутри одна кнопка ОК.

MessageBox.Show("текст");

MessageBox.Show("Привет всем!");

 

 

//вариант с заданием текста сообщения и текста заголовка окна

MessageBox.Show("текст", "заголовок");

MessageBox.Show("Привет всем!", "Приветствие");

 

 

//вариант с заданием текста сообщения, текста заголовка окна и набором кнопок

MessageBox.Show("текст", "заголовок",

                набор кнопок MessageBoxButtons);

//тип MessageBoxButtons содержит перечень разных сочетаний кнопок.

//Введите название типа, поставьте точку и из выпадающего списка

//выберите нужные кнопки.

//В нашем случае мы указали кнопки ОК/Отмена

MessageBox.Show("Привет всем!", "Приветствие",

                MessageBoxButtons.OKCancel);

 

 

 

 

//вариант с заданием текста сообщения, текста заголовка окна, набором кнопок и иконки

MessageBox.Show("текст", "заголовок",

                набор кнопок MessageBoxButtons,

  иконка MessageBoxIcon);

//тип MessageBoxIcon содержит перечень разных иконок.

//Введите название типа, поставьте точку и из выпадающего списка

//выберите нужную иконку.

//В нашем случае мы указали иконку информирования

MessageBox.Show("Привет всем!", "Приветствие",

                MessageBoxButtons.OKCancel,

  MessageBoxIcon.Information);

 

 

//пример диалога на подтверждение удаления данных

//с кнопками Да/Нет и иконкой вопроса

MessageBox.Show("Удалить выбранные данные?", "Подтвердите",

                MessageBoxButtons.YesNo,

                MessageBoxIcon.Question);

 

 

Если диалог требует несколько вариантов ответа (ОК/Отмена, Дает), то выбранный ответ находится в специальном типе DialogResult. Для обработки ответа использую оператор IF.

Например, выдадим диалог-запрос на подтверждение удаления данных и обратотаем ответ пользователя.

 

//если в диалоге пользователь ответил Да

if (MessageBox.Show("Удалить выбранные данные?", "Подтвердите",

                    MessageBoxButtons.YesNo,

                    MessageBoxIcon.Question)==DialogResult.Yes)

//проводим удаление данных

 

Приведем еще один пример, который при закрытии главной формы выдает запрос на выход из программы.

В событии FormClosing главной формы добавьте код вида:

 

private void Form1_FormClosing(object sender, FormClosingEventArgs e)

{

//если в ответ на запрос пользователь ответил "Нет"

if (MessageBox.Show("Выйти из программы?", "Подтвердите",

                     MessageBoxButtons.YesNo,

                     MessageBoxIcon.Question) == DialogResult.No)

//закрытие формы отменяется

e.Cancel = true;

}

 3. Текстовые метки

Для отображения информации, которую не нужно редактировать, целесообразно использовать текстовые метки (компонент Label).

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

 

Свойство

Описание

AutoEllipsis

Включает отображение во всплывающей подсказке текста надписи, который не помещается в компоненте по ширине

AutoSize

Включает автоматическую подгонку ширины компонента под длину текста

BackColor

Цвет фона. При задании свойства на закладке «Интернет» можно указать прозрачный фон

Name

Имя компонента

Text

Текст, отображаемый в надписи. Допускается создание «горячего символа»

 

«Горячий» символ в свойстве Text – это произвольный символ, отображаемый на форме подчеркнутым. Если пользователь нажимает сочетание клавиш Alt+символ, то курсор переходит на связанный с меткой компонент.

Для создания «горячего» символа необходимо перед нужным символом поставить «&». Например, пусть в свойстве Text метки введен текст: Ра&ссчитать. В результате символ «с» будет подчеркнут, а нажатие Alt+c переведет курсор на связанный с меткой компонент.

Связанным компонентом для метки считается тот, который идет следующим в порядке размещения компонентов на форме. Такой порядок определяется порядком создания компонентов на форме. Если порядок Вас не устраивает, то для его изменения щелкните на панели инструментов на кнопке «Последовательность перехода». На рисунке показано как будет отображаться на форме принятый порядок перехода.

 

 

Видно, что метка label1 с номером 0 связана со вторым текстовым полем, так как у него следующий номер 1. А метка label2 с номером 2 связана с первым текстовым полем, так как у него следующий номер 4. Такая связь противоречит логике работы программы.

С помощью щелчков мыши можно изменить порядок на нужный.

 

 

Текст надписи можно задавать как при проектировании формы, так и в коде программы.

Например,

label1.Text="Первое число";

 

Обратите внимание, что свойство Text является строковым, поэтому перед присваиванием ему значений необходимо их всегда конвертировать в текст (см. следующий раздел лекции).

 

4. Текстовые поля

Если нужно информацию на форме не только отображать, а и давать пользователю возможность ее редактировать, то целесообразно использовать компонент TextBox.

Компонент имеет следующие основные свойства:

 

Свойство

Описание

Name

Имя компонента

AcceptReturn

Включает возможность перехода на новый абзац клавишей Enter при редактировании многострочного текстового поля

AcceptTab

Включает возможность создания отступа первой строки абзаца клавишей Tab при редактировании многострочного текстового поля

BackColor

Цвет фона

Lines

Массив строк в многострочном текстовом поле

MaxLength

Максимальная длина текста в поле

Multiline

Включает признак многострочного текстового поля

PasswordChar

Задаем символ для маскировки вводимого текста. Например, для ввода пароля указывают символ «*»

ReadOnly

Включает для поля признак «только чтение». Поле нельзя будет редактировать

ScrollBars

Задает полосы прокрутки, отображаемые в поле

Text

Текущее содержимое текстового поля

TextAlign

Выравнивание текста в поле

WordWrap

Включает автоматические перевод курсора на следующую строку при вводе в многострочное текстовое поле

 

Как и в метках, содержимое текстовых полей хранится в свойстве Text в текстовом формате. Если в поле вводится число и его планируется использовать для вычислений, то необходимо конвертировать текст в число. Если результат вычислений в виде числа нужно показать в поле, то нужно выполнить обратное конвертирование: из числа в текст.\

Для конвертирования данных в C# имеется специальный класс Convert, который имеет множество методов. Например:

 

Convert.ToDouble(значение) – конвертирует значение в вещественное число

Convert.Int16(значение), Convert.Int32(значение), Convert.Int64(значение) – конвертирует значение в целое число

Convert.ToString(значение) – конвертирует значение в текст.

 

 Vетод конвертирования в текст используется редко, так как любой объект (свойство, переменная) имеют свой собственный метод ToString() для конвертирования значения в текст.

Например:

 

//пусть имеется переменная вещественного типа

double a;

a=12.45;

//конвертируем переменную в текст и присвоим метке label1

label1.Text=Convert.ToString(a);

//или запись проще

label1.Text=a.ToString();

События текстового поля

При работе с текстовым полем наиболее часто используют такие события:

- Enter – установка курсора в поле;

- Leave – курсор уходит из поля;

- TextChanged – изменилось содержимое поля (как ввод символов, так и их удаление)

 

Вычисление функций в C#

Для вычисления функций в C# имеется специальный класс Math, который содержит большое число методов, предназначенных для расчетов. Например:

 

Math.Sin(значение)синус числа

Math.Round(значение, n) – округление до n знаков

Math.Pow(a,b) – аb и т.д.

 

Создание всплывающих подсказок

Использование всплывающих подсказок является правилом хорошего тона при проектировании форм, так как позволяет пользователю быстро получить подсказку о назначении разных компонентов на форме. Для создания всплывающих подсказок нанесите вначале на форму невидимый компонент ToolTip и задайте для него свойства: Active = true, ShowAlways = true, AutomaticDelay - интервал появления подсказки в мс, AutoPopDelay   - интервал отображения подсказки в мс.

После этого у каждого компонента на форме появится новое свойство ToolTip, в котором можно указать текст всплывающей подсказки.

 

5. Кнопки

Выполнение нужных функций в программе происходит при наступлении некоторых событий, определенных разработчиком. Одним из распространенных способов выполнить нужную функцию является щелчок пользователя на кнопках. Кнопка создается с помощью компонента Button и имеет следующие свойства:

 

Свойство

Описание

Name

Имя компонента

BackColor

Цвет фона формы

BackgroundImage

Задает фоновое изображение для кнопки

BackgroundImageLayout

Задает тип заполнения кнопки фоновым изображением (растягивание Stretch, масштабирование Zoom, мозаика Tile)

DialogResult

Задает значение, которое вернет кнопка, если она размещена на модальной форме

Image

Задает иконку для кнопки

ImageAlign

Задает выравнивание иконки на кнопке

Text

Текст надписи на кнопке

TextAlign

Выравнивание текста надписи на кнопке

TextImageRelation

Задает положение надписи на кнопке относительно иконки

 

Основным событием кнопки является событие Click.

 

Пример, пусть имеется форма вида:

 

 

Необходимо просуммировать значения двух текстовых полей и записать ответ в третье поле. Расчет выполнить при щелчке на первой кнопке по запросу. Вторая кнопка очищает все поля также по запросу.

 

//=======================================

//код первой кнопки

private void button1_Click_1(object sender, EventArgs e)

{

//описываем переменные

double a,b,rez;

 

//выдаем запрос на расчет

//если ответим «нет», выход из программы

if (MessageBox.Show("Рассчитать?", "Подтвердите",

                    MessageBoxButtons.YesNo,

                   MessageBoxIcon.Question) == DialogResult.No) return;

 

//в переменные записываем значения двух текстовых полей

a=Convert.ToDouble(textBox1.Text);

b=Convert.ToDouble(textBox2.Text);

//считаем сумму

rez=a+b;

//в третьем поле показываем ответ

textBox3.Text=rez.ToString();

}

 

//=======================================

//код второй кнопки

private void button2_Click_1(object sender, EventArgs e)

{

//выдаем запрос на очистку полей

//если ответим «нет», выход из программы

if (MessageBox.Show("Очистить поля?", "Подтвердите",

                    MessageBoxButtons.YesNo,

                    MessageBoxIcon.Question) == DialogResult.No) return;

//очищаем текстовые поля

textBox1.Text = "";

textBox2.Text = "";

textBox3.Text = "";

//ставим курсор в первое поле для ввода новых значений

textBox1.Focus();

}

 

Вопросы для самопроверки

1. Из каких файлов состоит форма в C#?

2. Какие операции над формами можно выполнить в проекте C#?

3. Как изменить главную форму в проекте C#?

4. Как задать имя главной формы в проекте C#?

5. Какие свойства форм в C# Вы знаете?

6. Какие события форм в C# Вы знаете?

7. Какие методы форм в C# Вы знаете?

8. Какой метод позволяет вывести диалоговое сообщение?  Опишите его параметры.  Как обработать ответ пользователя в диалоге?

9. Приведите свойства компонента Label в C#. Как связать Label с компонентом через «горячий» символ?

10. Приведите свойства компонента TextBox в C#. Как выполнить конвертирования текста в число и наоборот?

11. Приведите события компонента TextBox в C#. Как выполнить расчет функций в C#?  Как создать всплывающие подсказки на форме?

12. Приведите свойства компонента Button в C#.