You are on page 1of 141

Windows Forms

План
1. Вступ у Windows Forms
2. Робота з формами
3. Контейнери у Windows Forms
4. Елементи керування
5. Меню і панелі інструментів
Створення графічного додатку

Після установки середовища і всіх її компонентів, запустимо Visual Studio і


створимо проект графічного додатку. Для цього в меню виберемо пункт File
(Файл) і в підменю виберемо New - > Project (Створити - > Проект). Після цього
перед нами відкриється діалогове вікно створення нового проекту:
В лівій колонці виберемо Windows Desktop, а в центральній частині серед типів
проектів - тип Windows Forms Application і дамо йому яке-небудь ім'я в полі
внизу. Наприклад, назвемо його HelloApp. Після цього натискаємо OK. Після цього
Visual Studio відкриє наш проект з створеними за замовчуванням файлами:
Створення
графічного
додатку
Створення графічного додатку
Тепер знайдемо
в цьому вікні
властивість
форми Text і
змінимо його
значення на
будь-яке інше:
Створення графічного додатку
Перенесемо на поле який-
небудь елемент керування,
наприклад, кнопку. Для цього
знайдемо в лівій частині Visual
Studio вкладку Toolbox (Панель
інструментів). Натиснемо на
цю вкладку, і у нас відкриється
панель з елементами, звідки
ми можемо з допомогою миші
перенести на форму елемент:
Створення графічного додатку
Однак скористаємося іншим
способом, щоб не писати багато
зайвого коду. Наведемо вказівник
миші на кнопку і клацнемо по ній
подвійним клацанням. Ми
автоматично потрапляємо у файл
коду Form1.cs, який виглядає так:
Створення графічного додатку
using System; public partial class Form1:Form
using System.Collections.Generic;     {
using System.ComponentModel;         public Form1() {
using System.Data;             InitializeComponent()
using System.Drawing; ;
using System.Linq;         }
using System.Text;  
using System.Threading.Tasks; private void button1_Click(object
using System.Windows.Forms; sender, EventArgs e){
      MessageBox.Show("Привет");
namespace HelloApp {         }
    }
}
Робота з формами
Зовнішній вигляд програми надається переважно через форми. Форми є
основними будівельними блоками. Вони надають контейнер для різних
елементів управління. А механізм подій дозволяє елементів форми відгукуватися
на введення користувача, і, таким чином, взаємодіяти з користувачем.
При відкритті проекту в Visual Studio в графічному редакторі ми можемо
побачити візуальну частину форми - ту частину, яку ми бачимо після запуску
програми і куди ми переносимо елементи з панелі управління. Але насправді
форма приховує потужний функціонал, який складається з методів, властивостей,
подій та інше. Розглянемо основні властивості форм. Якщо ми запустимо додаток,
то нам відкриється одна порожня форма. Однак навіть такий простий проект з
порожньою формою має кілька компонентів:
Робота з формами
Робота з формами
Незважаючи на те, що ми бачимо тільки static class Program {
форму, але стартовою точкою входу в [STAThread]
графічне додаток є клас Program, static void Main() {
розташований у файлі Program.cs: Application.EnableVisualStyles();
using System; Application.SetCompatibleTextRenderingD
using System.Collections.Generic; efault(false);
using System.Linq; Application.Run(new Form1());
using System.Threading.Tasks; } } }
using System.Windows.Forms;
namespace HelloApp {
Робота з формами
Спочатку запускається програмою даний клас, потім з допомогою виразу Application.Run(new
Form1()) він запускає Form1. Якщо раптом ми захочемо змінити стартову форму в додатку на
яку-небудь іншу, то нам треба змінити в цьому виразі Form1 на відповідний клас форми.
Сама форма складна за змістом. Вона поділяється на ряд компонентів. Так, у структурі
проекту є файл Form1.Designer.cs, де оголошується частковий клас Form1, яка має два методу:
Dispose(), який виконує роль деструктора об'єкта, і InitializeComponent(), який встановлює
початкові значення властивостей форми.
При додаванні елементів управління, наприклад, кнопок, їх опис також додається в цей файл.
Але на практиці ми рідко будемо стикатися з цим класом, так як вони виконує в основному
дизайнерські функції - встановлення властивостей об'єктів, встановлення змінних.
Робота з формами
Ще один файл- Form1.resx - зберігає ресурси using System.Text;
форми. Як правило, ресурси використовуються using System.Threading.Tasks;
для створення одноманітних форм відразу для
декількох мовних культур. using System.Windows.Forms;
І більш важливий файл - Form1.cs, який у namespace HelloApp {
структурі проекту називається просто Form1, public partial class Form1 : Form {
містить код або програмну логіку форми:
public Form1() {
using System;
InitializeComponent();
using System.Collections.Generic;
} } }
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
Основні властивості форм
За допомогою
спеціального вікна
Properties (Властивості)
праворуч Visual Studio
надає зручний інтерфейс
для управління
властивостями елемента:
Основні властивості форм
Більшість цих властивостей впливає на візуальне відображення форми. Пробіжимося по основних властивостях:

Name: встановлює ім'я форми - точніше ім'я класу, який успадковується від класу Form

BackColor: вказує на фоновий колір форми. Клацнувши на це властивість, ми зможемо вибрати той колір, який

нам підходить зі списку запропонованих кольорів або колірної палітри

BackgroundImage: вказує на фонове зображення форми

BackgroundImageLayout: визначає, як зображення, заданий властивістю BackgroundImage, буде розташовуватися

на формі.

ControlBox: вказує, відображається меню форми. В даному випадку під меню розуміється меню верхнього рівня,

де знаходяться іконка програми, заголовок форми, а також кнопки мінімізації форми і хрестик. Якщо ця

властивість має значення false, то ми не побачимо ні іконку, ні хрестика, з допомогою якого зазвичай

закривається форма
Основні властивості форм
Cursor: визначає тип курсору, який використовується на формі

Enabled: якщо ця властивість має значення false, то вона не зможе отримувати введення від користувача, тобто ми

не зможемо натиснути на кнопки, ввести текст у текстові поля і т. д.

Font: визначає шрифт для всієї форми та всіх розміщених на неї елементів управління. Однак, задавши у елементів

форми свій шрифт, ми можемо тим самим змінити його

ForeColor: колір шрифту на формі

FormBorderStyle: вказує, як буде відображатися межа форми і рядок заголовка. Встановлюючи цю властивість в

None можна створювати зовнішній вигляд додатка довільної форми

HelpButton: вказує, відображається кнопка довідки форми

Icon: задає іконку форми

Location: визначає положення по відношенню до верхнього лівого кута екрана, якщо для властивості StartPosition

встановлено значення Manual


Основні властивості форм
MaximizeBox: вказує, буде доступна кнопка максимізації вікна в заголовку форми

MinimizeBox: вказує, буде доступна кнопка мінімізації вікна

MaximumSize: задає максимальний розмір форми, MinimumSize: задає мінімальний розмір форми, Opacity:

встановлює прозорість форми, Size: визначає початковий розмір форми

StartPosition: вказує на початкову позицію, з якою форма з'являється на екрані, Text: визначає заголовок

форми, TopMost: якщо ця властивість має значення true, то форма завжди буде знаходитися поверх інших

вікон

Visible: видима форма, якщо ми хочемо приховати форму від користувача, то можемо задати даної властивості

значення false

WindowState: вказує, в якому стані форма буде знаходитися при запуску: в нормальному, максимизированном

або мінімізованому
Основні властивості форм
За допомогою значень властивостей у вікні Властивості ми можемо змінити на свій
розсуд зовнішній вигляд форми, але все те ж саме ми можемо зробити динамічно в коді.
public Form1()
{
InitializeComponent();
Text = "Hello World!";
this.BackColor = Color.Aquamarine;
this.Width = 250;
this.Height = 250;
}
Додавання форм. Взаємодія між формами
Щоб додати ще одну форму в проект, натиснемо на ім'я проекту у вікні Solution Explorer (Оглядач
рішень) правою кнопкою миші і виберемо Add(Додати)->Windows Form...
Отже, у нас в проект додано друга форма. Тепер спробуємо здійснити взаємодія між двома формами.
Припустимо, перша форма по натисненню на кнопку буде викликати другу форму. По-перше, додамо на
першу форму Form1 кнопку і подвійним клацанням по кнопці перейдемо в файл коду. Отже, ми
потрапимо в обробник події натискання кнопки, який створюється за замовчуванням після подвійного
клацання по кнопці:
private void button1_Click(object sender, EventArgs e) {
Form2 newForm = new Form2();
newForm.Show();
}
Додавання форм. Взаємодія між формами
Тепер зробимо навпаки - щоб друга форма впливала на першу. Для цього
скористаємося передачею посилання на форму в режимі конструктора. Отже
перейдемо до другої формі і перейдемо до її коду. Отже, змінимо файл коду другої
форми на наступний:
public partial class Form2 : Form {
public Form2() {
InitializeComponent(); }
public Form2(Form1 f) {
InitializeComponent(); f.BackColor = Color.Yellow;
} }
Додавання форм. Взаємодія між формами
Фактично ми тільки додали тут новий конструктор public Form2(Form1 f), в якому ми отримуємо першу
форму і встановлюємо її фон в жовтий колір. Тепер перейдемо до коду першої форми, де ми
викликали другу форму і змінимо його на наступний:
private void button1_Click(object sender, EventArgs e) {
Form2 newForm = new Form2(this);
newForm.Show();
}
Оскільки в даному випадку ключове слово this являє посилання на поточний об'єкт - об'єкт Form1, то
при створенні другої форми вона буде отримувати її (посилання) і через неї керувати першою формою.
Тепер після натискання на кнопку у нас буде створена друга форма, яка відразу змінить колір першої
форми.
Додавання форм. Взаємодія між формами

