Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System; // Підключення базових системних функцій
- using System.Data; // Робота з таблицями даних у пам'яті
- using System.Windows.Forms; // Бібліотека для створення віконного інтерфейсу
- using MySql.Data.MySqlClient; // Драйвер для роботи з базою даних MySQL
- namespace lab8 // Простір імен проекту
- {
- public partial class CoursesView : Form // Клас вікна перегляду списку курсів
- {
- string connectionString = "server=localhost;database=lab;uid=root;pwd=;"; // Налаштування підключення до БД
- int selectedCourseId = -1; // Змінна для зберігання ID вибраного у таблиці курсу
- bool isSelectionProcessing = false; // Прапорець для запобігання конфліктів під час вибору рядка
- public CoursesView() // Конструктор форми
- {
- InitializeComponent(); // Завантаження графічних елементів вікна
- Table.Sorted += Table_Sorted; // Прив'язка події, що спрацьовує після сортування таблиці
- }
- private void CoursesView_Load(object sender, EventArgs e) // Метод, що виконується при відкритті вікна
- {
- LoadData(); // Завантаження даних із бази
- if (Table.Rows.Count > 0) // Перевірка, чи таблиця не порожня
- {
- SelectRow(0); // Автоматичне виділення першого рядка
- }
- }
- private void Table_Sorted(object sender, EventArgs e) // Обробка події після завершення сортування
- {
- if (Table.Rows.Count > 0) // Перевірка наявності даних після сортування
- {
- SelectRow(0); // Виділення першого рядка у новому порядку
- }
- }
- private void LoadData() // Головний метод для отримання даних із бази
- {
- try // Початок блоку відлову помилок
- {
- MySqlConnection conn = new MySqlConnection(connectionString); // Створення об'єкта підключення
- conn.Open(); // Відкриття з'єднання з сервером
- string query = "SELECT courses.id, courses.title, courses.price, " +
- "courses.rating, courses.mentor_id, courses.category_id, " +
- "courses.preview_link, courses.creation_date, courses.duration_minutes, " +
- "courses.is_active, users.full_name, categories.name " +
- "FROM courses " +
- "JOIN mentors ON courses.mentor_id = mentors.id " +
- "JOIN users ON mentors.user_id = users.id " +
- "JOIN categories ON courses.category_id = categories.id " +
- "ORDER BY courses.id ASC"; // SQL-запит з об'єднанням таблиць курсів, користувачів та категорій
- MySqlDataAdapter adapter = new MySqlDataAdapter(query, conn); // Створення адаптера для запиту
- DataTable dt = new DataTable(); // Створення тимчасової таблиці в пам'яті
- adapter.Fill(dt); // Заповнення таблиці результатами запиту
- dt.Columns.Add("Стан"); // Додавання нової колонки для текстового відображення активності
- for (int i = 0; i < dt.Rows.Count; i++) // Цикл по всіх отриманих записах
- {
- string active = dt.Rows[i]["is_active"].ToString(); // Отримання значення активності (0 або 1)
- if (active == "1" || active.ToLower() == "true") // Якщо курс позначено як активний
- {
- dt.Rows[i]["Стан"] = "Активний"; // Запис зрозумілого тексту в нову колонку
- }
- else // Якщо курс неактивний
- {
- dt.Rows[i]["Стан"] = "Неактивний"; // Запис тексту для неактивного стану
- }
- }
- Table.DataSource = dt; // Відображення підготовлених даних у таблиці на формі
- Table.Columns["mentor_id"].Visible = false; // Приховування колонки з ID ментора
- Table.Columns["category_id"].Visible = false; // Приховування колонки з ID категорії
- Table.Columns["preview_link"].Visible = false; // Приховування колонки з посиланням
- Table.Columns["creation_date"].Visible = false; // Приховування колонки з датою створення
- Table.Columns["duration_minutes"].Visible = false; // Приховування колонки з тривалістю
- Table.Columns["is_active"].Visible = false; // Приховування технічної колонки активності
- Table.Columns["id"].HeaderText = "ID"; // Зміна назви заголовка для ID
- Table.Columns["title"].HeaderText = "Назва курсу"; // Зміна назви заголовка для назви
- Table.Columns["full_name"].HeaderText = "Ментор"; // Зміна назви заголовка для ПІБ ментора
- Table.Columns["name"].HeaderText = "Категорія"; // Зміна назви заголовка для назви категорії
- Table.Columns["rating"].HeaderText = "Рейт."; // Зміна назви заголовка для рейтингу
- Table.Columns["Стан"].HeaderText = "Стан"; // Зміна назви заголовка для створеної колонки стану
- conn.Close(); // Закриття підключення до бази даних
- }
- catch (Exception ex) // Обробка помилок
- {
- MessageBox.Show(ex.Message); // Виведення повідомлення про помилку на екран
- }
- }
- void SelectRow(int i) // Допоміжний метод для виділення рядка
- {
- if (i < 0 || i >= Table.Rows.Count) return; // Перевірка коректності індексу рядка
- isSelectionProcessing = true; // Увімкнення режиму обробки (блокування подій)
- Table.ClearSelection(); // Зняття виділення з попередніх рядків
- Table.Rows[i].Selected = true; // Виділення рядка за вказаним індексом
- if (Table.Rows[i].Cells["id"].Value != DBNull.Value) // Перевірка, чи не пусте значення ID
- {
- selectedCourseId = Convert.ToInt32(Table.Rows[i].Cells["id"].Value); // Збереження ID курсу для подальшої роботи
- }
- isSelectionProcessing = false; // Вимкнення режиму обробки
- Change.Enabled = true; // Активація кнопки "Змінити"
- Delete.Enabled = true; // Активація кнопки "Видалити"
- }
- private void Table_CellClick(object sender, DataGridViewCellEventArgs e) // Подія кліку по клітинці таблиці
- {
- if (e.RowIndex >= 0) // Перевірка, що клікнули по рядку з даними, а не по заголовку
- {
- SelectRow(e.RowIndex); // Виділення вибраного рядка
- }
- }
- private void Add_Click(object sender, EventArgs e) // Обробка натискання кнопки "Додати"
- {
- CoursesEdit editForm = new CoursesEdit(-1); // Створення форми редагування з ID -1 (новий запис)
- DialogResult result = editForm.ShowDialog(); // Відкриття форми як модального вікна
- if (result == DialogResult.OK) // Якщо користувач успішно зберіг дані
- {
- LoadData(); // Повне оновлення таблиці
- if (Table.Rows.Count > 0) // Якщо дані з'явилися
- {
- SelectRow(0); // Виділення першого запису
- }
- }
- }
- private void Change_Click(object sender, EventArgs e) // Обробка натискання кнопки "Змінити"
- {
- if (selectedCourseId == -1) return; // Якщо курс не вибрано — нічого не робимо
- CoursesEdit editForm = new CoursesEdit(selectedCourseId); // Створення форми з передачею ID вибраного курсу
- DialogResult result = editForm.ShowDialog(); // Відкриття вікна редагування
- if (result == DialogResult.OK) // Якщо дані були змінені та збережені
- {
- LoadData(); // Оновлення таблиці на формі
- }
- }
- private void Delete_Click(object sender, EventArgs e) // Обробка натискання кнопки "Видалити"
- {
- if (Table.SelectedRows.Count == 0) return; // Перевірка, чи вибрано рядок у таблиці
- string name = Table.SelectedRows[0].Cells["title"].Value.ToString(); // Отримання назви для підтвердження
- DialogResult confirm = MessageBox.Show("Видалити курс " + name + "?", "Видалення", MessageBoxButtons.YesNo); // Запит на підтвердження
- if (confirm == DialogResult.Yes) // Якщо користувач підтвердив видалення
- {
- MySqlConnection conn = new MySqlConnection(connectionString); // Створення з'єднання
- conn.Open(); // Відкриття з'єднання
- MySqlCommand cmd = new MySqlCommand("DELETE FROM courses WHERE id=@id", conn); // SQL-запит на видалення запису
- cmd.Parameters.AddWithValue("@id", selectedCourseId); // Передача ID курсу для видалення
- cmd.ExecuteNonQuery(); // Виконання запиту на сервері
- conn.Close(); // Закриття з'єднання
- LoadData(); // Оновлення списку курсів після видалення
- if (Table.Rows.Count > 0) // Якщо в таблиці залишилися записи
- {
- SelectRow(0); // Виділення першого доступного рядка
- }
- else // Якщо таблиця стала абсолютно порожньою
- {
- Input.Clear(); // Очищення поля пошуку
- selectedCourseId = -1; // Скидання вибраного ID
- Change.Enabled = false; // Деактивація кнопки зміни
- Delete.Enabled = false; // Деактивація кнопки видалення
- }
- }
- }
- private void Input_TextChanged(object sender, EventArgs e) // Подія при зміні тексту в полі пошуку
- {
- if (isSelectionProcessing == true) return; // Пропуск, якщо зміна викликана програмою, а не користувачем
- DataTable dt = (DataTable)Table.DataSource; // Отримання доступу до даних таблиці
- if (dt != null) // Якщо дані завантажені
- {
- string text = Input.Text.Replace("'", "''"); // Захист від помилок при введенні одинарної дужки
- string filter = "title LIKE '%" + text + "%' OR full_name LIKE '%" + text + "%' OR name LIKE '%" + text + "%' OR Стан LIKE '%" + text + "%'"; // Формування рядка фільтрації за всіма полями
- dt.DefaultView.RowFilter = filter; // Застосування фільтра до відображення таблиці
- }
- if (Table.Rows.Count > 0) // Якщо після фільтрації є результати
- {
- SelectRow(0); // Виділення першого знайденого запису
- }
- else // Якщо пошук не дав результатів
- {
- selectedCourseId = -1; // Скидання вибору ID
- Change.Enabled = false; // Вимкнення кнопки зміни
- Delete.Enabled = false; // Вимкнення кнопки видалення
- }
- }
- private void Exit_Click(object sender, EventArgs e) // Клік по кнопці виходу
- {
- this.Close(); // Закриття поточної форми перегляду
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment