VirQ. Что такое WinForms в C#
Язык C# входит в ТОП-5
самых популярных языков
программирования
Главная /
Учебник
/
Что такое WinForms
Статей на сайте: 61

Что такое WinForms


Вот как она выглядит:


На ней отображены только некоторые элементы, скорее всего из которых вы все видели в той или иной программе.
То, что тут отображено, не составляет даже 1% от всего, что можно использовать на форме. Формам посвящён целый раздел сайта.

Для создания формы в C# необходимо проделать следующее:
Выберите "Создать проект". Если у вас уже запущена другая программа в C#, то вызвать это окно можно через Меню/Вид/Начальная страница.


В появившемся окне выберите то, что указано:


Появится вот это. Нажмите правую кнопку:


Выберите "Перейти к коду" и увидите вот такой код:
[code] using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Calculator { public partial class Form1 : Form { public Form1() { InitializeComponent(); } } } [/code]
Мы будем разрабатывать элементарный калькулятор.
Вам понадобится как код, так и форма. Переключаться между ними вы сможете через вот такое меню


Теперь, используя вот эту панель элементов


перенесите на форму элементы Label (2 шт.), TextBox (2 шт.), ComboBox (1 шт.) и Button (2 шт.)
Если панели элементов нигде нет, её можно включить через Меню/Вид/Панель элементов

У вас получится примерно так:


Теперь, щёлкая одинарным щелчком любой из элементов, справа (у меня так настроено) или слева у вас в панели "Свойства" будут отображены свойства ЭТОГО элемента. Если панели свойств нет, её можно включить через Меню/Вид/Окно свойств.
При этом обратите внимание, что при выборе элемента его имя указано сверху панели


Кто это читает первый раз и пробует, наверняка случайно делал двойной щелчок по элементам и попадал сюда:
[code] using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Calculator { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button2_Click(object sender, EventArgs e) { } private void Form1_Load(object sender, EventArgs e) { } private void textBox2_TextChanged(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { } } } [/code]
Пока не обращайте внимание, это уберём в конце статьи. Просто удалить сейчас не получится, т.к. будет ошибка. Внизу описано, как правильно эти "случайности" убирать. Пока просто переключитесь на форму и читайте далее.
Выбирая каждый элемент, необходимо найти его свойство Text и изменить.
Например, выберите label1, зайдите в свойства и измените его свойство Text на "Первое число"


Щёлкните мышью в другом месте или нажмите Enter
На форме измените label1 на Первое число


Теперь по тому же принципу измените текст для остальных элементов, меняйте позицию элементов и их ширину (думаю, это объяснять не надо) чтобы было так:


"Вывод сюда" - означает, что результат будет выводиться на форму. А соответственно, нужен ещё один элемент label.
Добавьте его, найдите его свойство Text, измените на "0". Найдите свойство Font и измените так, чтобы было, как на форме


Для вызова окна редактирования текста в свойстве Font справа будут "...", отображённые на скрине красным квадратиком


И последнее, осталось изменить имя формы. Для этого щёлкните в пустом месте формы 1 раз. В окне свойств вверху будет подписано "Form1". Найдите его свойство Text и измените на "Калькулятор", а так же ряд других свойств:


FormBorderStyle - чтобы ширину и высоту формы нельзя было менять во время её выполнения
MaximizeBox (false) - отключить на форме кнопку увеличения окна
MinimizeBox (false) - отключить на форме кнопку минимизации окна
Text - это описано было выше
Итого, получаем такую форму:


Теперь можно приступать к коду.
Элемент ComboBox пока не трогаем. С ним чуть позже.