При роботі з декількома формами треба враховувати, що одна з них є


головною - яка запускається першої у файлі Program.cs. Якщо у нас
одночасно відкрита купа форм, то при закритті головної закривається
усі додаток і разом з ним всі інші форми.
Події форми
Події в Windows Forms представляють стандартні події

на C#, тільки застосовуються до візуальних компонентів

і підкоряються тим же правилам, що події в C#.

Насамперед в WinForms є певний стандартний набір

подій, який здебільшого є у всіх візуальних

компонентів. Окремі елементи додають свої події, але

принципи роботи з ними будуть схожі. Щоб подивитися

всі події елемента, нам треба вибрати цей елемент у

полі графічного дизайнера і перейти до вкладки подій

на панелі форм. Наприклад, події форми:


Події форми
Щоб додати обробник, можна просто двічі клацнути по пустому полю поруч з назвою події, і

після цього Visual Studio автоматично згенерує обробник події. Наприклад, натиснемо для

створення обробника події Load, за замовчуванням обробник назвется Form1_Load. Якщо ми

перейдемо в файл коду форми Form1.cs, то побачимо автосгенерированный метод

Form1_Load. І при кожному завантаженні форми буде спрацьовувати код обробника

Form1_Load. Додавання ж обробника, створеного таким чином, виробляється у файлі

Form1.Designer.cs. Для додавання обробника використовується стандартний синтаксис C#:

this.Load = new System.EventHandler(this.Form1_Load) Тому якщо ми захочемо видалити

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

Form1.cs, але і видалити додавання обробника в цьому файлі.


Події форми
Однак ми можемо додавати обробники подій і програмно, наприклад, в конструкторі форми:
public Form1() {
InitializeComponent(); this.Load += LoadEvent;
}
private void Form1_Load(object sender, EventArgs e) { }
private void LoadEvent(object sender, EventArgs e) {
this.BackColor = Color.Yellow;
} }
Крім раніше створеного обробника Form1_Load тут також доданий інший обробник
завантаження форми: this.Load += LoadEvent;, який встановлює в якості фону жовтий колір.
Створення не прямокутних форм. Закриття
форм
За замовчуванням усі форми в Windows Forms є прямокутними. Однак ми можемо створювати і
непрямокутні довільні форми. Для цього використовується властивість Region. В якості значення воно
приймає об'єкт однойменного класу Region.

При створенні непрямоугольных форм, як правило, не використовуються межі форми, так як межі задаються
цим об'єктом Region. Щоб прибрати межі форми, треба привласнити у форми властивості FormBorderStyle
значення None.

І ще один аспект, який треба враховувати, полягає в переміщенні, закриття, максимізації та мінімізації форм.
Тобто в даному випадку , як у звичайній формі, ми не зможемо натиснути на хрестик, щоб закрити форму, не
зможемо її перемістити на нове місце. Тому нам треба додатково визначати для цього програмну логіку.

Отже, перейдемо до коду форми і змінимо його наступним чином:


Створення не прямокутних форм. Закриття форм
namespace WindowsFormsApplication17 { System.Drawing.Drawing2D.GraphicsPath
public partial class Form1 : Form { myPath = new
public Form1() { System.Drawing.Drawing2D.GraphicsPath();
InitializeComponent(); myPath.AddEllipse(0, 0, this.Width,
this.BackColor = Color.Yellow; this.Height);
this.FormBorderStyle = • Region myRegion = new
FormBorderStyle.None; Region(myPath);
} this.Region = myRegion; }
private void button1_Click(object sender, private void button2_Click(object sender,
EventArgs e){ EventArgs e) {
this.Close(); }
}}
Створення не прямокутних форм. Закриття
форм
Динамічне додавання елементів
Для організації елементів управління пов'язані групи існують спеціальні елементи – контейнери:

Panel, FlowLayoutPanel, SplitContainer, GroupBox. Ту ж форму також можна віднести до

контейнерів. Використання контейнерів полегшує управління елементами, а також надає формі

візуальний стиль.

Всі контейнери мають властивість Controls, яке містить всі елементи даного контейнера. Коли ми

переносимо який-небудь елемент з панелі інструментів на контейнер, наприклад, кнопку, вона

автоматично додається в дану колекцію даного контейнера. Або ми також можемо додати

елемент управління динамічно за допомогою коду в цю колекцію. Додамо на форму кнопку

динамічно. Для цього додамо подія завантаження форми, в якому буде створюватися новий

елемент управління. Це можна зробити або за допомогою коду, або візуальним образом.
Динамічне додавання елементів
private void Form1_Load(object sender, EventArgs e) {

Button helloButton = new Button();

helloButton.BackColor = Color.LightGray;

helloButton.ForeColor = Color.DarkGray;

helloButton.Location = new Point(10, 10);

helloButton.Text = "Привет";

this.Controls.Add(helloButton); }

Спочатку ми створюємо кнопку і встановлюємо її властивості. Потім, використовуючи метод Controls.Add ми

додаємо її в колекцію елементів форми. Якщо б ми це не зробили, ми б кнопку не побачили, оскільки в цьому

випадку для нашої форми її просто не існувало б. За допомогою методу Controls.Remove() можна видалити раніше

доданий елемент форми:

this.Controls.Remove(helloButton);
Элементы GroupBox, Panel и FlowLayoutPanel

GroupBox являє собою спеціальний


контейнер, який обмежений від іншої
форми кордоном. Він має заголовок, який
встановлюється через властивість Text. Щоб
зробити GroupBox без заголовка, в якості
значення властивості Text просто
встановлюється порожній рядок. Нерідко
цей елемент використовується для
групування елементів - елементів
RadioButton, так як дозволяє розмежувати їх
групи.
Элементы GroupBox, Panel и FlowLayoutPanel
Елемент Panel являє панель і також, як і

GroupBox, об'єднує елементи в групи. Вона

може візуально зливатися з іншою формою

(властивість BorderStyle за замовчуванням

має значення None, тобто відсутність

кордонів). Також якщо панель має багато

елементів, які виходять за її межі, ми

можемо зробити прокручиваемую панель,

встановивши її властивість AutoScroll в true


