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

Робота з файлами і каталогами

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

Всі класи, які ми будемо використовувати для пошуку файлів, знаходяться в просторі імен System.IO. Тому цей простір імен необхідно обов'язково підключити за допомогою ключового слова "using".

Клас FileInfo

За допомогою методів цього класу можна створювати, видаляти, переміщувати файли, отримувати їх властивості і багато іншого.

Ми будемо використовувати властивість "Name" об'єктів цього класу для отримання імені файлу.

Клас DirectoryInfo

За допомогою методів цього класу можна відкривати, створювати, видаляти, переміщувати каталоги, отримувати їх властивості і багато іншого.

Для створення об'єкта цього класу використовується конструктор, який приймає шлях до каталогу:
public DirectoryInfo(string path)

Нас буде цікавити один метод цього класу - GetFiles().

За його допомогою ми будемо отримувати список файлів, які знаходяться в папці, у вигляді масиву об'єктів класу FileInfo.

Клас FolderBrowserDialog

За допомогою конструктора створюється стандартне вікно (у нас об'єкт "fb") для перегляду папок:
FolderBrowserDialog fb = new FolderBrowserDialog();

Деякі властивості цього об'єкта:

Приклад 1

  1. При завантаженні форми виводиться:

  2. Якщо виділити файл у цьому списку, то його ім'я виводиться за допомогою методу MessageBox.Show.

  3. При натисканні кнопки "Вибрати іншу папку" відкривається стандартне вікно для перегляду папок:

  4. Якщо знайти папку, виділити її і натиснути кнопку OK, то:
  5. Якщо виділити файл у цьому списку, то його ім'я виводиться за допомогою методу MessageBox.Show.

Функція FillListBox

Якщо проаналізувати умову, то зрозуміло, що деякі дії потрібно виділити в окрему функцію, яку назвемо FillListBox. Ця функція отримує в параметрі шлях до папки і виконує такі дії:

private void FillListBox(string aPath)
{
    try
    {
        if (!Directory.Exists(aPath))
        {
            MessageBox.Show("Папка не існує!");
            return;
        }

        listBox1.Items.Clear();
        label2.Text = aPath;

        DirectoryInfo di = new DirectoryInfo(aPath);
        FileInfo[] fi = di.GetFiles("*.*"); // або "*.txt" для фільтрації

        foreach (FileInfo fc in fi)
        {
            listBox1.Items.Add(fc.Name);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show($"Помилка: {ex.Message}");
    }
}

Обробник події Load

У обробнику події Load для форми отримуємо шлях до папки з exe-файлом і викликаємо функцію FillListBox з цим шляхом в параметрі.

// Обробник події Load
private void Form1_Load(object sender, EventArgs e)
{
    // Шлях до папки з exe-файлом
    string path = Application.StartupPath + "\\";
    FilllistBox(path); // Виклик функції для заповнення ListBox
}

Обробник події Click

У обробнику події Click для кнопки "Вибрати іншу папку" ми:

private void buttonBrowseFolder_Click(object sender, EventArgs e)
{
    try
    {
        // Створення діалогового вікна вибору папки
        using (FolderBrowserDialog folderBrowser = new FolderBrowserDialog())
        {
            // Налаштування властивостей вікна
            folderBrowser.Description = "Оберіть папку з зображеннями";
            folderBrowser.ShowNewFolderButton = false;
            folderBrowser.RootFolder = Environment.SpecialFolder.MyComputer;

            // Відображення діалогового вікна
            if (folderBrowser.ShowDialog() == DialogResult.OK)
            {
                // Отримання шляху до обраної папки
                string selectedPath = folderBrowser.SelectedPath;

                // Перевірка наявності папки
                if (Directory.Exists(selectedPath))
                {
                    // Виклик методу для заповнення списку зображень
                    LoadImagesFromDirectory(selectedPath);
                }
                else
                {
                    MessageBox.Show("Обраної папки не існує", 
                                  "Попередження", 
                                  MessageBoxButtons.OK, 
                                  MessageBoxIcon.Warning);
                }
            }
        }
    }
    catch (UnauthorizedAccessException)
    {
        MessageBox.Show("Немає доступу до обраної папки", 
                      "Помилка доступу", 
                      MessageBoxButtons.OK, 
                      MessageBoxIcon.Error);
    }
    catch (Exception ex)
    {
        MessageBox.Show($"Помилка при виборі папки: {ex.Message}", 
                      "Помилка", 
                      MessageBoxButtons.OK, 
                      MessageBoxIcon.Error);
    }
}

/// 
/// Завантажує зображення з вказаної директорії
/// 
/// Шлях до папки з зображеннями
private void LoadImagesFromDirectory(string directoryPath)
{
    // Оновлення інтерфейсу
    labelCurrentPath.Text = $"Поточний шлях: {directoryPath}";
    toolStripStatusLabel.Text = "Завантаження зображень...";

    try
    {
        // Очищення попередніх даних
        listBoxImages.Items.Clear();
        pictureBoxPreview.Image = null;

        // Отримання списку зображень
        var imageFiles = Directory.GetFiles(directoryPath, "*.jpg")
                         .Concat(Directory.GetFiles(directoryPath, "*.png"))
                         .Concat(Directory.GetFiles(directoryPath, "*.jpeg"));

        // Додавання до списку
        foreach (string file in imageFiles)
        {
            listBoxImages.Items.Add(Path.GetFileName(file));
        }

        // Оновлення статусу
        toolStripStatusLabel.Text = $"Завантажено {listBoxImages.Items.Count} зображень";
    }
    catch (Exception ex)
    {
        MessageBox.Show($"Помилка при завантаженні зображень: {ex.Message}", 
                      "Помилка", 
                      MessageBoxButtons.OK, 
                      MessageBoxIcon.Error);
    }
}

Обробник події SelectedIndexChanged

У обробнику події SelectedIndexChanged для виділеного елемента listBox1 виводимо ім'я виділеного файлу.

// Обробник події зміни виділеного елемента у списку
private void listBoxFiles_SelectedIndexChanged(object sender, EventArgs e)
{
    try
    {
        // Перевірка, чи є виділений елемент
        if (listBoxFiles.SelectedItem == null)
            return;

        // Отримання виділеного значення
        string selectedItem = listBoxFiles.SelectedItem.ToString();

        // Виконання дій з виділеним елементом
        ProcessSelectedItem(selectedItem);
    }
    catch (Exception ex)
    {
        // Обробка помилок з інформативним повідомленням
        MessageBox.Show($"Помилка при обробці вибору: {ex.Message}", 
                      "Помилка", 
                      MessageBoxButtons.OK, 
                      MessageBoxIcon.Error);
    }
}

/// 
/// Обробляє виділений елемент списку
/// 
/// Виділений елемент
private void ProcessSelectedItem(string selectedItem)
{
    // Виведення інформації про вибір (можна замінити на конкретну логіку)
    toolStripStatusLabel.Text = $"Обрано: {selectedItem}";
    
    // Додаткові дії з вибраним елементом:
    // - Відкриття файлу
    // - Відображення додаткової інформації
    // - Завантаження пов'язаних даних
}

Клас Image

Image - це абстрактний базовий клас, який містить методи для роботи з растровими зображеннями (точковими малюнками).

Нас буде цікавити метод FromFile цього класу, який створює графічний об'єкт з файлу. ПОВНЕ (шлях і ім'я) ім'я файлу вказується в параметрі методу.

Створений графічний об'єкт можна присвоїти, наприклад, властивості Image об'єкта pictureBox1. Така ж властивість є і у інших елементів форми: кнопок, міток.

Приклад 2

Додамо на форму в попередньому прикладі елемент PictureBox і будемо виводити в нього малюнки з розширенням jpg.

Зробимо деякі зміни в коді.

У функції FillListBox будемо відображати лише файли з розширенням jpg:

/// 
/// Заповнює ListBox назвами файлів зображень з вказаної папки
/// 
/// Шлях до папки з зображеннями
private void FillListBoxWithImages(string directoryPath)
{
    try
    {
        // Очищення списку та інтерфейсу
        listBoxImageFiles.Items.Clear();
        pictureBoxPreview.Image = null;
        labelDirectoryPath.Text = "Шлях: " + directoryPath;

        // Перевірка існування папки
        if (!Directory.Exists(directoryPath))
        {
            MessageBox.Show($"Папка не знайдена:\n{directoryPath}", 
                          "Помилка", 
                          MessageBoxButtons.OK, 
                          MessageBoxIcon.Warning);
            return;
        }

        // Отримання списку файлів з безпечною обробкою винятків
        var imageFiles = Directory.EnumerateFiles(directoryPath, "*.jpg")
            .Concat(Directory.EnumerateFiles(directoryPath, "*.jpeg"))
            .Concat(Directory.EnumerateFiles(directoryPath, "*.png"))
            .Select(Path.GetFileName)
            .OrderBy(f => f);

        // Додавання файлів до ListBox
        foreach (string fileName in imageFiles)
        {
            listBoxImageFiles.Items.Add(fileName);
        }

        // Оновлення статусу
        toolStripStatusLabel.Text = $"Знайдено {listBoxImageFiles.Items.Count} зображень";
    }
    catch (UnauthorizedAccessException)
    {
        MessageBox.Show("Немає доступу до вказаної папки", 
                      "Помилка доступу", 
                      MessageBoxButtons.OK, 
                      MessageBoxIcon.Error);
    }
    catch (Exception ex)
    {
        MessageBox.Show($"Помилка при завантаженні зображень:\n{ex.Message}", 
                      "Помилка", 
                      MessageBoxButtons.OK, 
                      MessageBoxIcon.Error);
    }
}

У обробнику події SelectedIndexChanged видаляємо вивід у MessageBox, а створюваний графічний об'єкт присвоюємо властивості Image елемента pictureBox1.

// Обробник події зміни виділеного елемента у списку
private void listBoxCovers_SelectedIndexChanged(object sender, EventArgs e)
{
    // Очистити попереднє зображення
    pictureBoxCover.Image = null;

    // Перевірити, чи є виділений елемент
    if (listBoxCovers.SelectedItem == null)
        return;

    try
    {
        // Отримати ім'я обраного файлу
        string selectedFileName = listBoxCovers.SelectedItem.ToString();
        string fullImagePath = Path.Combine(Application.StartupPath, "BookCovers", selectedFileName);

        // Перевірити існування файлу
        if (!File.Exists(fullImagePath))
        {
            MessageBox.Show($"Файл обкладинки не знайдено:\n{fullImagePath}", 
                          "Помилка", 
                          MessageBoxButtons.OK, 
                          MessageBoxIcon.Warning);
            return;
        }

        // Завантажити та відобразити зображення
        using (Image coverImage = Image.FromFile(fullImagePath))
        {
            // Зберегти шлях до файлу (необов'язково)
            labelFilePath.Text = fullImagePath;
            
            // Встановити зображення з підтримкою розміру
            pictureBoxCover.Image = new Bitmap(coverImage);
            pictureBoxCover.SizeMode = PictureBoxSizeMode.Zoom; // Масштабування зі збереженням пропорцій
        }
    }
    catch (OutOfMemoryException)
    {
        MessageBox.Show("Непідтримуваний формат зображення", 
                      "Помилка", 
                      MessageBoxButtons.OK, 
                      MessageBoxIcon.Error);
    }
    catch (Exception ex)
    {
        MessageBox.Show($"Помилка при завантаженні зображення:\n{ex.Message}", 
                      "Помилка", 
                      MessageBoxButtons.OK, 
                      MessageBoxIcon.Error);
    }
}

Приклад 3: Бібліотека

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

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

У попередній главі ми розглядали цей приклад. Тут ми додамо ім'я файлу обкладинки та виводитимемо на форму Полиця цю обкладинку.

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

Клас Book

/// 
/// Клас, що представляє книгу в бібліотечній системі
/// 
public class Book
{
    private string _author;    // Автор книги
    private string _title;     // Назва книги
    private string _coverImagePath; // Шлях до зображення обкладинки

    /// 
    /// Конструктор класу Book
    /// 
    /// Автор книги
    /// Назва книги
    /// Шлях до зображення обкладинки
    public Book(string author, string title, string coverImagePath)
    {
        Author = author; // Використовуємо властивість для валідації
        Title = title;
        CoverImagePath = coverImagePath;
    }

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

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

    /// 
    /// Шлях до зображення обкладинки
    /// 
    public string CoverImagePath
    {
        get => _coverImagePath;
        private set
        {
            if (string.IsNullOrWhiteSpace(value))
            {
                _coverImagePath = string.Empty;
                return;
            }

            // Перевірка наявності файлу (якщо шлях вказаний)
            if (!File.Exists(value))
            {
                throw new FileNotFoundException("Файл обкладинки не знайдено", value);
            }

            _coverImagePath = value;
        }
    }

    /// 
    /// Чи має книга обкладинку
    /// 
    public bool HasCoverImage => !string.IsNullOrEmpty(_coverImagePath);

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

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

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

Значення зчитуються з текстових полів. Ім'я файлу обкладинки вибирається з елемента ListBox. У цей елемент імена файлів завантажуються з тієї ж папки, в якій знаходиться exe-файл цього додатка. Тому всі файли з обкладинками (Книга1.jpg, Книга2.jpg, Книга3.jpg, Книга4.jpg, Книга5.jpg, Книга6.jpg) помістіть в цю ж папку.

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

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

Код форми:

public partial class Form1 : Form
{
    private BindingList _books = new BindingList(); // Список книг з підтримкою прив'язки даних
    private readonly string _imagePath = Path.Combine(Application.StartupPath, "BookCovers");

    // Властивість для доступу до списку книг
    public IList Books => _books;

    public Form1()
    {
        InitializeComponent();
        
        // Налаштування форми
        this.Text = "Управління бібліотекою";
        this.StartPosition = FormStartPosition.CenterScreen;
        this.Size = new Size(600, 400);
        
        // Налаштування елементів керування
        buttonAddBook.Text = "Додати книгу";
        buttonLibrarian.Text = "Передати бібліотекарю";
        labelAuthor.Text = "Автор:";
        labelTitle.Text = "Назва:";
        labelCover.Text = "Обкладинка:";
    }

    // Обробник завантаження форми
    private void Form1_Load(object sender, EventArgs e)
    {
        try
        {
            // Створення папки для зображень, якщо її немає
            if (!Directory.Exists(_imagePath))
            {
                Directory.CreateDirectory(_imagePath);
            }

            // Завантаження списку зображень
            var imageFiles = Directory.GetFiles(_imagePath, "*.jpg");
            listBoxCovers.DataSource = imageFiles.Select(Path.GetFileName).ToList();
            
            if (listBoxCovers.Items.Count == 0)
            {
                MessageBox.Show("Не знайдено жодного зображення обкладинки", 
                              "Інформація", 
                              MessageBoxButtons.OK, 
                              MessageBoxIcon.Information);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show($"Помилка при завантаженні зображень: {ex.Message}", 
                          "Помилка", 
                          MessageBoxButtons.OK, 
                          MessageBoxIcon.Error);
        }
    }

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

            if (listBoxCovers.SelectedItem == null)
            {
                MessageBox.Show("Будь ласка, виберіть обкладинку для книги", 
                              "Попередження", 
                              MessageBoxButtons.OK, 
                              MessageBoxIcon.Warning);
                return;
            }

            // Створення нової книги
            string coverImage = listBoxCovers.SelectedItem.ToString();
            Book newBook = new Book(
                textBoxAuthor.Text.Trim(),
                textBoxTitle.Text.Trim(),
                Path.Combine(_imagePath, coverImage)
            );

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

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

        try
        {
            Form2 librarianForm = new Form2(this);
            librarianForm.Show();
        }
        catch (Exception ex)
        {
            MessageBox.Show($"Помилка при відкритті форми бібліотекаря: {ex.Message}", 
                          "Помилка", 
                          MessageBoxButtons.OK, 
                          MessageBoxIcon.Error);
        }
    }
}

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

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

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

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

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

Код форми:

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

    public Form3(Form1 mainForm, Form2 authorForm)
    {
        InitializeComponent();
        _mainForm = mainForm;
        _authorForm = authorForm;
        
        // Налаштування форми
        this.Text = "Книги обраного автора";
        this.BackColor = Color.Linen;
        this.StartPosition = FormStartPosition.CenterScreen;
    }

    private void Form3_Load(object sender, EventArgs e)
    {
        try
        {
            // Отримуємо обраного автора
            string selectedAuthor = _authorForm.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 _mainForm.Books)
            {
                if (book.Author.Equals(selectedAuthor, StringComparison.OrdinalIgnoreCase))
                {
                    // Створення мітки-книги
                    Label bookLabel = new Label
                    {
                        Text = book.Title,
                        Size = new Size(BookWidth, BookHeight),
                        Location = new Point(x, y),
                        BorderStyle = BorderStyle.FixedSingle,
                        BackColor = Color.White,
                        ForeColor = Color.Black,
                        Font = new Font("Arial", 10),
                        TextAlign = ContentAlignment.BottomCenter,
                        ImageAlign = ContentAlignment.TopCenter
                    };

                    // Завантаження зображення (якщо воно існує)
                    if (!string.IsNullOrEmpty(book.PhotoPath) && File.Exists(book.PhotoPath))
                    {
                        bookLabel.Image = Image.FromFile(book.PhotoPath);
                        bookLabel.Image = ResizeImage(bookLabel.Image, BookWidth - 10, BookHeight - 30);
                    }

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

                    // Перехід на новий рядок, якщо не вистачає місця
                    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);
            this.Close();
        }
    }

    private Image ResizeImage(Image image, int width, int height)
    {
        Bitmap resizedImage = new Bitmap(width, height);
        using (Graphics g = Graphics.FromImage(resizedImage))
        {
            g.DrawImage(image, 0, 0, width, height);
        }
        return resizedImage;
    }
}

Форма Полиця

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

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

Після створення об'єкта Label, встановлюються такі його властивості: Text (назва книги), Height і Width (висота і ширина, встановлюються залежно від розмірів картинки), Location (об'єкт класу Point, містить координати лівого верхнього кута), Image (ім'я файлу картинки).

Створений елемент обов'язково потрібно додати об'єкт в масив Controls.

Код форми:

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

    public Form3(Form1 mainForm, Form2 authorForm)
    {
        InitializeComponent();
        _mainForm = mainForm;
        _authorForm = authorForm;
        
        // Налаштування форми
        this.Text = "Книги обраного автора";
        this.BackColor = Color.Linen;
        this.StartPosition = FormStartPosition.CenterScreen;
    }

    private void Form3_Load(object sender, EventArgs e)
    {
        try
        {
            // Отримуємо обраного автора
            string selectedAuthor = _authorForm.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 _mainForm.Books)
            {
                if (book.Author.Equals(selectedAuthor, StringComparison.OrdinalIgnoreCase))
                {
                    // Створення мітки-книги
                    Label bookLabel = new Label
                    {
                        Text = book.Title,
                        Size = new Size(BookWidth, BookHeight),
                        Location = new Point(x, y),
                        BorderStyle = BorderStyle.FixedSingle,
                        BackColor = Color.White,
                        ForeColor = Color.Black,
                        Font = new Font("Arial", 10),
                        TextAlign = ContentAlignment.BottomCenter,
                        ImageAlign = ContentAlignment.TopCenter
                    };

                    // Завантаження зображення (якщо воно існує)
                    if (!string.IsNullOrEmpty(book.PhotoPath) && File.Exists(book.PhotoPath))
                    {
                        bookLabel.Image = Image.FromFile(book.PhotoPath);
                        bookLabel.Image = ResizeImage(bookLabel.Image, BookWidth - 10, BookHeight - 30);
                    }

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

                    // Перехід на новий рядок, якщо не вистачає місця
                    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);
            this.Close();
        }
    }

    private Image ResizeImage(Image image, int width, int height)
    {
        Bitmap resizedImage = new Bitmap(width, height);
        using (Graphics g = Graphics.FromImage(resizedImage))
        {
            g.DrawImage(image, 0, 0, width, height);
        }
        return resizedImage;
    }
}

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