Сделайте двойной щелчок на первой кнопке "Вывод сюда".
Если вы делали случайные двойные щелчки на других элементах, пока читали статью, то будет примерно так:
[code] using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Calculator { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button2_Click(object sender, EventArgs e) { } private void Form1_Load(object sender, EventArgs e) { } private void textBox2_TextChanged(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { //Курсор будет тут } } } [/code]
Если же это был первый двойной щелчок, то будет так:
[code] using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Calculator { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { //Курсор будет тут } } } [/code]
В коде, где написано "//Курсор будет тут" надо написать:
[code] int n1 = int.Parse(textBox1.Text); int n2 = int.Parse(textBox2.Text); [/code]
Это позволит прочитать число в текстовых полей textBox1 (поле для первого числа) и textBox2 (поле для второго числа). И тут же конвертировать их в числа.
Подробности смотрите тут: конвертировать строку в число
Теперь результат надо вывести в label3, который на форме у нас отображён большим нулём.
Добавляем строку и получаем такой полный код:
[code] int n1 = int.Parse(textBox1.Text); int n2 = int.Parse(textBox2.Text); label3.Text = (n1 + n2).ToString();
[/code]
Проверим, как у нас всё работает. Запустите программу через F5.
Теперь введите на форме два произвольных числа (без каких-либо пробелов, других символов) и нажмите первую кнопку


Внизу сразу отобразится результат.
При запуске не путайте нарисованную форму проекта и саму запущенную программу


Для того, чтобы вернуться в код, надо закрыть программу.
Если вы в коде, а программа запущена, оставить её выполнение можно через Shift+F5.

Теперь напишем код для 2 кнопки. Вернитесь на форму. Сделайте двойной щелчок по второй кнопке.
И напишите такой код:
[code] int n1 = int.Parse(textBox1.Text); int n2 = int.Parse(textBox2.Text); MessageBox.Show((n1 + n2).ToString());
[/code]
Запустите программу. Введите 2 произвольных числа и нажмите 2 кнопку.
Увидите это:



Теперь вернёмся к ComboBox. Это выпадающий список, в который мы внесём 4 арифметических знака.
Остановите программу, если она запущена.
Вернитесь на вкладку конструктора формы. Выберите ComboBox-элемент.
В окне свойств измените свойство Items через "...", которые появятся там, где указано квадратиком.


Внесите данные и нажмите "ОК".
Теперь надо внести изменения в код.
Для первой кнопки так:
[code] int n1 = int.Parse(textBox1.Text); int n2 = int.Parse(textBox2.Text); int r = 0;
if (comboBox1.SelectedIndex == 0) r = n1 + n2;
if (comboBox1.SelectedIndex == 1) r = n1 - n2;
if (comboBox1.SelectedIndex == 2) r = n1 * n2;
if (comboBox1.SelectedIndex == 3) r = n1 / n2;
label3.Text = r.ToString();
[/code]
Для второй кнопки так:
[code] int n1 = int.Parse(textBox1.Text); int n2 = int.Parse(textBox2.Text); int r = 0;
if (comboBox1.SelectedIndex == 0) r = n1 + n2;
if (comboBox1.SelectedIndex == 1) r = n1 - n2;
if (comboBox1.SelectedIndex == 2) r = n1 * n2;
if (comboBox1.SelectedIndex == 3) r = n1 / n2;
MessageBox.Show(r.ToString());
[/code]
Запустите программу. Выберите нужное арифметическое действие


Если вы ничего не выберите, тогда результатом будет 0, т.к. comboBox1.SelectedIndex = -1 при этом. А на значение -1 нет прописанных условий
В программе не предусмотрены возможные ошибки при вводе текстовых полей, пустоты, деления на 0, иначе статья будет очень длинной. Суть статьи - описать понятие формы, её элементов и элементарного кода для них.

Последнее, что осталось сделать, это убрать лишний код, который случайно у нас получился при двойном щелчке на элементе. У меня сейчас код выглядит так:
[code] using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Calculator { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button2_Click(object sender, EventArgs e) { int n1 = int.Parse(textBox1.Text); int n2 = int.Parse(textBox2.Text); int r = 0; if (comboBox1.SelectedIndex == 0) r = n1 + n2; if (comboBox1.SelectedIndex == 1) r = n1 - n2; if (comboBox1.SelectedIndex == 2) r = n1 * n2; if (comboBox1.SelectedIndex == 3) r = n1 / n2; MessageBox.Show(r.ToString()); } private void Form1_Load(object sender, EventArgs e) { } private void textBox2_TextChanged(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { int n1 = int.Parse(textBox1.Text); int n2 = int.Parse(textBox2.Text); int r = 0; if (comboBox1.SelectedIndex == 0) r = n1 + n2; if (comboBox1.SelectedIndex == 1) r = n1 - n2; if (comboBox1.SelectedIndex == 2) r = n1 * n2; if (comboBox1.SelectedIndex == 3) r = n1 / n2; label3.Text = r.ToString(); } } } [/code]
Видим, что Form1_Load и textBox2_TextChanged нам не нужны. Удаляем. Для красоты можете коды кнопок 1 и 2 переставить местами. Получится так:
[code] using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Calculator { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { int n1 = int.Parse(textBox1.Text); int n2 = int.Parse(textBox2.Text); int r = 0; if (comboBox1.SelectedIndex == 0) r = n1 + n2; if (comboBox1.SelectedIndex == 1) r = n1 - n2; if (comboBox1.SelectedIndex == 2) r = n1 * n2; if (comboBox1.SelectedIndex == 3) r = n1 / n2; label3.Text = r.ToString(); } private void button2_Click(object sender, EventArgs e) { int n1 = int.Parse(textBox1.Text); int n2 = int.Parse(textBox2.Text); int r = 0; if (comboBox1.SelectedIndex == 0) r = n1 + n2; if (comboBox1.SelectedIndex == 1) r = n1 - n2; if (comboBox1.SelectedIndex == 2) r = n1 * n2; if (comboBox1.SelectedIndex == 3) r = n1 / n2; MessageBox.Show(r.ToString()); } } } [/code]
Однако при запуске теперь выходит вот что:


Нажмите "Нет".
Получаем список критических ошибок


Двойным щелчком переходим на одну из них:
И видим что-то подобное этому:
[code] // // textBox1 // this.textBox1.Location = new System.Drawing.Point(128, 30); this.textBox1.Name = "textBox1"; this.textBox1.Size = new System.Drawing.Size(100, 20); this.textBox1.TabIndex = 2; // // textBox2 // this.textBox2.Location = new System.Drawing.Point(128, 59); this.textBox2.Name = "textBox2"; this.textBox2.Size = new System.Drawing.Size(100, 20); this.textBox2.TabIndex = 3; this.textBox2.TextChanged += new System.EventHandler(this.textBox2_TextChanged); // // button1 // this.button1.Location = new System.Drawing.Point(25, 174); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(102, 43); this.button1.TabIndex = 4; this.button1.Text = "Вывод сюда"; this.button1.UseVisualStyleBackColor = true; this.button1.Click += new System.EventHandler(this.button1_Click); // // button2 // this.button2.Location = new System.Drawing.Point(142, 174); this.button2.Name = "button2"; this.button2.Size = new System.Drawing.Size(109, 43); [/code]
В этом коде ошибочной является строка
[code] this.textBox2.TextChanged += new System.EventHandler(this.textBox2_TextChanged); [/code]
она будет подчёрнута на месте "textBox2_TextChanged". Это означает, что сейчас у нас этот код обращается к обработчику, который мы только что удалили. Это нужно убрать. Всю строку. Тогда для textBox2 будет описание не из 5 строк
[code]
//
// textBox2
//
this.textBox2.Location = new System.Drawing.Point(128, 59);
this.textBox2.Name = "textBox2";
this.textBox2.Size = new System.Drawing.Size(100, 20);
this.textBox2.TabIndex = 3; this.textBox2.TextChanged += new System.EventHandler(this.textBox2_TextChanged); [/code]
а из 4
[code] // // textBox2 // this.textBox2.Location = new System.Drawing.Point(128, 59); this.textBox2.Name = "textBox2"; this.textBox2.Size = new System.Drawing.Size(100, 20); this.textBox2.TabIndex = 3; [/code]

Нажмите F6 для повторной проверки кода, но при этом программа не запустится


Видим, что ошибок стало на 1 меньше.

Повторяем процедуру
Через двойной щелчок попадаем сюда:
[code] // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(284, 261); this.Controls.Add(this.label3); this.Controls.Add(this.comboBox1); this.Controls.Add(this.button2); this.Controls.Add(this.button1); this.Controls.Add(this.textBox2); this.Controls.Add(this.textBox1); this.Controls.Add(this.label2); this.Controls.Add(this.label1); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "Form1"; this.Text = "Калькулятор"; this.Load += new System.EventHandler(this.Form1_Load); this.ResumeLayout(false); this.PerformLayout(); [/code]
и видим, что Form1_Load подчёркнут. Удаляем всю строку.

Теперь при запуске F6 - пустое окно с ошибками (значит всё успешно исправлено)
F5 - нормальный запуск