Элементы GroupBox, Panel и FlowLayoutPanel
У GroupBox і Panel можемо динамічно helloButton.Text = "Привет";
додавати елементи. groupBox1.Controls.Add(helloButton);
private void Form1_Load(object sender, }
EventArgs e) { Для вказівки розташування елемента в
Button helloButton = new Button(); контейнері ми використовуємо структуру
helloButton.BackColor = Color.LightGray; Point: new Point(30, 30) (розміщення по осях Х і
helloButton.ForeColor = Color.Red; Y.) Ці координати встановлюються щодо лівого
helloButton.Location = new Point(30, 30); верхнього кута контейнера. При цьому треба
враховувати, що контейнером верхнього рівня
є форма, а елемент groupBox1 сам знаходиться
в колекції елементів форми. І при бажанні ми
могли б видалити його:
Элементы GroupBox, Panel и FlowLayoutPanel
Елемент FlowLayoutPanel є успадкований від класу Panel, і тому успадковує всі його
властивості. Однак при цьому додаючи додаткову функціональність. Так, цей елемент
дозволяє змінювати позиціонування і компонування дочірніх елементів при зміні
розмірів форми під час виконання програми.
Властивості елементу FlowDirection дозволяє задати напрямок, в якому спрямовані
дочірні елементи. За замовчуванням має значення LeftToRight - тобто елементи будуть
розташовуватися починаючи від лівого верхнього краю. Такі елементи будуть йти
вправо. Це властивість також може приймати наступні значення:
RightToLeft - елементи розташовуються від правого верхнього кута в лівий бік
TopDown - елементи розташовуються від лівого верхнього кута і йдуть вниз
BottomUp - елементи розташовуються від лівого нижнього кута і йдуть вгору
Элементы GroupBox, Panel и FlowLayoutPanel
При розташуванні елементів
важливу роль відіграє властивість
WrapContents. За замовчуванням
воно має значення True. Це
дозволяє переносити елементи,
які не вміщаються в
FlowLayoutPanel, на новий рядок
чи стовпець. Якщо воно має
значення False, то елементи не
переносяться, а до контейнера
просто додаються смуги
прокрутки, якщо властивість
AutoScroll одно true.
TableLayoutPanel
Елемент TableLayoutPanel також перевизначає панель і має дочірні
елементи керування у вигляді таблиці, де для кожного елемента є
своя осередок. Якщо нам хочеться помістити в комірку більше одного
елемента, то в клітинку додається інший компонент TableLayoutPanel,
який потім вкладаються інші елементи. Щоб встановити потрібну
кількість рядки стовпців таблиці, ми можемо використовувати
властивості Rows і Columns відповідно. Вибравши один із цих пунктів
у вікні Properties (Властивості), нам відкриється наступне вікно для
налаштування стовпців і рядків:
TableLayoutPanel
TableLayoutPanel
У полі Size Type ми можемо вказати розмір стовбців / рядків. Нам доступні три
можливі варіанти:
Absolute: задається абсолютний розмір для рядків або стовпців у пікселях
Percent: задається відносний розмір у відсотках. Якщо нам треба створити
гумовий дизайн форми, щоб її рядки та стовпці, а також елементи управління в
комірках таблиці автоматично масштабувалися при зміні розмірів форми, то нам
потрібно використовувати саме цю опцію
AutoSize: висота рядків, ширина стовпчиків задається автоматично у залежності
від розміру найбільшою в рядку або стовпці, клітинки
TableLayoutPanel
Також ми можемо комбінувати ці значення, наприклад, один стовпець може бути
фіксованим з абсолютною шириною, а інші стовпці можуть мати ширину у відсотках.
У цьому діалоговому вікні ми також можемо додати або видалити рядки і стовпці. У теж
час графічний дизайнер в Visual Studio не завжди відразу відображає зміни в таблиці
додавання та видалення рядків і стовпців, зміна їх розмірів, тому, якщо змін на формі
ніяких не відбувається, треба її закрити і потім заново відкрити в графічному дизайнері.
Отже, наприклад, у мене є три стовпця і три рядки розмір у яких однаковий - 33.33%. У
кожну комірку таблиці додана кнопка, у якій встановлено властивість Dock=Fill.
TableLayoutPanel
Якщо я зміню розміри
форми, то автоматично
масштабуються та рядки і
стовпці разом з
ув'язненими в них
кнопками. Що досить
зручно для створення
масштабованих
інтерфейсів.
TableLayoutPanel
У коді динамічно ми можемо змінювати значення стовпців і рядків. Причому
всі стовпці представлені типом ColumnStyle, а рядки – типом RowStyle:
tableLayoutPanel1.RowStyles[0].SizeType = SizeType.Percent;
tableLayoutPanel1.RowStyles[0].Height = 40;
tableLayoutPanel1.ColumnStyles[0].SizeType = SizeType.Absolute;
tableLayoutPanel1.ColumnStyles[0].Width = 50;
Для встановлення розміру в ColumnStyle і RowStyle визначено властивість
SizeType, яке приймає одне із значень однойменного перерахування SizeType
TableLayoutPanel
Додавання елемента в контейнер TableLayoutPanel має свої особливості. Ми можемо
додати його в наступну вільну клітинку або можемо явно вказати комірку таблиці:
Button saveButton = new Button(); // додаємо кнопку в наступну вільну комірку
tableLayoutPanel1.Controls.Add(saveButton); // додаємо кнопку в клітинку (2,2)
tableLayoutPanel1.Controls.Add(saveButton, 2, 2);
В даному випадку додаємо кнопку у клітинку, утворену на перетині третього стовпця
і третього рядка. Правда, якщо у нас немає стільки рядків і стовпців, то система
автоматично вибере потрібну комірку для додавання.
Розміри елементів та їхнє позиціювання в контейнері

Для кожного елементу управління ми


можемо визначити властивість Location,
яке задає координати верхнього лівого
кута елемента відносно контейнера. При
перенесенні елементу з панелі
інструментів на форму це властивість
встановлюється автоматично. Однак потім
у вікні Властивостей ми можемо вручну
поправити координати положення
елемента:
Розміри елементів та їхнє позиціювання в контейнері

Також ми можемо встановити позицію елемента в коді:


private void Form1_Load(object sender, EventArgs e) {
button1.Location = new Point(50, 50);
}
За допомогою властивості Size можна задати розміри елемента. Додаткові властивості MaximumSize і
MinimumSize дозволяють обмежити мінімальний і максимальний розміри.
Установка властивостей в коді:
button1.Size = new Size { Width = 50, Height = 25 };
// установка властивостей окремо
button1.Width = 100;
button1.Height = 35;
Розміри елементів та їхнє позиціювання в контейнері

Додаткові можливості позиціонування елемента


дозволяє визначити свойство Anchor. Це
властивість визначає відстань між однією зі
сторін елемента і стороною контейнера. І якщо
при роботі з контейнером ми будемо його
розтягувати, то разом з ним буде розтягуватися і
вкладений елемент. За замовчуванням у кожного
доданого елемента це властивість одно Top, Left:
Розміри елементів та їхнє позиціювання в контейнері

Ми можемо задати чотири можливі значення цієї властивості або їх комбінацію:


Top, Bottom, Left, Right
При цьому треба відзначити, що дана властивість враховує відстань до кордонів
контейнера, а не форми.
Щоб задати це властивість в коді, треба використовувати перерахування
AnchorStyles:
button1.Anchor = AnchorStyles.Left;
// задаємо комбінацію значень
button1.Anchor = AnchorStyles.Left | AnchorStyles.Top;
Розміри елементів та їхнє позиціювання в контейнері

Свойство Dock дозволяє прикріпити елемент до певної стороні


контейнера. За замовчуванням воно має значення None, але також
дозволяє задати ще п'ять значень:
Top: елемент притискається до верхньої межі контейнера
Bottom: елемент притискається до нижньої межі контейнера
Left: елемент притискається до лівій стороні контейнера
Right: елемент прикріплюється до правій стороні контейнера
Fill: елемент заповнює весь простір контейнера
Панель вкладок TabControl и SplitContainer
Елемент TabControl дозволяє створити елемент керування з декількома
вкладками. І кожна вкладка буде зберігати деякий набір елементів керування,
як кнопки, текстові поля та ін. Кожна вкладка представлена класом TabPage.
Щоб налаштувати вкладки елемента TabControl використовуємо властивість
TabPages. При перенесенні елемента TabControl з панелі інструментів форми за
замовчуванням створюються дві вкладки - tabPage1 і tabPage2. Змінимо їх
відображення за допомогою властивості TabPages.
Нам відкриється вікно редагування/додавання і видалення вкладок:
Панель вкладок TabControl и SplitContainer
Кожна вкладка є свого
роду панель, на яку ми
можемо додати інші
елементи управління,
а також заголовок, з
допомогою якого ми
можемо перемикатися
між вкладками. Текст
заголовка задається за
допомогою властивості
Text.
Панель вкладок TabControl и
SplitContainer
//додавання вкладки
TabPage newTabPage = new TabPage();
newTabPage.Text = "Континенти";
tabControl1.TabPages.Add(newTabPage);
// видалення вкладки // по індексу
tabControl1.TabPages.RemoveAt(0);
// по об'єкту
tabControl1.TabPages.Remove(newTabPage);
// зміна властивостей
tabControl1.TabPages[0].Text = "Перша вкладка";
Панель вкладок TabControl и
SplitContainer
Елемент SplitContainer
дозволяє створювати дві
розділені сплитером
панелі. Змінюючи
положення сплітера,
можна змінити розміри
цих панелей.
Панель вкладок TabControl и SplitContainer
Використовуючи властивість Orientation, можна вибрати горизонтальне або вертикальне відображення
сплітера на форму. В даному випадку це властивість приймає значення Horisontal і Vertical відповідно.
У випадку, коли треба заборонити зміну положення сплітера, то можна привласнити властивості
IsSplitterFixed значення true. Таким чином, сплітер виявиться фіксованим, і ми не зможемо змінити
його положення.
За замовчуванням при розтягуванні форми або її звуженні також буде змінюватися розмір обох
панелей сплитконтейнера. Однак ми можемо закріпити за однією панеллю фіксовану ширину (при
вертикальній орієнтації сплітера) або висоту (при горизонтальній орієнтації сплітера). Для цього нам
треба встановити у елемента SplitContainer властивість FixedPanel. В якості значення воно приймає
панель, яку треба зафіксувати:
Панель вкладок TabControl и
SplitContainer
Щоб змінити положення сплітера в коді, ми
можемо керувати властивістю SplitterDistance, яке
задає положення сплітера в пікселях від лівого та
верхнього краю елемента SplitContainer. А за
допомогою властивості SplitterIncrement можна
задати крок, на який буде переміщатися спліттер
при русі його з допомогою клавіш-стрілок.
Щоб приховати одну з двох панелей, ми можемо
встановити властивість Panel1Collapsed або
Panel2Collapsed в true
Елементи управління
Всі елементи управління успадковуються від класу Control і тому мають ряд загальних
властивостей:
• Anchor: Визначає, як елемент буде розтягуватися
• BackColor: Визначає фоновий колір елемента
• BackgroundImage: Визначає фонове зображення елемента
• ContextMenu: Контекстне меню, яке відкривається при натисканні на елемент правою
кнопкою миші. Задається з допомогою елемента ContextMenu
• Cursor: Уявляє, як буде відображатися курсор миші при наведенні на елемент
• Dock: Задає розташування елемента на формі
• Enabled: Визначає, чи буде доступний елемент для використання. Якщо ця властивість має
значення False, то елемент блокується.
Елементи управління
• Font: Встановлює шрифт тексту для елемента
• ForeColor: Визначає колір шрифту
• Location: Визначає координати верхнього лівого кута елемента керування
• Name: Ім'я елемента керування
• Size: Визначає розмір елемента
• Width: ширина елемента
• Height: висота елемента
• TabIndex: Визначає порядок обходу елементів по натисненню на клавішу Tab
• Tag: Дозволяє зберігати значення, асоційоване з цим елементом управління
Елемент управління - кнопка
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("Hello World");
}
Оформление кнопки
Щоб управляти зовнішнім відображенням кнопки, можна використовувати властивість FlatStyle. Воно може
приймати наступні значення:
• Flat - Кнопка має плоский вигляд
• Popup - Кнопка набуває об'ємний вигляд при наведенні на неї покажчика, в інших випадках вона має плоский
вигляд
• Standard - Кнопка має об'ємний вигляд (використовується за замовчуванням)
• System - Вид кнопки залежить від операційної системи
Елемент управління - кнопка
Зображення на кнопці
Як і для багатьох елементів керування, кнопки можна задавати зображення з
допомогою властивості BackgroundImage. Однак ми можемо керувати розміщенням
тексту і зображень на кнопки. Для цього треба використовувати
властивість TextImageRelation. Воно набуває наступні значення:
• Overlay: текст накладається на зображення
• ImageAboveText: зображення розташовується над текстом
• TextAboveImage: текст розташовується над зображенням
• ImageBeforeText: зображення розташовується перед текстом
• TextBeforeImage: текст розташовується перед зображенням
Елемент управління - кнопка
Наприклад, встановимо
для кнопки зображення.
Для цього виберемо кнопку
і у вікні Властивостей
натиснемо на полі Image
(не плутати з
BackgroundImage). Нам
відкриється діалогове вікно
установи зображення:
Елемент управління - кнопка
В цьому вікні виберемо опцію Local
Resource і натиснемо на кнопку
Import, після чого відкриється
діалогове вікно для вибору файлу
зображення. Після вибору
зображення ми можемо встановити
властивість ImageAlign, яке управляє
позиціонуванням зображення на
кнопці:
Елемент управління - кнопка
Потім перейдемо до властивості TextImageRelation і встановимо для нього
значення ImageBeforeText. В результаті ми отримаємо кнопку, де відразу
після зображення йде напис на кнопці:
Елемент управління - кнопка
Клавіші швидкого доступу
При натисканні комбінації клавіш на клавіатурі Alt+деякий символ, може викликатися певна кнопка.
Наприклад, задамо для деякої кнопки властивість Text рівне &Аватар. Перший знак - амперсанд -
визначає ту літеру, яка буде підкреслена. В даному випадку напис буде виглядати як Аватар. І тепер,
щоб викликати подія Click, нам досить натиснути на комбінацію клавіш Alt+А.
Кнопки за замовчуванням
Форма, на якій розміщуються всі елементи управління, має властивості, що дозволяють призначати
кнопку за замовчуванням і кнопку скасування. Так, властивість форми AcceptButton дозволяє
призначати кнопку за промовчанням, яка буде спрацьовувати по натисненню на клавішу Enter.
Аналогічно працює властивість форми CancelButton, яке призначає кнопку скасування. Призначивши
таку кнопку, ми можемо викликати її натискання, натиснувши на клавішу Esc.
Мітки і ссилки

