📌 Визначення: Додаток, який використовує кілька вікон, називається багатовіконним. З точки зору програмування, кожне вікно є формою. Тобто, багатовіконний інтерфейс — це інтерфейс з кількох пов'язаних форм.
1. Основи роботи з формами
Для Windows-додатка за замовчуванням створюється клас Form1, який є похідним від класу Form. Якщо в проект додається нова форма (наприклад, через меню Проект → Додати форму), то створюється клас Form2, Form3 і т.д. Усі ці класи також є похідними від Form.
🔹 Додавання ще однієї форми
Щоб додати ще одну форму до проекту, потрібно виконати наступну команду в меню Visual Studio:
- Проект → Додати форму (Windows Forms) → вказати ім'я (наприклад,
Form2.cs).
Після додавання у проекті з'являється новий клас, який можна відкривати, показувати або передавати йому дані.
2. Проблема передачі даних між формами
Часто потрібно передати інформацію з Form1 до Form2 (наприклад, текст, число, об'єкт). Існує кілька способів: через конструктор, публічні властивості, події або окремий статичний клас-сховище. Розглянемо найпростіший і зручний підхід — статичний клас для передачі даних.
Введення даних
3. Статичний клас DataBridge (повністю робочий)
Створимо окремий клас DataBridge, який буде зберігати дані для передачі між формами.
using System.Collections.Generic;
namespace БагатовіконнийІнтерфейс
{
/// <summary>
/// Статичний клас-міст для передачі даних між Form1 та Form2
/// </summary>
public static class DataBridge
{
// Властивості для зберігання інформації
public static string UserName { get; set; }
public static int UserAge { get; set; }
// Список для демонстрації передачі колекцій
public static List<string> Items { get; set; } = new List<string>();
// Метод для скидання даних
public static void Clear()
{
UserName = null;
UserAge = 0;
Items.Clear();
}
}
}
4. Код Form1 (відправлення даних)
У Form1 заповнюємо дані (з текстових полів) і записуємо їх у статичний клас. Потім відкриваємо Form2.
using System;
using System.Windows.Forms;
namespace БагатовіконнийІнтерфейс
{
public partial class Form1 : Form
{
// Контроли форми
private TextBox txtName;
private TextBox txtAge;
private Button btnOpenForm2;
private Button btnCloseForm1;
private Label label1;
private Label label2;
public Form1()
{
InitializeComponent();
SetupForm();
}
/// <summary>
/// Ручне налаштування форми (якщо немає дизайнера)
/// </summary>
private void SetupForm()
{
this.Text = "Form1 - Введення даних";
this.Size = new System.Drawing.Size(400, 250);
this.StartPosition = FormStartPosition.CenterScreen;
label1 = new Label { Text = "Ім'я:", Location = new System.Drawing.Point(30, 30), Size = new System.Drawing.Size(80, 25) };
txtName = new TextBox { Location = new System.Drawing.Point(120, 30), Size = new System.Drawing.Size(200, 25) };
label2 = new Label { Text = "Вік:", Location = new System.Drawing.Point(30, 70), Size = new System.Drawing.Size(80, 25) };
txtAge = new TextBox { Location = new System.Drawing.Point(120, 70), Size = new System.Drawing.Size(200, 25) };
btnOpenForm2 = new Button
{
Text = "Відкрити Form2",
Location = new System.Drawing.Point(120, 120),
Size = new System.Drawing.Size(150, 35),
BackColor = System.Drawing.Color.LightBlue
};
btnOpenForm2.Click += BtnOpenForm2_Click;
btnCloseForm1 = new Button
{
Text = "Вийти з додатку",
Location =newSystem.Drawing.Point(120, 160),
Size = new System.Drawing.Size(150, 35),
BackColor = System.Drawing.Color.LightBlue
};
btnCloseForm1.Click += BtnCloseForm1_Click;
this.Controls.AddRange(new Control[] { label1, txtName, label2, txtAge, btnOpenForm2, btnCloseForm1 });
}
private void BtnCloseForm1_Click (object sender, EventArgs e)
{
Application.Exit();
}
private void BtnOpenForm2_Click(object sender, EventArgs e)
{
try
{
// Запис даних у статичний клас
DataBridge.UserName = txtName.Text.Trim();
if (string.IsNullOrEmpty(DataBridge.UserName))
{
MessageBox.Show("Введіть ім'я!", "Попередження",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
if (int.TryParse(txtAge.Text, out int age))
{
DataBridge.UserAge = age;
}
else
{
DataBridge.UserAge = 0;
}
DataBridge.Items.Clear();
DataBridge.Items.Add($"Користувач: {DataBridge.UserName}");
DataBridge.Items.Add($"Вік: {DataBridge.UserAge}");
DataBridge.Items.Add($"Час входу: {DateTime.Now.ToShortTimeString()}");
// Створюємо та показуємо Form2
Form2 f2 = new Form2();
f2.ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show($"Помилка: {ex.Message}", "Помилка",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
5. Код Form2 (отримання даних)
У Form2 при завантаженні зчитуємо дані з DataBridge і відображаємо їх.
using System;
using System.Windows.Forms;
namespace БагатовіконнийІнтерфейс
{
public partial class Form2 : Form
{
private Label lblWelcome;
private Label lblAge;
private ListBox listBox1;
private Button btnClose;
public Form2()
{
InitializeComponent();
SetupForm();
}
private void SetupForm()
{
this.Text = "Form2 - Отримані дані";
this.Size = new System.Drawing.Size(450, 350);
this.StartPosition = FormStartPosition.CenterScreen;
this.Load += Form2_Load;
lblWelcome = new Label
{
Location = new System.Drawing.Point(30, 30),
Size = new System.Drawing.Size(350, 30),
Font = new System.Drawing.Font("Arial", 12, System.Drawing.FontStyle.Bold)
};
lblAge = new Label
{
Location = new System.Drawing.Point(30, 70),
Size = new System.Drawing.Size(350, 25),
Font = new System.Drawing.Font("Arial", 10)
};
listBox1 = new ListBox
{
Location = new System.Drawing.Point(30, 110),
Size = new System.Drawing.Size(350, 130)
};
btnClose = new Button
{
Text = "Закрити",
Location = new System.Drawing.Point(150, 260),
Size = new System.Drawing.Size(100, 35),
BackColor = System.Drawing.Color.LightCoral
};
btnClose.Click += (s, e) => this.Close();
this.Controls.AddRange(new Control[] { lblWelcome, lblAge, listBox1, btnClose });
}
private void Form2_Load(object sender, EventArgs e)
{
try
{
string userName = DataBridge.User ?? "Гість";
int userAge = DataBridge.UserAge;
lblWelcome.Text = $"Вітаємо, {userName}!";
lblAge.Text = userAge > 0 ? $"Ваш вік: {userAge} років" : "Вік не вказано";
if (DataBridge.Items.Count > 0)
{
listBox1.DataSource = null;
listBox1.DataSource = DataBridge.Items;
}
else
{
listBox1.Items.Add("Немає даних для відображення");
}
this.Text = $"Form2 - Дані для: {userName}";
}
catch (Exception ex)
{
MessageBox.Show($"Помилка завантаження Form2: {ex.Message}",
"Помилка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
6. Точка входу Program.cs
Головний файл програми, який запускає Form1.
using System;
using System.Windows.Forms;
namespace БагатовіконнийІнтерфейс
{
internal static class Program
{
/// <summary>
/// Головна точка входу для додатка.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
7. Переваги та застереження
✅ Переваги
- Простота реалізації
- Глобальний доступ без створення об'єктів
- Зручно для невеликих проєктів
- Дані не залежать від життєвого циклу форми
⚠️ Недоліки / увага
- Дані залишаються в пам'яті на весь час роботи програми
- Потрібно вручну очищати (якщо необхідно)
- Не підходить для складних сценаріїв з багатьма формами
8. Інструкція з використання
- 🗂️ Створіть новий проект Windows Forms App (.NET або .NET Framework)
- 📦 Назвіть проект
БагатовіконнийІнтерфейс - ➕ Додайте новий файл класу
DataBridge.csі вставте код з пункту 3 - ➕ Додайте нову форму
Form2.csі вставте код з пункту 5 - ✏️ Замініть код
Form1.csна код з пункту 4 - ✏️ Замініть код
Program.csна код з пункту 6 - ▶️ Запустіть проект (F5)