Повернутися

🪟 Багатовіконний інтерфейс · статичний клас для передачі даних

Методичка з ПОВНІСТЮ РОБОЧИМ кодом (Windows Forms, C#)

📌 Визначення: Додаток, який використовує кілька вікон, називається багатовіконним. З точки зору програмування, кожне вікно є формою. Тобто, багатовіконний інтерфейс — це інтерфейс з кількох пов'язаних форм.

1. Основи роботи з формами

Для Windows-додатка за замовчуванням створюється клас Form1, який є похідним від класу Form. Якщо в проект додається нова форма (наприклад, через меню Проект → Додати форму), то створюється клас Form2, Form3 і т.д. Усі ці класи також є похідними від Form.

🔹 Додавання ще однієї форми

Щоб додати ще одну форму до проекту, потрібно виконати наступну команду в меню Visual Studio:

  • ПроектДодати форму (Windows Forms) → вказати ім'я (наприклад, Form2.cs).

Після додавання у проекті з'являється новий клас, який можна відкривати, показувати або передавати йому дані.

2. Проблема передачі даних між формами

Часто потрібно передати інформацію з Form1 до Form2 (наприклад, текст, число, об'єкт). Існує кілька способів: через конструктор, публічні властивості, події або окремий статичний клас-сховище. Розглянемо найпростіший і зручний підхід — статичний клас для передачі даних.

💡 Чому статичний клас? Він існує в єдиному екземплярі, доступний з будь-якої форми без створення об'єкта. Ідеально підходить для швидкого обміну даними між вікнами.

Введення даних

3. Статичний клас DataBridge (повністю робочий)

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

📁 DataBridge.cs
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.

✏️ Form1.cs
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 і відображаємо їх.

📄 Form2.cs
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.

🚀 Program.cs
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. Інструкція з використання

  1. 🗂️ Створіть новий проект Windows Forms App (.NET або .NET Framework)
  2. 📦 Назвіть проект БагатовіконнийІнтерфейс
  3. ➕ Додайте новий файл класу DataBridge.cs і вставте код з пункту 3
  4. ➕ Додайте нову форму Form2.cs і вставте код з пункту 5
  5. ✏️ Замініть код Form1.cs на код з пункту 4
  6. ✏️ Замініть код Program.cs на код з пункту 6
  7. ▶️ Запустіть проект (F5)
📌 Важливо: Весь код є повністю робочим і не потребує дизайнера Forms. Контроли створюються програмно, тому проект буде працювати одразу після копіювання.