Label
Для відображення простого тексту на формі, доступного тільки для читання,
служить елемент Label. Щоб задати текст мітки, треба встановити властивість
Text елемента.

LinkLabel
Особливий тип міток представляють елементи LinkLabel, які призначені для
виводу посилань, які аналогічні посиланнях, розміщених на стандартних веб-
сторінок.
Мітки і ссилки

Також, як і з звичайними посиланнями на веб-сторінках, ми можемо по


відношенню до даного елемента визначити три кольори:
• Властивість ActiveLinkColor задає колір посилання, при натисканні
• Властивість LinkColor задає колір посилання до натискання, з якої ще не
було переходів
• Властивість VisitedLinkColor задає колір посилання, по якій вже були
переходи
Мітки і ссилки

Крім кольору посилання для даного елемента ми можемо задати


властивість LinkBehavior, яке управляє поведінкою посилання. Це
властивість приймає чотири можливих значення:
• SystemDefault: для посилання встановлюються системні налаштування
• AlwaysUnderline: посилання завжди підкреслюється
• HoverUnderline: посилання підкреслюється тільки при наведенні на неї
курсора миші
• NeverUnderline: посилання ніколи не підкреслюється
Мітки і ссилки
За замовчуванням весь текст на
даному елементі вважається
посиланням. Однак з допомогою
властивості LinkArea ми можемо
змінити область посилання.
Наприклад, ми не хочемо включати
посилання перші шість символів. Для
цього задаємо подсвойство Start:
Мітки і ссилки
Щоб виконати перехід по посиланню
по натисненню на неї, треба
додатково написати код. Цей код
повинен обробляти подія LinkClicked, private void
 

linkLabel1_LinkClicked
яке є у елемента LinkLabel. (object sender,
LinkLabelLinkClickedEventArgs e)
Наприклад, нехай у нас на формі є
{
елемент посилання називається System.Diagnostics.Process.Start
("http://metanit.com");
linkLabel1 і який містить деяку }
посилання:
Текстове поле TextBox
Для введення і редагування тексту призначені текстові поля - елемент TextBox.
Так само як і у елемента Label текст елемент TextBox можна встановити або
отримати з допомогою властивості Text.
За замовчуванням при перенесенні елементу з панелі інструментів створюється
однорядковий текст. Для відображення великих обсягів інформації в
текстовому полі потрібно використовувати його властивості Multiline і ScrollBars.
При установці властивості Multiline значення true, всі надлишкові символи, які
виходять за межі поля, будуть переноситися на новий рядок.
Текстове поле TextBox

