Lavig

CoursesView

Apr 13th, 2026
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 14.22 KB | None | 0 0
  1. using System; // Підключення базових системних функцій
  2. using System.Data; // Робота з таблицями даних у пам'яті
  3. using System.Windows.Forms; // Бібліотека для створення віконного інтерфейсу
  4. using MySql.Data.MySqlClient; // Драйвер для роботи з базою даних MySQL
  5.  
  6. namespace lab8 // Простір імен проекту
  7. {
  8.     public partial class CoursesView : Form // Клас вікна перегляду списку курсів
  9.     {
  10.         string connectionString = "server=localhost;database=lab;uid=root;pwd=;"; // Налаштування підключення до БД
  11.         int selectedCourseId = -1; // Змінна для зберігання ID вибраного у таблиці курсу
  12.         bool isSelectionProcessing = false; // Прапорець для запобігання конфліктів під час вибору рядка
  13.  
  14.         public CoursesView() // Конструктор форми
  15.         {
  16.             InitializeComponent(); // Завантаження графічних елементів вікна
  17.             Table.Sorted += Table_Sorted; // Прив'язка події, що спрацьовує після сортування таблиці
  18.         }
  19.  
  20.         private void CoursesView_Load(object sender, EventArgs e) // Метод, що виконується при відкритті вікна
  21.         {
  22.             LoadData(); // Завантаження даних із бази
  23.             if (Table.Rows.Count > 0) // Перевірка, чи таблиця не порожня
  24.             {
  25.                 SelectRow(0); // Автоматичне виділення першого рядка
  26.             }
  27.         }
  28.  
  29.         private void Table_Sorted(object sender, EventArgs e) // Обробка події після завершення сортування
  30.         {
  31.             if (Table.Rows.Count > 0) // Перевірка наявності даних після сортування
  32.             {
  33.                 SelectRow(0); // Виділення першого рядка у новому порядку
  34.             }
  35.         }
  36.  
  37.         private void LoadData() // Головний метод для отримання даних із бази
  38.         {
  39.             try // Початок блоку відлову помилок
  40.             {
  41.                 MySqlConnection conn = new MySqlConnection(connectionString); // Створення об'єкта підключення
  42.                 conn.Open(); // Відкриття з'єднання з сервером
  43.  
  44.                 string query = "SELECT courses.id, courses.title, courses.price, " +
  45.                     "courses.rating, courses.mentor_id, courses.category_id, " +
  46.                     "courses.preview_link, courses.creation_date, courses.duration_minutes, " +
  47.                     "courses.is_active, users.full_name, categories.name " +
  48.                     "FROM courses " +
  49.                     "JOIN mentors ON courses.mentor_id = mentors.id " +
  50.                     "JOIN users ON mentors.user_id = users.id " +
  51.                     "JOIN categories ON courses.category_id = categories.id " +
  52.                     "ORDER BY courses.id ASC"; // SQL-запит з об'єднанням таблиць курсів, користувачів та категорій
  53.  
  54.                 MySqlDataAdapter adapter = new MySqlDataAdapter(query, conn); // Створення адаптера для запиту
  55.                 DataTable dt = new DataTable(); // Створення тимчасової таблиці в пам'яті
  56.                 adapter.Fill(dt); // Заповнення таблиці результатами запиту
  57.  
  58.                 dt.Columns.Add("Стан"); // Додавання нової колонки для текстового відображення активності
  59.                 for (int i = 0; i < dt.Rows.Count; i++) // Цикл по всіх отриманих записах
  60.                 {
  61.                     string active = dt.Rows[i]["is_active"].ToString(); // Отримання значення активності (0 або 1)
  62.                     if (active == "1" || active.ToLower() == "true") // Якщо курс позначено як активний
  63.                     {
  64.                         dt.Rows[i]["Стан"] = "Активний"; // Запис зрозумілого тексту в нову колонку
  65.                     }
  66.                     else // Якщо курс неактивний
  67.                     {
  68.                         dt.Rows[i]["Стан"] = "Неактивний"; // Запис тексту для неактивного стану
  69.                     }
  70.                 }
  71.  
  72.                 Table.DataSource = dt; // Відображення підготовлених даних у таблиці на формі
  73.  
  74.                 Table.Columns["mentor_id"].Visible = false; // Приховування колонки з ID ментора
  75.                 Table.Columns["category_id"].Visible = false; // Приховування колонки з ID категорії
  76.                 Table.Columns["preview_link"].Visible = false; // Приховування колонки з посиланням
  77.                 Table.Columns["creation_date"].Visible = false; // Приховування колонки з датою створення
  78.                 Table.Columns["duration_minutes"].Visible = false; // Приховування колонки з тривалістю
  79.                 Table.Columns["is_active"].Visible = false; // Приховування технічної колонки активності
  80.  
  81.                 Table.Columns["id"].HeaderText = "ID"; // Зміна назви заголовка для ID
  82.                 Table.Columns["title"].HeaderText = "Назва курсу"; // Зміна назви заголовка для назви
  83.                 Table.Columns["full_name"].HeaderText = "Ментор"; // Зміна назви заголовка для ПІБ ментора
  84.                 Table.Columns["name"].HeaderText = "Категорія"; // Зміна назви заголовка для назви категорії
  85.                 Table.Columns["rating"].HeaderText = "Рейт."; // Зміна назви заголовка для рейтингу
  86.                 Table.Columns["Стан"].HeaderText = "Стан"; // Зміна назви заголовка для створеної колонки стану
  87.  
  88.                 conn.Close(); // Закриття підключення до бази даних
  89.             }
  90.             catch (Exception ex) // Обробка помилок
  91.             {
  92.                 MessageBox.Show(ex.Message); // Виведення повідомлення про помилку на екран
  93.             }
  94.         }
  95.  
  96.         void SelectRow(int i) // Допоміжний метод для виділення рядка
  97.         {
  98.             if (i < 0 || i >= Table.Rows.Count) return; // Перевірка коректності індексу рядка
  99.  
  100.             isSelectionProcessing = true; // Увімкнення режиму обробки (блокування подій)
  101.             Table.ClearSelection(); // Зняття виділення з попередніх рядків
  102.             Table.Rows[i].Selected = true; // Виділення рядка за вказаним індексом
  103.  
  104.             if (Table.Rows[i].Cells["id"].Value != DBNull.Value) // Перевірка, чи не пусте значення ID
  105.             {
  106.                 selectedCourseId = Convert.ToInt32(Table.Rows[i].Cells["id"].Value); // Збереження ID курсу для подальшої роботи
  107.             }
  108.  
  109.             isSelectionProcessing = false; // Вимкнення режиму обробки
  110.             Change.Enabled = true; // Активація кнопки "Змінити"
  111.             Delete.Enabled = true; // Активація кнопки "Видалити"
  112.         }
  113.  
  114.         private void Table_CellClick(object sender, DataGridViewCellEventArgs e) // Подія кліку по клітинці таблиці
  115.         {
  116.             if (e.RowIndex >= 0) // Перевірка, що клікнули по рядку з даними, а не по заголовку
  117.             {
  118.                 SelectRow(e.RowIndex); // Виділення вибраного рядка
  119.             }
  120.         }
  121.  
  122.         private void Add_Click(object sender, EventArgs e) // Обробка натискання кнопки "Додати"
  123.         {
  124.             CoursesEdit editForm = new CoursesEdit(-1); // Створення форми редагування з ID -1 (новий запис)
  125.             DialogResult result = editForm.ShowDialog(); // Відкриття форми як модального вікна
  126.             if (result == DialogResult.OK) // Якщо користувач успішно зберіг дані
  127.             {
  128.                 LoadData(); // Повне оновлення таблиці
  129.                 if (Table.Rows.Count > 0) // Якщо дані з'явилися
  130.                 {
  131.                     SelectRow(0); // Виділення першого запису
  132.                 }
  133.             }
  134.         }
  135.  
  136.         private void Change_Click(object sender, EventArgs e) // Обробка натискання кнопки "Змінити"
  137.         {
  138.             if (selectedCourseId == -1) return; // Якщо курс не вибрано — нічого не робимо
  139.  
  140.             CoursesEdit editForm = new CoursesEdit(selectedCourseId); // Створення форми з передачею ID вибраного курсу
  141.             DialogResult result = editForm.ShowDialog(); // Відкриття вікна редагування
  142.             if (result == DialogResult.OK) // Якщо дані були змінені та збережені
  143.             {
  144.                 LoadData(); // Оновлення таблиці на формі
  145.             }
  146.         }
  147.  
  148.         private void Delete_Click(object sender, EventArgs e) // Обробка натискання кнопки "Видалити"
  149.         {
  150.             if (Table.SelectedRows.Count == 0) return; // Перевірка, чи вибрано рядок у таблиці
  151.  
  152.             string name = Table.SelectedRows[0].Cells["title"].Value.ToString(); // Отримання назви для підтвердження
  153.             DialogResult confirm = MessageBox.Show("Видалити курс " + name + "?", "Видалення", MessageBoxButtons.YesNo); // Запит на підтвердження
  154.  
  155.             if (confirm == DialogResult.Yes) // Якщо користувач підтвердив видалення
  156.             {
  157.                 MySqlConnection conn = new MySqlConnection(connectionString); // Створення з'єднання
  158.                 conn.Open(); // Відкриття з'єднання
  159.                 MySqlCommand cmd = new MySqlCommand("DELETE FROM courses WHERE id=@id", conn); // SQL-запит на видалення запису
  160.                 cmd.Parameters.AddWithValue("@id", selectedCourseId); // Передача ID курсу для видалення
  161.                 cmd.ExecuteNonQuery(); // Виконання запиту на сервері
  162.                 conn.Close(); // Закриття з'єднання
  163.  
  164.                 LoadData(); // Оновлення списку курсів після видалення
  165.  
  166.                 if (Table.Rows.Count > 0) // Якщо в таблиці залишилися записи
  167.                 {
  168.                     SelectRow(0); // Виділення першого доступного рядка
  169.                 }
  170.                 else // Якщо таблиця стала абсолютно порожньою
  171.                 {
  172.                     Input.Clear(); // Очищення поля пошуку
  173.                     selectedCourseId = -1; // Скидання вибраного ID
  174.                     Change.Enabled = false; // Деактивація кнопки зміни
  175.                     Delete.Enabled = false; // Деактивація кнопки видалення
  176.                 }
  177.             }
  178.         }
  179.  
  180.         private void Input_TextChanged(object sender, EventArgs e) // Подія при зміні тексту в полі пошуку
  181.         {
  182.             if (isSelectionProcessing == true) return; // Пропуск, якщо зміна викликана програмою, а не користувачем
  183.  
  184.             DataTable dt = (DataTable)Table.DataSource; // Отримання доступу до даних таблиці
  185.             if (dt != null) // Якщо дані завантажені
  186.             {
  187.                 string text = Input.Text.Replace("'", "''"); // Захист від помилок при введенні одинарної дужки
  188.                 string filter = "title LIKE '%" + text + "%' OR full_name LIKE '%" + text + "%' OR name LIKE '%" + text + "%' OR Стан LIKE '%" + text + "%'"; // Формування рядка фільтрації за всіма полями
  189.                 dt.DefaultView.RowFilter = filter; // Застосування фільтра до відображення таблиці
  190.             }
  191.  
  192.             if (Table.Rows.Count > 0) // Якщо після фільтрації є результати
  193.             {
  194.                 SelectRow(0); // Виділення першого знайденого запису
  195.             }
  196.             else // Якщо пошук не дав результатів
  197.             {
  198.                 selectedCourseId = -1; // Скидання вибору ID
  199.                 Change.Enabled = false; // Вимкнення кнопки зміни
  200.                 Delete.Enabled = false; // Вимкнення кнопки видалення
  201.             }
  202.         }
  203.  
  204.         private void Exit_Click(object sender, EventArgs e) // Клік по кнопці виходу
  205.         {
  206.             this.Close(); // Закриття поточної форми перегляду
  207.         }
  208.     }
  209. }
Advertisement
Add Comment
Please, Sign In to add comment