Назад Вперед Зміст

Передача форми в якості параметра в інші форми

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

1 спосіб: створити статичний клас, який містить об'єкти, необхідні для роботи різних форм (це вже робили)

2 спосіб: передати форму, в якій містяться необхідні дані, в якості параметра в інші форми. При цьому важливо пам'ятати, що недостатньо передати лише форму, необхідно також забезпечити доступ до необхідних полів, оскільки за замовчуванням всі поля (елементи форми, які описуються в дизайнері) мають модифікатор доступу private. Тому для необхідних полів форми необхідно створити властивості.

Розглянемо ці способи на прикладі однієї задачі.

Завдання: Авторизація - реєстрація

Потрібно передбачити можливість:

Список (List) зареєстрованих користувачів (ім'я, логін, пароль), наприклад, такий:

Початкове значення цього списку (List) може:

Авторизація

При заповненні полів (логін і пароль) головної форми Form1 і натисканні кнопки Авторизація, виконується пошук введених даних у списку зареєстрованих користувачів. Якщо пошук успішний, то відкривається форма Form3. В заголовку форми вказується ім'я і логін авторизованого користувача. Тобто ім'я і логін передаються з Form1 в Form3

Якщо в Form3 натиснути кнопку «Вивести список», виведеться список всіх зареєстрованих користувачів. Тобто в Form3 ми маємо доступ до всього списку

Якщо в першій формі поля не заповнені або введений логін або пароль відсутній у списку, виводиться повідомлення.

Реєстрація

Якщо в головній формі натиснути кнопку Реєстрація, відкривається форма Form2, яка після заповнення і натискання кнопки Зареєструвати, додає нового користувача до списку зареєстрованих користувачів і закривається.

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

Якщо введені паролі не співпадають, з'являється повідомлення і форма закривається.

1 спосіб

class User

Створимо клас User, який буде описувати користувача.

/// 
/// Клас, що представляє користувача системи
/// 
public class User
{
    private string _name;        // Ім'я користувача
    private string _login;       // Унікальний логін
    private string _passwordHash; // Хеш пароля (не зберігаємо пароль у чистому вигляді)

    /// 
    /// Конструктор класу User
    /// 
    /// Ім'я користувача
    /// Логін
    /// Пароль (буде захешований)
    public User(string name, string login, string password)
    {
        Name = name ?? throw new ArgumentNullException(nameof(name));
        Login = login ?? throw new ArgumentNullException(nameof(login));
        SetPassword(password ?? throw new ArgumentNullException(nameof(password)));
    }

    /// 
    /// Ім'я користувача
    /// 
    public string Name
    {
        get => _name;
        set => _name = !string.IsNullOrWhiteSpace(value) 
            ? value.Trim() 
            : throw new ArgumentException("Ім'я не може бути порожнім");
    }

    /// 
    /// Логін користувача
    /// 
    public string Login
    {
        get => _login;
        set => _login = !string.IsNullOrWhiteSpace(value) 
            ? value.Trim().ToLower() 
            : throw new ArgumentException("Логін не може бути порожнім");
    }

    /// 
    /// Встановлення пароля (з хешуванням)
    /// 
    public void SetPassword(string password)
    {
        if (string.IsNullOrWhiteSpace(password) || password.Length <8)
            throw new ArgumentException("Пароль повинен містити принаймні 8 символів");

        _passwordHash = HashPassword(password);
    }

    /// 
    /// Перевірка пароля
    /// 
    public bool VerifyPassword(string password)
    {
        return VerifyHashedPassword(_passwordHash, password);
    }

    // Метод для хешування пароля (спрощена реалізація)
    private string HashPassword(string password)
    {
        using var sha256 = System.Security.Cryptography.SHA256.Create();
        byte[] hashedBytes = sha256.ComputeHash(System.Text.Encoding.UTF8.GetBytes(password));
        return Convert.ToBase64String(hashedBytes);
    }

    // Метод для перевірки пароля
    private bool VerifyHashedPassword(string hashedPassword, string password)
    {
        return HashPassword(password) == hashedPassword;
    }

    /// 
    /// Повертає рядкове представлення користувача
    /// 
    public override string ToString()
    {
        return $"{_name} ({_login})";
    }
}

class Reg

Створимо статичний клас Reg, в якому буде зберігатися список зареєстрованих користувачів (ім'я, логін, пароль). Елементи списку - об'єкти класу User.

Цей список буде створюватися в конструкторі головної форми Form1.

/// 
/// Статичний клас для управління реєстрацією та авторизацією користувачів
/// 
public static class Reg
{
    private static User _currentUser; // Поточний авторизований користувач
    private static readonly List _users = new List(); // Список зареєстрованих користувачів

    /// 
    /// Поточний авторизований користувач (тільки для читання)
    /// 
    public static User CurrentUser => _currentUser;

    /// 
    /// Список зареєстрованих користувачів (тільки для читання)
    /// 
    public static IReadOnlyCollection Users => _users.AsReadOnly();

    /// 
    /// Ініціалізація системи з тестовими користувачами
    /// 
    public static void Initialize()
    {
        // Додаємо тестових користувачів при першому запуску
        if (_users.Count == 0)
        {
            RegisterUser("Адміністратор", "admin", "Admin123");
            RegisterUser("Менеджер", "manager", "Manager123");
            RegisterUser("Гість", "guest", "Guest123");
        }
    }

    /// 
    /// Реєстрація нового користувача
    /// 
    public static bool RegisterUser(string name, string login, string password)
    {
        try
        {
            // Перевірка на унікальність логіна
            if (_users.Any(u => u.Login.Equals(login, StringComparison.OrdinalIgnoreCase)))
            {
                MessageBox.Show("Користувач з таким логіном вже існує", 
                              "Помилка реєстрації", 
                              MessageBoxButtons.OK, 
                              MessageBoxIcon.Warning);
                return false;
            }

            // Створення та додавання нового користувача
            User newUser = new User(name, login, password);
            _users.Add(newUser);
            return true;
        }
        catch (Exception ex)
        {
            MessageBox.Show($"Помилка при реєстрації: {ex.Message}", 
                          "Помилка", 
                          MessageBoxButtons.OK, 
                          MessageBoxIcon.Error);
            return false;
        }
    }

    /// 
    /// Авторизація користувача
    /// 
    public static bool Login(string login, string password)
    {
        var user = _users.FirstOrDefault(u => u.Login.Equals(login, StringComparison.OrdinalIgnoreCase));
        
        if (user != null && user.VerifyPassword(password))
        {
            _currentUser = user;
            return true;
        }

        _currentUser = null;
        return false;
    }

    /// 
    /// Вийти з системи
    /// 
    public static void Logout()
    {
        _currentUser = null;
    }
}

class Form1

Основні елементи:

class Form1. Обробник завантаження форми

Виконується при завантаженні головної форми. Назва обробника Form1_Load. Створює початковий список зареєстрованих користувачів і зберігає його у полі класу Reg.

private void Form_Load(object sender, EventArgs e)
{
    try
    {
        // Ініціалізація тестових користувачів
        // Використовуємо метод RegisterUser для правильної реєстрації
        Reg.RegisterUser("Іван", "admin", "SecurePass123!");
        Reg.RegisterUser("Петро", "user1", "UserPass111!");
        Reg.RegisterUser("Олексій", "user2", "UserPass222!");

        // Додаткові налаштування форми
        this.Text = "Система авторизації";
        this.BackColor = Color.LightGray;
        
        // Інформування про успішну ініціалізацію
        toolStripStatusLabel1.Text = "Система готова до роботи. Зареєстровано 3 тестових користувачі.";
    }
    catch (Exception ex)
    {
        MessageBox.Show($"Помилка ініціалізації: {ex.Message}", 
                      "Помилка", 
                      MessageBoxButtons.OK, 
                      MessageBoxIcon.Error);
    }
}

class Form1. Обробник кнопки Авторизація

Назва обробника button1_Click. Виконує пошук користувача у списку. Якщо знайдено, то присвоюємо знайденого користувача змінній у статичному класі та відкриваємо третю форму. Якщо не знайдено, виводимо повідомлення.

private void buttonLogin_Click(object sender, EventArgs e)
{
    try
    {
        // Отримання введених даних
        string login = textBoxLogin.Text.Trim();
        string password = textBoxPassword.Text;

        // Валідація введених даних
        if (string.IsNullOrEmpty(login) || string.IsNullOrEmpty(password))
        {
            MessageBox.Show("Будь ласка, введіть логін та пароль", 
                          "Попередження", 
                          MessageBoxButtons.OK, 
                          MessageBoxIcon.Warning);
            return;
        }

        // Спроба авторизації
        if (Reg.Login(login, password))
        {
            // Успішна авторизація
            this.Hide(); // Приховати поточну форму
            
            Form3 mainForm = new Form3();
            mainForm.Closed += (s, args) => this.Close(); // Закрити авторизацію при закритті головної форми
            mainForm.Show();
        }
        else
        {
            // Невдала спроба авторизації
            MessageBox.Show("Неправильний логін або пароль", 
                          "Помилка авторизації", 
                          MessageBoxButtons.OK, 
                          MessageBoxIcon.Error);
            
            // Очищення поля пароля
            textBoxPassword.Clear();
            textBoxPassword.Focus();
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show($"Сталася помилка: {ex.Message}", 
                      "Помилка", 
                      MessageBoxButtons.OK, 
                      MessageBoxIcon.Error);
    }
}

class Form1. Обробник кнопки Реєстрація

Назва обробника button2_Click. Відкриває форму для реєстрації користувача.

private void buttonRegister_Click(object sender, EventArgs e)
{
    try
    {
        // Створення форми реєстрації
        Form2 registrationForm = new Form2();
        
        // Відкриття форми як діалогового вікна
        DialogResult result = registrationForm.ShowDialog();
        
        // Після закриття форми реєстрації
        if (result == DialogResult.OK)
        {
            // Оновлення інтерфейсу або виконання додаткових дій
            MessageBox.Show("Реєстрація пройшла успішно!\nТепер ви можете увійти в систему.", 
                          "Реєстрація", 
                          MessageBoxButtons.OK, 
                          MessageBoxIcon.Information);
            
            // Очищення полів вводу
            textBoxLogin.Clear();
            textBoxPassword.Clear();
            textBoxLogin.Focus();
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show($"Помилка при відкритті форми реєстрації: {ex.Message}", 
                      "Помилка", 
                      MessageBoxButtons.OK, 
                      MessageBoxIcon.Error);
    }
}

class Form1. Обробник кнопки Вихід

Назва обробника button3_Click. Закриває програму.

private void buttonExit_Click(object sender, EventArgs e)
{
    // Підтвердження виходу з програми
    DialogResult result = MessageBox.Show("Ви впевнені, що хочете вийти з програми?", 
                                       "Підтвердження виходу",
                                       MessageBoxButtons.YesNo,
                                       MessageBoxIcon.Question,
                                       MessageBoxDefaultButton.Button2);

    if (result == DialogResult.Yes)
    {
        // Закриття всіх форм та завершення програми
        Application.Exit();
        
        // Додаткові дії перед виходом (необов'язково)
        // Наприклад, збереження даних чи логування
        // SaveUserSession();
        // Logger.Log("Application closed by user");
    }
    else
    {
        // Повернення фокусу на форму, якщо користувач скасував вихід
        this.Activate();
    }
}

class Form2

Основні елементи:

class Form2. Обробник кнопки Зареєструвати

Назва обробника button1_Click. Якщо все нормально, то додає користувача до списку. Якщо ні, виводить повідомлення.

private void buttonRegister_Click(object sender, EventArgs e)
{
    try
    {
        // Отримання даних з форми
        string name = textBoxName.Text.Trim();
        string login = textBoxLogin.Text.Trim();
        string password = textBoxPassword.Text;
        string confirmPassword = textBoxConfirmPassword.Text;

        // Валідація вхідних даних
        if (string.IsNullOrWhiteSpace(name) || 
            string.IsNullOrWhiteSpace(login) || 
            string.IsNullOrWhiteSpace(password))
        {
            MessageBox.Show("Будь ласка, заповніть всі обов'язкові поля", 
                          "Попередження", 
                          MessageBoxButtons.OK, 
                          MessageBoxIcon.Warning);
            return;
        }

        // Перевірка збігу паролів
        if (password != confirmPassword)
        {
            MessageBox.Show("Паролі не збігаються. Будь ласка, перевірте введені дані", 
                          "Помилка реєстрації", 
                          MessageBoxButtons.OK, 
                          MessageBoxIcon.Error);
            textBoxPassword.Clear();
            textBoxConfirmPassword.Clear();
            textBoxPassword.Focus();
            return;
        }

        // Перевірка міцності пароля
        if (password.Length < 8)
        {
            MessageBox.Show("Пароль повинен містити принаймні 8 символів", 
                          "Недостатня міцність пароля", 
                          MessageBoxButtons.OK, 
                          MessageBoxIcon.Warning);
            textBoxPassword.Clear();
            textBoxConfirmPassword.Clear();
            textBoxPassword.Focus();
            return;
        }

        // Спроба реєстрації користувача
        if (Reg.RegisterUser(name, login, password))
        {
            MessageBox.Show("Реєстрація успішна! Тепер ви можете увійти в систему", 
                          "Вітаємо", 
                          MessageBoxButtons.OK, 
                          MessageBoxIcon.Information);
            this.DialogResult = DialogResult.OK;
            this.Close();
        }
        else
        {
            MessageBox.Show("Користувач з таким логіном вже існує", 
                          "Помилка реєстрації", 
                          MessageBoxButtons.OK, 
                          MessageBoxIcon.Error);
            textBoxLogin.SelectAll();
            textBoxLogin.Focus();
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show($"Сталася помилка при реєстрації: {ex.Message}", 
                      "Помилка", 
                      MessageBoxButtons.OK, 
                      MessageBoxIcon.Error);
    }
}

class Form3

Основні елементи:

class Form3. Обробник завантаження форми

Назва обробника Form3_Load. Виводить в заголовок форми ім'я зареєстрованого користувача та його логін.

private void Form3_Load(object sender, EventArgs e)
{
    try
    {
        // Перевірка наявності авторизованого користувача
        if (Reg.CurrentUser == null)
        {
            MessageBox.Show("Користувач не авторизований", 
                          "Помилка доступу", 
                          MessageBoxButtons.OK, 
                          MessageBoxIcon.Error);
            this.Close();
            return;
        }

        // Встановлення заголовка форми з інформацією про користувача
        this.Text = $"Користувач: {Reg.CurrentUser.Name} (Логін: {Reg.CurrentUser.Login})";

        // Налаштування додаткових параметрів форми
        this.BackColor = Color.LightBlue;
        this.StartPosition = FormStartPosition.CenterScreen;
        this.Size = new Size(800, 600);

        // Ініціалізація даних користувача
        LoadUserData();
    }
    catch (Exception ex)
    {
        MessageBox.Show($"Помилка при завантаженні даних: {ex.Message}", 
                      "Помилка", 
                      MessageBoxButtons.OK, 
                      MessageBoxIcon.Error);
        this.Close();
    }
}

private void LoadUserData()
{
    // Тут може бути код для завантаження даних користувача
    // Наприклад:
    // labelWelcome.Text = $"Вітаємо, {Reg.CurrentUser.Name}!";
    // LoadUserSpecificContent();
}

class Form3. Обробник кнопки Вивести список

Назва обробника button1_Click. Додає елементи списку зареєстрованих користувачів до listBox1.

private void buttonDisplayUsers_Click(object sender, EventArgs e)
{
    try
    {
        // Очищення списку перед оновленням
        listBoxUsers.Items.Clear();

        // Перевірка наявності прав доступу
        if (Reg.CurrentUser == null || Reg.CurrentUser.Login != "admin")
        {
            MessageBox.Show("Доступ заборонено. Необхідні права адміністратора",
                          "Помилка доступу",
                          MessageBoxButtons.OK,
                          MessageBoxIcon.Warning);
            return;
        }

        // Формування списку користувачів (без відображення паролів)
        foreach (User user in Reg.Users)
        {
            // Безпечне відображення інформації (пароль приховано)
            string userInfo = $"{user.Name} (Логін: {user.Login})";
            listBoxUsers.Items.Add(userInfo);
        }

        // Інформування про кількість користувачів
        toolStripStatusLabel1.Text = $"Знайдено {Reg.Users.Count} користувачів";
    }
    catch (Exception ex)
    {
        MessageBox.Show($"Помилка при відображенні користувачів: {ex.Message}",
                      "Помилка",
                      MessageBoxButtons.OK,
                      MessageBoxIcon.Error);
    }
}

class Form3. Обробник кнопки Закрити

Назва обробника button2_Click. Закриває третю форму.

private void buttonCloseForm_Click(object sender, EventArgs e)
{
    // Підтвердження закриття форми
    DialogResult result = MessageBox.Show("Ви впевнені, що хочете закрити цю форму?", 
                                        "Підтвердження закриття",
                                        MessageBoxButtons.YesNo,
                                        MessageBoxIcon.Question,
                                        MessageBoxDefaultButton.Button2);

    if (result == DialogResult.Yes)
    {
        try
        {
            // Виконання дій перед закриттям (необов'язково)
            // Наприклад: SaveFormState();
            
            // Закриття поточної форми
            this.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show($"Помилка при закритті форми: {ex.Message}", 
                          "Помилка", 
                          MessageBoxButtons.OK, 
                          MessageBoxIcon.Error);
        }
    }
    else
    {
        // Повернення фокусу на форму, якщо користувач скасував закриття
        this.Activate();
    }
}

Задача: Бібліотека

Створити проект, що складається з трьох форм: Головна форма, Бібліотекар та Полиця.

Створимо бібліотеку з 6 книг: 3 книги одного автора та 3 книги іншого автора.

Спочатку створимо клас Book, що описує книгу, з полями: автор та назва.

Клас Book

/// 
/// Клас, що представляє книгу у бібліотечній системі
/// 
public class Book
{
    private string _author;    // Прізвище та ініціали автора
    private string _title;     // Назва книги
    private int _year;         // Рік видання
    private string _isbn;      // ISBN книги

    /// 
    /// Конструктор класу Book
    /// 
    /// Автор книги
    /// Назва книги
    public Book(string author, string title)
    {
        _author = author?.Trim() ?? throw new ArgumentNullException(nameof(author));
        _title = title?.Trim() ?? throw new ArgumentNullException(nameof(title));
        _year = DateTime.Now.Year; // Рік видання за замовчуванням
        _isbn = string.Empty;
    }

    /// 
    /// Конструктор з додатковими параметрами
    /// 
    public Book(string author, string title, int year, string isbn = "") : this(author, title)
    {
        Year = year; // Використовуємо властивість для валідації
        ISBN = isbn;
    }

    /// 
    /// Автор книги
    /// 
    public string Author
    {
        get { return _author; }
        set 
        {
            if (string.IsNullOrWhiteSpace(value))
                throw new ArgumentException("Автор не може бути порожнім");
            _author = value.Trim();
        }
    }

    /// 
    /// Назва книги
    /// 
    public string Title
    {
        get { return _title; }
        set 
        {
            if (string.IsNullOrWhiteSpace(value))
                throw new ArgumentException("Назва не може бути порожньою");
            _title = value.Trim();
        }
    }

    /// 
    /// Рік видання
    /// 
    public int Year
    {
        get { return _year; }
        set
        {
            if (value < 1455 || value > DateTime.Now.Year + 1)
                throw new ArgumentOutOfRangeException($"Рік має бути між 1455 та {DateTime.Now.Year + 1}");
            _year = value;
        }
    }

    /// 
    /// ISBN книги
    /// 
    public string ISBN
    {
        get { return _isbn; }
        set 
        {
            if (!string.IsNullOrEmpty(value) && !IsValidIsbn(value))
                throw new ArgumentException("Некоректний ISBN");
            _isbn = value?.Trim() ?? string.Empty;
        }
    }

    /// 
    /// Перевірка коректності ISBN
    /// 
    private bool IsValidIsbn(string isbn)
    {
        // Спрощена перевірка ISBN (можна реалізувати повну логіку)
        return System.Text.RegularExpressions.Regex.IsMatch(isbn, 
            @"^(?=(?:\D*\d){10}(?:(?:\D*\d){3})?$)[\d-]+$");
    }

    /// 
    /// Повертає рядкове представлення книги
    /// 
    public override string ToString()
    {
        return $"{_title} ({_author}, {_year})";
    }
}

Головна форма

Призначення форми: сформувати List список книг - об'єктів класу Book

Значення зчитуються з текстових полів. При натисканні кнопки «Додати в бібліотеку», створений об'єкт додається до списку List. Додаємо до бібліотеки три книги автора Прізвище1 та три книги автора Прізвище2.

При натисканні кнопки «Передати бібліотекарю» відкривається форма Бібліотекар, яка має використовувати створений список List.

Код форми:

public partial class Form1 : Form
{
    private List _books = new List(); // Список усіх книг у бібліотеці

    // Властивість для доступу до списку книг з інших форм
    public List Books
    {
        get { return _books; }
        set { _books = value; }
    }

    public Form1()
    {
        InitializeComponent();
        
        // Налаштування форми
        this.Text = "Бібліотека - Додавання книг";
        this.Size = new Size(500, 300);
        this.StartPosition = FormStartPosition.CenterScreen;
        
        // Налаштування елементів керування
        button1.Text = "Додати книгу";
        button2.Text = "Передати бібліотекарю";
        label1.Text = "Автор:";
        label2.Text = "Назва:";
        
        // Підказки для текстових полів
        textBox1.ToolTip = "Введіть ПІБ автора";
        textBox2.ToolTip = "Введіть назву книги";
    }

    // Обробник кнопки "Додати книгу"
    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            // Перевірка заповненості полів
            if (string.IsNullOrWhiteSpace(textBox1.Text) || string.IsNullOrWhiteSpace(textBox2.Text))
            {
                MessageBox.Show("Будь ласка, заповніть усі поля", 
                              "Попередження", 
                              MessageBoxButtons.OK, 
                              MessageBoxIcon.Warning);
                return;
            }

            // Створення нової книги
            Book newBook = new Book(
                textBox1.Text.Trim(), 
                textBox2.Text.Trim()
            );

            // Додавання книги до списку
            _books.Add(newBook);
            
            // Очищення полів вводу
            textBox1.Clear();
            textBox2.Clear();
            
            // Повідомлення про успішне додавання
            toolStripStatusLabel1.Text = $"Книга додана! Всього книг: {_books.Count}";
        }
        catch (Exception ex)
        {
            MessageBox.Show($"Помилка при додаванні книги: {ex.Message}", 
                          "Помилка", 
                          MessageBoxButtons.OK, 
                          MessageBoxIcon.Error);
        }
    }

    // Обробник кнопки "Передати бібліотекарю"
    private void button2_Click(object sender, EventArgs e)
    {
        if (_books.Count == 0)
        {
            MessageBox.Show("Бібліотека порожня. Додайте книги!", 
                          "Попередження", 
                          MessageBoxButtons.OK, 
                          MessageBoxIcon.Warning);
            return;
        }

        // Відкриття форми бібліотекаря
        Form2 librarianForm = new Form2(this);
        librarianForm.Show();
    }

    // Обробник події закриття форми
    protected override void OnFormClosing(FormClosingEventArgs e)
    {
        base.OnFormClosing(e);
        
        // Збереження списку книг при закритті форми
        try
        {
            // Тут може бути код для збереження у файл чи базу даних
            toolStripStatusLabel1.Text = $"Дані збережено. Всього книг: {_books.Count}";
        }
        catch (Exception ex)
        {
            MessageBox.Show($"Помилка при збереженні даних: {ex.Message}", 
                          "Помилка", 
                          MessageBoxButtons.OK, 
                          MessageBoxIcon.Error);
        }
    }
}

Форма Бібліотекар

Зі списку ComboBox вибирається прізвище автора. При цьому в елемент ListBox з загального списку, сформованого на Головній формі, вибираються тільки книги даного автора. Будемо це робити, використовуючи обробник події TextChanged для елемента ComboBox.

Для елемента comboBox1 задано властивість для читання ComboBox1, щоб можна було вивести прізвище автора на формі Полиця. Важливо, щоб ім'я елемента збігалося з ім'ям елемента, яке задав дизайнер при розміщенні цього елемента на формі. У цій програмі це comboBox1.

При натисканні кнопки «Поставити на полицю» відкривається форма «Полиця», на яку виводяться всі книги вибраного автора.

При натисканні кнопки «Очистити список» елемент ListBox очищується.

Код форми:

public partial class Form2 : Form
{
    private readonly Form1 _mainForm; // Посилання на головну форму зі списком книг

    // Конструктор форми
    public Form2(Form1 mainForm)
    {
        InitializeComponent();
        _mainForm = mainForm;
        
        // Налаштування форми
        this.Text = "Вибір книг за автором";
        this.Size = new Size(400, 400);
        this.StartPosition = FormStartPosition.CenterScreen;
        
        // Налаштування елементів керування
        button1.Text = "Поставити на полицю";
        button2.Text = "Очистити список";
        label1.Text = "Оберіть автора:";
        
        // Заповнення ComboBox авторами
        LoadAuthors();
    }

    // Властивість для доступу до ComboBox
    public ComboBox AuthorComboBox
    {
        get { return comboBox1; }
    }

    // Завантаження списку авторів
    private void LoadAuthors()
    {
        comboBox1.BeginUpdate();
        comboBox1.Items.Clear();
        
        // Отримуємо унікальних авторів
        var uniqueAuthors = _mainForm.Books
            .Select(b => b.Author)
            .Distinct()
            .OrderBy(a => a);
        
        foreach (string author in uniqueAuthors)
        {
            comboBox1.Items.Add(author);
        }
        
        comboBox1.EndUpdate();
        
        if (comboBox1.Items.Count > 0)
            comboBox1.SelectedIndex = 0;
    }

    // Обробник зміни тексту у ComboBox
    private void comboBox1_TextChanged(object sender, EventArgs e)
    {
        UpdateBookList();
    }

    // Оновлення списку книг
    private void UpdateBookList()
    {
        listBox1.BeginUpdate();
        listBox1.Items.Clear();
        
        string selectedAuthor = comboBox1.Text;
        
        if (!string.IsNullOrEmpty(selectedAuthor))
        {
            // Фільтруємо книги за автором
            var authorBooks = _mainForm.Books
                .Where(b => b.Author.Equals(selectedAuthor, StringComparison.OrdinalIgnoreCase))
                .OrderBy(b => b.Title);
            
            foreach (Book book in authorBooks)
            {
                listBox1.Items.Add($"{book.Title} ({book.Year})");
            }
        }
        
        listBox1.EndUpdate();
    }

    // Обробник кнопки "Поставити на полицю"
    private void button1_Click(object sender, EventArgs e)
    {
        if (string.IsNullOrEmpty(comboBox1.Text))
        {
            MessageBox.Show("Будь ласка, оберіть автора", 
                          "Попередження", 
                          MessageBoxButtons.OK, 
                          MessageBoxIcon.Warning);
            return;
        }

        // Відкриття форми з книгами обраного автора
        Form3 bookShelfForm = new Form3(_mainForm, this);
        bookShelfForm.Show();
    }

    // Обробник кнопки "Очистити список"
    private void button2_Click(object sender, EventArgs e)
    {
        listBox1.Items.Clear();
    }

    // Обробник події завантаження форми
    private void Form2_Load(object sender, EventArgs e)
    {
        // Додаткові налаштування стилів
        listBox1.Font = new Font("Arial", 10);
        comboBox1.Font = new Font("Arial", 10);
    }
}

Форма Полиця

На цій формі тільки дві мітки робляться за допомогою дизайнера. У другу мітку виводиться прізвище автора, яке було вибрано на формі Бібліотекар. Решта елементів Label створюються програмним шляхом при завантаженні форми. Розміри елементів 110 на 190.

Для цього переглядається список книг на головній формі і на полицю поміщуються книги, у яких прізвище автора збігається з прізвищем, вибраним на формі Бібліотекар. Для цього і використовується властивість ComboBox1 класу Form2.

Після створення об'єкта Label та встановлення його властивостей обов'язково потрібно додати об'єкт до масиву Controls

Код форми:

public partial class Form3 : Form
{
    private readonly Form1 _form1; // Посилання на головну форму
    private readonly Form2 _form2; // Посилання на форму вибору автора
    private const int ShelfSpacing = 120; // Відстань між книгами на полиці
    private const int BookWidth = 110;    // Ширина "книги"
    private const int BookHeight = 190;   // Висота "книги"

    public Form3(Form1 form1, Form2 form2)
    {
        InitializeComponent();
        _form1 = form1;
        _form2 = form2;
        
        // Налаштування форми
        this.Text = "Книги обраного автора";
        this.Size = new Size(800, 300);
        this.StartPosition = FormStartPosition.CenterScreen;
        this.BackColor = Color.Linen;
    }

    private void Form3_Load(object sender, EventArgs e)
    {
        try
        {
            // Отримуємо обраного автора з форми 2
            string selectedAuthor = _form2.ComboBox1.Text;
            label2.Text = selectedAuthor;
            label2.Font = new Font("Arial", 12, FontStyle.Bold);
            label2.ForeColor = Color.DarkBlue;

            int x = 20, y = 50; // Початкові координати для розміщення книг

            // Відображення книг обраного автора
            foreach (Book book in _form1.Books)
            {
                if (book.Author == selectedAuthor)
                {
                    // Створення мітки-книги
                    Label bookLabel = new Label
                    {
                        Text = book.Title,
                        Size = new Size(BookWidth, BookHeight),
                        Location = new Point(x, y),
                        BorderStyle = BorderStyle.FixedSingle,
                        BackColor = Color.Bisque,
                        ForeColor = Color.Brown,
                        Font = new Font("Arial", 10),
                        TextAlign = ContentAlignment.MiddleCenter
                    };

                    // Додавання обробника події кліку на книгу
                    bookLabel.Click += (s, args) => 
                    {
                        MessageBox.Show($"Назва: {book.Title}\nАвтор: {book.Author}\nРік: {book.Year}",
                                      "Інформація про книгу",
                                      MessageBoxButtons.OK,
                                      MessageBoxIcon.Information);
                    };

                    Controls.Add(bookLabel);
                    x += ShelfSpacing;

                    // Якщо книги не поміщаються - переходимо на новий рядок
                    if (x + BookWidth > this.ClientSize.Width)
                    {
                        x = 20;
                        y += BookHeight + 20;
                        this.Height = y + BookHeight + 50;
                    }
                }
            }

            // Якщо книг не знайдено
            if (x == 20 && y == 50)
            {
                Label noBooksLabel = new Label
                {
                    Text = "Книги цього автора не знайдено",
                    Location = new Point(20, 100),
                    AutoSize = true,
                    Font = new Font("Arial", 12, FontStyle.Italic),
                    ForeColor = Color.Red
                };
                Controls.Add(noBooksLabel);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show($"Помилка при завантаженні книг: {ex.Message}",
                          "Помилка",
                          MessageBoxButtons.OK,
                          MessageBoxIcon.Error);
        }
    }
}

Назад Вперед Зміст