Крім того, можна зробити прокручування


текстового поля, встановивши для його
властивості ScrollBars одне із значень:

None: без прокручувань (за замовчуванням)


Horizontal: створює горизонтальну прокрутку при довжині рядка, що перевищує ширину
текстового поля
Vertical: створює вертикальну прокрутку, якщо рядки не поміщаються в текстовому полі
Both: створює вертикальну і горизонтальну прокрутку
Текстове поле TextBox
Автозаповнення текстового поля AutoCompleteStringCollection source = new
Елемент TextBox володіє достатніми AutoCompleteStringCollection()
можливостями для створення { "Кузнєцов", "Іванов", "Петров",
автозаполняемого поля. Для цього нам треба "Кустов“ };
прив'язати властивість textBox1.AutoCompleteCustomSource =
AutoCompleteCustomSource елемент TextBox до source;
певної колекції, з якої беруться дані для textBox1.AutoCompleteMode =
заповнення поля. AutoCompleteMode.SuggestAppend;
public partial class Form1 : Form { textBox1.AutoCompleteSource =
public Form1() { AutoCompleteSource.CustomSource;
InitializeComponent(); } }
Текстове поле TextBox
Режим автодоповнення, представлений
властивістю AutoCompleteMode, має кілька можливих
значень:
• None: відсутність автодоповнення
• Suggest: пропонує варіанти введення, але не доповнює
• Append: доповнює введене значення до рядка зі
списку, але не пропонує варіанти для вибору
• SuggestAppend: одночасно і пропонує варіанти для
автодоповнення, і доповнює введене користувачем
значення
Текстове поле TextBox
Перенесення за словами. Щоб текст в елементі TextBox переносився за словами, треба встановити
властивість WordWrap рівним true. Тобто якщо одне слово не вміщується на рядку, то переноситься
на наступну. Дана властивість буде працювати тільки для багаторядкових текстових полів.
Введення пароля. Також цей елемент має властивості, які дозволяють зробити з нього поле для
введення пароля. Так, для цього треба використовувати PasswordChar і UseSystemPasswordChar.
Властивість PasswordChar за замовчуванням не має значення, якщо ми встановимо в якості нього
який-небудь символ, то цей символ буде відображатися при введенні будь-яких символів в
текстовому полі. Властивість UseSystemPasswordChar має схожу дію. Якщо ми встановимо його
значення true, то замість введених символів в текстовому полі буде відображатися знак пароля,
прийнятий в системі, наприклад, точка.
Текстове поле TextBox
Подія TextChanged
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
textBox1.TextChanged += textBox1_TextChanged;
}
private void textBox1_TextChanged(object sender,
EventArgs e) {
label1.Text = textBox1.Text;
} }
Елемент MaskedTextBox
Елемент MaskedTextBox по суті являє звичайне текстове поле. Однак дані
елемент дозволяє контролювати введення користувача і перевіряти його
автоматично на наявність помилок.
0: Дозволяє вводити тільки цифри
9: Дозволяє вводити цифри та пробіли
#: Дозволяє вводити цифри, пробіли і символи '+' и '-'
L: Дозволяє вводити тільки літерні символи
?: Дозволяє вводити додаткові необов'язкові літерні символи
Елемент MaskedTextBox
A: Дозволяє вводити літерні і цифрові символи

.: Задає позицію роздільника цілої та дробової частини

,: Використовується для поділу розрядів десяткової

:: Використовується в часових проміжках - поділяє години, хвилини і секунди

/: Використовується для поділу дат

$: Використовується як символ валюти

Щоб задати маску, треба встановити властивість Mask елемента. Знайшовши це властивість у вікні

властивостей (Porperties), натиснемо на нього і нам відкриється вікно для завдання одного із

стандартних шаблонів маски. Зокрема ми можемо вибрати Phone number (номер), який

передбачає введення в текстове поле тільки телефонного номера:


Елемент MaskedTextBox
Елемент MaskedTextBox

Тепер зробимо свою маску. Наприклад, створимо маску для введення ініціалів імені і по батькові та прізвищ
обмеженої довжини у текстове поле. Для цього присвоїмо властивості Mask значення L. L. L?????????. Тоді
введення в текстове поле буде виглядати наступним чином:
Властивість BeepOnError при встановленні значення true подає звуковий сигнал при введенні некоректного
символу.
Властивість HidePromptOnLeave при установці в true при втрати текстовим полем фокуса приховує, зазначені в
PromptChar
Властивість PromptChar вказує на символ, який відображається в полі на місці введення символів. За
замовчуванням стоїть знак підкреслення
Елементи Radiobutton та CheckBox
Елемент або прапорець CheckBox призначений для
установки одного з двох значень: відзначений або не
відзначено. Щоб відзначити прапорець, треба
встановити біля його властивості Checked значення true.
Крім властивості Checked у елемента CheckBox є
властивість CheckState, яке дозволяє задати для
прапорця одне з трьох станів - Checked (відзначений),
Indeterminate (прапорець не визначено - відмічений,
але знаходиться в неактивному стані) і Безконтрольно
(не зазначений)
Елементи Radiobutton та CheckBox
Також слід відзначити властивість AutoCheck - якщо воно має значення false, то ми не можемо змінювати стан

прапорця. За замовчуванням воно має значення true.

При зміні стану прапорця він генерує подію CheckedChanged. Обробляючи цю подію, ми можемо отримувати

змінений прапорець і виробляти певні дії:

private void checkBox_CheckedChanged(object sender, EventArgs e) {

CheckBox checkBox = (CheckBox)sender; // наводимо відправника до елемента типу CheckBox

if (checkBox.Checked == true) {

MessageBox.Show("Прапорець " + checkBox.Text + " тепер відзначений");

} else {

MessageBox.Show("Прапорець " + checkBox.Text + " тепер не відзначений");

} }
Елементи Radiobutton та CheckBox

На елемент CheckBox схожий елемент RadioButton або перемикач. Перемикачі


розташовуються групами, і включення одного перемикача означає відключення всіх
інших.
Щоб встановити у перемикача включене стан, треба привласнити його властивості
Checked значення true.
Для створення групи перемикачів, з яких можна було б обирати, треба помістити
кілька перемикачів в якийсь контейнер, наприклад, елементи GroupBox або Panel.
Перемикачі. що знаходяться в різних контейнерах, будуть ставитися до різних груп:
Елементи Radiobutton та CheckBox
private void radioButton_CheckedChanged(object sender, EventArgs e) {
// наводимо відправника до елемента типу RadioButton
RadioButton radioButton = (RadioButton)sender;
if (radioButton.Checked) {
MessageBox.Show("Ви вибрали" + radioButton.Text);
} }
Елемент ListBox
У Visual Studio в діалоговому вікні Properties (Властивості) для елемента ListBox ми
можемо знайти властивість Items.
Елемент ListBox
string[] countries = { "Бразилия", "Аргентина", "Чили", "Уругвай", "Колумбия" };
listBox1.Items.AddRange(countries);
Вставка елементів
listBox1.Items.Insert(1, "Парагвай");
Видалення елементів
listBox1.Items.Remove("Чили");
listBox1.Items.RemoveAt(1);
listBox1.Items.Clear();
Доступ до елементів списку
string firstElement = listBox1.Items[0];
int number = listBox1.Items.Count();
Елемент ListBox
Виділення елементів списку
При виділенні елементів списку ми можемо ними керувати, як через індекс, так і через
сам виділений елемент. Отримати виділені елементи можна за допомогою наступних
властивостей елемента ListBox:
SelectedIndex: повертає або встановлює номер виділеного елемента списку.
Якщо виділені елементи відсутні, тоді властивість має значення -1
SelectedIndices: повертає або встановлює колекцію виділених елементів у вигляді набору
їх індексів
SelectedItem: повертає або встановлює текст виділеного елемента
SelectedItems: повертає або встановлює виділені елементи у вигляді колекції
Елемент ListBox
За замовчуванням список підтримує виділення одного елемента. Щоб додати
можливість виділення декількох елементів, треба встановити біля його
властивості SelectionMode значення MultiSimple.
Щоб виділити елемент програмно, треба застосувати метод SetSelected(int index,
bool value), де index - номер виділеного елемента. Якщо другий параметр - value
має значення true, то елемент за вказаним індексом виділяється, якщо false, то
виділення навпаки ховається:
listBox1.SetSelected(2, true); // буде виділено третій елемент Щоб зняти виділення
з усіх виділених елементів, використовується метод ClearSelected.
Елемент ListBox
public partial class Form1 : Form { }
public Form1() { void listBox1_SelectedIndexChanged (object
InitializeComponent(); sender, EventArgs e) {
string[] countries = { "Бразилия", string selectedCountry =
"Аргентина", "Чили", "Уругвай", listBox1.SelectedItem.ToString();
"Колумбия" }; MessageBox.Show(selectedCountry);
listBox1.Items.AddRange(countries); }
listBox1.SelectedIndexChanged += }
listBox1_SelectedIndexChanged;
Елемент ComboBox

Елемент ComboBox утворює випадаючий список і поєднує функціональність


компонентів ListBox і TextBox. Для зберігання елементів списку в ComboBox
також призначено властивість Items.
Подібним чином, як і з ListBox, ми можемо у вікні властивостей на властивість
Items і нам відкриється вікно для додавання елементів ComboBox:
Елемент ComboBox
// додаємо один елемент comboBox1.Items.Remove("Аргентина");
comboBox1.Items.Add("Парагвай"); // видаляємо елемент по індексу
// додаємо набір елементів comboBox1.Items.RemoveAt(1);
comboBox1.Items.AddRange // видаляємо всі елементи
(new string[] { "Уругвай", "Эквадор" }); comboBox1.Items.Clear();
// додаємо один елемент на певну отримати елемент з індексом:
позицію comboBox1.Items[0] = "Парагвай";
comboBox1.Items.Insert(1, "Боливия");
// видаляємо один елемент
Елемент ComboBox
З допомогою ряду властивостей можна налаштувати стиль оформлення
компонента. Так, властивість DropDownWidth задає ширину випадаючого
списку. За допомогою властивості DropDownHeight можна встановити висоту
випадаючого списку. Ще одна властивість MaxDropDownItems дозволяє
задати кількість видимих елементів списку - від 1 до 100. За замовчуванням
це число дорівнює 8.
Інша властивість DropDownStyle задає стиль ComboBox. Воно може приймати
три можливих значення:
Dropdown: використовується за замовчуванням.
DropdownList: перехід – стрілка
Simple: перехід - клавіші клавіатури вгору/вниз
Елемент ComboBox
Привязка даних в ListBox і ComboBox
Крім прямого додавання елементів в колекцію Items компонентів ListBox і
ComboBox ми також можемо використовувати механізм прив'язки даних.
Прив'язка даних в ListBox і ComboBox реалізується за допомогою наступних
властивостей:
DataSource: джерело даних - небудь масив або колекція об'єктів
DisplayMember: властивість об'єкта, яке буде використовуватися для
відображення в ListBox / ComboBox
ValueMember: властивість об'єкта, яке буде використовуватися в якості його
значення
Привязка даних в ListBox і ComboBox
public partial class Form1 : Form { }
public Form1() { void listBox1_SelectedIndexChanged(object sender,
EventArgs e) {
InitializeComponent();
// отримуємо id виділеного об'єкта
List<Phone> phones = new List<Phone> {
int id = (int)listBox1.SelectedValue;
new Phone { Id=11, Name="Samsung Galaxy Ace 2",
Year=2012}, // получаем весь выделенный объект
new Phone { Id=12, Name="Samsung Galaxy S4", Phone phone = (Phone)listBox1.SelectedItem;
Year=2013},
MessageBox.Show(id.ToString() + ". " + phone.Name);
new Phone { Id=13, Name="iPhone 6", Year=2014},
}
new Phone { Id=14, Name="Microsoft Lumia 435",
Year=2015}, }
new Phone { Id=15, Name="Xiaomi Mi 5", Year=2015} class Phone {
}; public int Id { get; set; }
listBox1.DataSource = phones; public string Name { get; set; }
listBox1.DisplayMember = "Name"; public int Year { get; set; }
listBox1.ValueMember = "Id"; }
listBox1.SelectedIndexChanged +=
listBox1_SelectedIndexChanged;
Елемент CheckedListBox
Елемент CheckedListBox являє симбіоз компонентів ListBox і CheckBox. Для кожного елемента списку
визначено спеціальне поле CheckBox, яке можна відзначити. Всі елементи задаються у CheckedListBox
задаються властивості Items. Також, як і для елементів ListBox і ComboBox, ми можемо задати набір
елементів. За замовчуванням для кожного доданого нового елемента прапорець не відзначено:
Елемент CheckedListBox
Властивість MultiColumn при значенні true дозволяє зробити
многоколоночный список, якщо елементи не поміщаються по довжині:
Елемент CheckedListBox
Виділений елемент ми також можемо отримати за допомогою властивості SelectedItem, а
його індекс - за допомогою властивості SelectedIndex. Але це вірно тільки, якщо для
властивості SelectionMode встановлено значення One, що передбачає виділення одного
елемента.
При установці властивості SelectionMode значень MultiSimple і MultiExtended можна
вибрати відразу декілька елементів, і тоді всі вибрані елементи будуть доступні
властивості SelectedItems, а їх індекси - у властивості SelectedIndeces.
І оскільки ми можемо поставити позначку " не для всіх обраних елементів, то щоб
отримати окремо зазначені елементи, у CheckedListBox є властивості CheckedItems і
CheckedIndices.
Елемент CheckedListBox
Для додавання і видалення елементів в CheckedListBox визначені всі ті ж
методи, що і в ListBox:
Add(item): додає один елемент
AddRange(array): додає в список масив елементів
Insert(index, item): додає елемент з певного індексу
Remove(item): видаляє елемент
RemoveAt(index): видаляє елемент з певного індексу
Clear(): повністю очищає список
Елемент CheckedListBox
SetItemChecked и SetItemCheckState
checkedListBox1.SetItemChecked(0, true);
checkedListBox1.SetItemCheckState(1, CheckState.Indeterminate);
Елементи NumericUpDown и DomainUpDown

Елемент NumericUpDown надає користувачеві вибір числа з визначеного


діапазону. Для визначення діапазону чисел для вибору NumericUpDown
має дві властивості: Minimum (задає мінімальне число) і Maximum (задає
максимальне число).
Саме значення елемента зберігається у властивості Value:
За замовчуванням елемент відображає десяткові числа. Однак якщо ми
встановимо його властивість Hexadecimal рівним true, то елемент буде
відображати всі числа в шістнадцятковій системі.
Елементи NumericUpDown и DomainUpDown
Якщо ми хочемо відображати в поле дробові числа, то можна використовувати властивість після
коми, яке вказує, скільки знаків після коми повинно відображатися. За замовчуванням ця властивість
дорівнює нулю. Також можна задати відображення тисячного роздільника. Для цього властивості
ThousandsSeparator треба встановити значення true. Наприклад, numericUpDown при Value=1000,03,
DecimalPlaces=2 и ThousandsSeparator=true:
Елементи NumericUpDown и DomainUpDown

При цьому треба враховувати, що якщо ми встановлюємо значення властивості Value у вікні
властивостей, то там в якості роздільника цілої та дробової частини використовується кома.
Якщо ж ми встановлюємо властивість в коді, тоді як роздільник використовується крапка.
За замовчуванням при натисканні на стрілочки вгору-вниз на елементі значення буде
збільшуватися, або зменшуватися на одиницю. Але з допомогою властивості Increment
можна задати інший крок прирощення, в тому числі і дробовий.
При роботі з NumericUpDown слід враховувати, що його властивість Value (як і властивості
Minimum і Maximum) зберігає значення decimal. Тому в коді ми також повинні з ним
працювати як з decimal, а не як до типу int або double.
Елементи NumericUpDown и DomainUpDown
Елемент DomainUpDown призначений для введення текстової інформації. Список для

DomainUpDown задається за допомогою властивості Items. Список можна впорядкувати за

алфавітом (властивість Sorted = true). Цикл - властивість Wrap значення true. У коді вибране

значення в DomainUpDown доступно через властивість Text.


Елементи NumericUpDown и DomainUpDown
public partial class Form1 : Form { domainUpDown1.TextChanged +=
public Form1() { domainUpDown1_TextChanged;
InitializeComponent(); }
List<string> states = new List<string> void domainUpDown1_TextChanged
{ "Аргентина", "Бразилия", (object sender, EventArgs e)
"Венесуэла", "Колумбия", "Чили" { MessageBox.Show(domainUpDown1.Tex
}; t);
domainUpDown1.Items.AddRange(states) }
; }
Елемент ImageList
Ключовою властивістю ImageList є
властивість Images, яке задає колекцію
зображень.
imageList1.Images.Add(Image.FromFile(@"C
:\Users\Eugene\Pictures\uruguay.png"));
imageList1.Images.RemoveAt(0); //
видаляємо перше зображення
Елемент ImageList
Щоб робити розібратися, як
використовувати ImageList, додамо в
нього три зображення і помістимо на
форму три чекбокса. У кожного
чекбокса приберемо тест і встановимо
властивість ImageList і вкажемо
властивості ImageIndex індекс
зображення з imageList1:
Елемент ListView
Елемент ListView
Виконаємо невелику практичну задачу: виберемо всі назви файлів з якоїсь папки в ListView.
У ListView властивості View встановимо значення SmallIcon.
Елемент ListView
using System; // перебір отриманих файлів
using System.ComponentModel; foreach(string file in files) {
using System.IO; ListViewItem lvi = new ListViewItem();
using System.Windows.Forms; // установка назви файлу
namespace HelloApp { lvi.Text = file.Remove(0,
public partial class Form1 : Form { file.LastIndexOf('\\') + 1);
public Form1() { lvi.ImageIndex = 0;
InitializeComponent(); // установка картинки для файлу
listView1.SmallImageList = imageList1; // додаємо елемент в ListView
} listView1.Items.Add(lvi);
private void button1_Click }
(object sender, EventArgs e) { }
string path = textBox1.Text; }
// получаем все файлы }
string[] files = Directory.GetFiles(path);
Елемент TreeView
TreeView представляє візуальний елемент
у вигляді дерева. Дерево містить сайти,
які представляють об'єкти TreeNode.
Вузли можуть містити інші подузлы і
можуть перебувати як приховане, так і в
розкритому стані. Всі вузли містяться у
властивості Nodes. Якщо ми персонажем
в панелі Властивостей на властивість
Nodes, то нам відкриється вікно
редагування вузлів TreeView:
Елемент
TreeView
Елемент TreeView
FirstNode: перший дочірній вузол
LastNode: останній дочірній вузол
NextNode: повертає наступний сестринський вузол по відношенню до поточного
NextVisibleNode: повертає наступний видимий вузол по відношенню до поточного
PrevNode: повертає попередній сестринський вузол по відношенню до поточного
PrevVisibleNode: повертає попередній видимий вузол по відношенню до поточного
Nodes: повертає колекцію дочірніх вузлів
Parent: повертає батьківський вузол для поточного вузла
TreeView: повертає об'єкт TreeView, в якому визначено поточний вузол
Елемент TreeView
TreeNode tovarNode = new TreeNode("Товари");

tovarNode.Nodes.Add(new TreeNode("Смартфони")); // Додаємо новий дочірній вузол до tovarNode

treeView1.Nodes.Add(tovarNode); // Додаємо tovarNode разом з дочірніми вузлами в TreeView

treeView1.Nodes[0].Nodes.Add(new TreeNode("Планшети")); // Додаємо другий дочірній вузол до

першого вузла у TreeView

treeView1.Nodes[0].Nodes.RemoveAt(1); // видалення першого вузла другого дочірнього підвузла

treeView1.Nodes.Remove(tovarNode); // Видалення вузла tovarNode і всіх його дочірніх вузлів

tovarNode.Expand(); // розкриття вузла

tovarNode.ExpandAll(); // розкриття не тільки вузла, але і всіх його дочірніх підвузлів

tovarNode.Collapse(); // приховування вузла


Елемент TreeView
treeView1.CheckBoxes = true;
TreeNode smartNode = new
TreeNode("Смартфони");
smartNode.Checked = true;
treeView1.Nodes.Add(smartNode);
treeView1.Nodes.Add(new
TreeNode("Планшети"));
treeView1.Nodes.Add(new
TreeNode("Ноутбуки"));
Елемент TreeView
TreeView має низку подій, які дозволяють
нам керувати деревом. Найбільш
важливі з них:
BeforeSelect / AfterSelect: спрацьовує
перед / після вибору вузла дерева
BeforeExpand / AfterExpand: спрацьовує
перед / після розкриття вузла дерева
BeforeCollapse / AfterCollapse: спрацьовує
перед / після приховування вузла дерева
Елемент TreeView
using System; {
using System.Collections.Generic; public Form1()
using System.ComponentModel; {
using System.IO; InitializeComponent();
using System.Windows.Forms;
treeView1.BeforeSelect +=
namespace HelloApp treeView1_BeforeSelect;
{ treeView1.BeforeExpand +=
public partial class Form1 : Form treeView1_BeforeExpand;
// заповнюємо дерево дисками
FillDriveNodes();
}
Елемент TreeView
// подія перед розкриттям вузла for (int i = 0; i < dirs.Length; i++)
void treeView1_BeforeExpand(object sender, {
TreeViewCancelEventArgs e) TreeNode dirNode = new TreeNode(new
{ DirectoryInfo(dirs[i]).Name);
e.Node.Nodes.Clear(); FillTreeNode(dirNode, dirs[i]);
string[] dirs; e.Node.Nodes.Add(dirNode);
try }
{ }
if (Directory.Exists(e.Node.FullPath)) }
{ }
dirs = Directory.GetDirectories(e.Node.FullPath); catch (Exception ex) { }
if (dirs.Length != 0) }
{
Елемент TreeView
// подія перед виділенням вузла TreeNode dirNode = new
void treeView1_BeforeSelect(object sender, TreeNode(new DirectoryInfo(dirs[i]).Name);
TreeViewCancelEventArgs e) FillTreeNode(dirNode, dirs[i]);
{ e.Node.Nodes.Add(dirNode);
e.Node.Nodes.Clear(); }
string[] dirs; }
try { }
if(Directory.Exists(e.Node.FullPath)) { }
dirs = catch (Exception ex) { }
Directory.GetDirectories(e.Node.FullPath); }
if (dirs.Length!= 0) {
for(int i=0; i<dirs.Length;i++) {
Елемент TreeView
// отримуємо всі диски на комп'ютері // отримуємо дочірні вузли для певного вузла
private void FillDriveNodes() { private void FillTreeNode(TreeNode driveNode, string
try { path) {
foreach(DriveInfo drive in DriveInfo.GetDrives()) { try {
TreeNode driveNode = new TreeNode { Text string[] dirs = Directory.GetDirectories(path);
= drive.Name }; foreach (string dir in dirs) {
FillTreeNode(driveNode, drive.Name); TreeNode dirNode = new TreeNode();
treeView1.Nodes.Add(driveNode); dirNode.Text = dir.Remove(0, dir.LastIndexOf("\\")
} } + 1);
catch (Exception ex) { } driveNode.Nodes.Add(dirNode);
} } } catch (Exception ex) { }
} } }
Елементи TrackBar, Timer і ProgressBar
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
// встановлення обробника події Scroll
trackBar1.Scroll+=trackBar1_Scroll;
}
private void trackBar1_Scroll(object sender, EventArgs e)
{
label1.Text = String.Format("Поточне значення: {0}", trackBar1.Value);
}
}
void timer1_Tick(object sender, EventArgs e) {
Timer if (button1.Left == (this.Width-button1.Width-10))

public partial class Form1 : Form { {

int koef = 1; koef=-1; }

public Form1() { else if (button1.Left == 0) {

InitializeComponent(); koef = 1; }

this.Width = 400; button1.Width = 40; button1.Left += 10 *koef;

button1.Left = 40; button1.Text = ""; }

button1.BackColor = Color.Aqua; // оброблювач натискання на кнопку

timer1.Interval = 500; // 500 мілісекунд void button1_Click(object sender, EventArgs e) {

timer1.Enabled = true; button1.Click += if(timer1.Enabled==true) { timer1.Stop();

button1_Click; } else { timer1.Start();

timer1.Tick += timer1_Tick; } } }

}
// обробник події Tick таймера
Елементи TrackBar, Timer і ProgressBar
Через кожний інтервал таймера буде спрацьовувати обробник timer1_Tick, в якому змінюється

положення кнопки по горизонталі за допомогою властивості button1.Left. А за допомогою

додаткової змінної koef можна керувати напрямом руху. Крім того, за допомогою обробника

натискання кнопки button1_Click можна зупинити таймер (і разом з ним рух кнопки), або знову

запустити його.
Елементи TrackBar, Timer і ProgressBar
public partial class Form1 : Form { }
public Form1() { // обробник події Tick таймера
InitializeComponent(); void timer1_Tick(object sender, EventArgs e) {
timer1.Interval = 500; // 500 мілісекунд progressBar1.PerformStep();
timer1.Enabled = true; } }
timer1.Tick += timer1_Tick;
Елементи DateTimePicker і
MonthCalendar
DateTimePicker являє
розкривається по
натисненню календар, в
якому можна вибрати дату.
елемент, який з допомогою
переміщення повзунка
дозволяє вводити числові
значення.
Елементи DateTimePicker і
MonthCalendar
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
dateTimePicker1.Format = DateTimePickerFormat.Time;
dateTimePicker1.ValueChanged+=dateTimePicker1_ValueChanged;
}
private void dateTimePicker1_ValueChanged(object sender, EventArgs e) {
label1.Text = String.Format("Ви вибрали: {0}", dateTimePicker1.Value.ToLongTimeString());
}
}
Елементи DateTimePicker і MonthCalendar
monthCalendar1.TodayDate= new DateTime(2015, 05, 22);
monthCalendar1.ShowTodayCircle = true;
monthCalendar1.ShowToday = false;
monthCalendar1.SelectionStart = new DateTime(2015, 05, 1);
monthCalendar1.SelectionEnd = new DateTime(2015, 05, 11);
Елемент PictureBox
Елемент WebBrowser
public partial class Form1 : Form {

public Form1() {

InitializeComponent();

// установка початкової адреси

webBrowser1.Url=new

Uri("http://google.com");

button1.Click+=button1_Click;

private void button1_Click

(object sender, EventArgs e) { webBrowser1.Navigate(textBox1.Text);

}
Елемент ErrorProvider
using System;
using System.ComponentModel;
using System.Windows.Forms;
namespace HelloApp {
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
nameBox.Validating += nameBox_Validating;
ageBox.Validating += ageBox_Validating;
}
private void nameBox_Validating(object sender, (object sender, CancelEventArgs e) {
CancelEventArgs e) { int age = 0;
if (String.IsNullOrEmpty(nameBox.Text)) { if (String.IsNullOrEmpty(ageBox.Text)) {
errorProvider1.SetError(nameBox, "Не errorProvider1.SetError(ageBox, "Не вказано вік!");
вказано ім'я!"); }
} else if (!Int32.TryParse(ageBox.Text, out age)) {
else if (nameBox.Text.Length < 4) { errorProvider1.SetError(ageBox, " Неправельний
errorProvider1.SetError(nameBox, вік!");
"Занадто коротке ім'я!"); } else {
} else { errorProvider1.Clear();
errorProvider1.Clear(); } } } }
} }
private void ageBox_Validating
Панель інструментів ToolStrip
Елемент MenuStrip
Меню MenuStrip
public partial class Form1 : Form { aboutItem.Click += aboutItem_Click;
public Form1() { menuStrip1.Items.Add(aboutItem);
InitializeComponent(); }
ToolStripMenuItem fileItem = new void aboutItem_Click (object sender, EventArgs
ToolStripMenuItem("Файл"); e) {
fileItem.DropDownItems.Add("Створити"); MessageBox.Show("Про програму");
fileItem.DropDownItems.Add(new }
ToolStripMenuItem("Зберегти")); }
menuStrip1.Items.Add(fileItem);
ToolStripMenuItem aboutItem = new
ToolStripMenuItem("Про програму");
Меню MenuStrip
Меню MenuStrip
public partial class Form1 : Form { saveItem.CheckedChanged +=
public Form1() { menuItem_CheckedChanged;
InitializeComponent(); ToolStripMenuItem fileItem.DropDownItems.Add(saveItem);
fileItem = new ToolStripMenuItem("Файл"); menuStrip1.Items.Add(fileItem);
ToolStripMenuItem newItem = new }
ToolStripMenuItem("Створити") { Checked = true,
CheckOnClick = true };
fileItem.DropDownItems.Add(newItem);
ToolStripMenuItem saveItem = new
ToolStripMenuItem("Зберегти") { Checked = true,
CheckOnClick = true };
Меню MenuStrip

void menuItem_CheckedChanged(object sender, EventArgs e) {

ToolStripMenuItem menuItem = sender as ToolStripMenuItem;

if (menuItem.CheckState == CheckState.Checked)

MessageBox.Show("Відзначений");

else if (menuItem.CheckState == CheckState.Unchecked)

MessageBox.Show("Відмітка знята");

}
Меню MenuStrip
fileToolStripMenuItem.Image =
Image.FromFile(@"D:\Icons\0023\block32.png");
Елемент StatusStrip
Елемент StatusStrip
public partial class Form1 : Form { statusStrip1.Items.Add(infoLabel);
ToolStripLabel dateLabel; statusStrip1.Items.Add(dateLabel);
ToolStripLabel timeLabel; statusStrip1.Items.Add(timeLabel);
ToolStripLabel infoLabel; timer = new Timer() { Interval = 1000 };
Timer timer; timer.Tick += timer_Tick;
public Form1() { timer.Start();
InitializeComponent(); }
infoLabel = new ToolStripLabel(); void timer_Tick(object sender, EventArgs e) {
infoLabel.Text = "Текущие дата и время:"; dateLabel.Text = DateTime.Now.ToLongDateString();
dateLabel = new ToolStripLabel(); timeLabel.Text =
timeLabel = new ToolStripLabel(); DateTime.Now.ToLongTimeString();
}}
Елемент StatusStrip
Меню ContextMenuStrip
ContextMenuStrip являє контекстне меню. Даний компонент у чому
аналогічний елементи MenuStrip за тим винятком, що контекстне меню не
може використовуватися саме по собі, воно обов'язково застосовується до
якого-небудь елементу, наприклад, текстового поля.

Тепер створимо невелику програму. Додамо на форму елементи


ContextMenuStrip і TextBox, які будуть мати назви contextMenuStrip1 і
textBox1 відповідно. Потім змінимо код форми наступним чином:
Меню ContextMenuStrip
public partial class Form1 : Form { ToolStripMenuItem pasteMenuItem = new
string buffer; ToolStripMenuItem("Вставити");
public Form1() { // додаємо елементи в меню
InitializeComponent(); contextMenuStrip1.Items.AddRange(new[]
textBox1.Multiline = true; { copyMenuItem, pasteMenuItem });
textBox1.Dock = DockStyle.Fill; // асоціюємо контекстне меню з текстовим
// створюємо елементи меню полем
ToolStripMenuItem copyMenuItem = new textBox1.ContextMenuStrip = contextMenuStrip1;
ToolStripMenuItem("Копировать"); // встановлюємо обробники подій для меню
copyMenuItem.Click += copyMenuItem_Click;
pasteMenuItem.Click += pasteMenuItem_Click;
}
Меню ContextMenuStrip
// вставка тексту
void pasteMenuItem_Click(object sender, EventArgs e) {
textBox1.Paste(buffer);
}
// копіювання тексту
void copyMenuItem_Click(object sender, EventArgs e) {
// якщо виділений текст у текстовому полі, копіюємо його в буфер
buffer = textBox1.SelectedText;
}
}
Меню ContextMenuStrip
В даному випадку виконана найпростіша реалізація функціональності copy-
paste. У меню додається два елемента. А у текстового поля встановлюється
многострочность, і воно розтягується по ширині контейнера.
І все буде добре…

You might also like