Lavig

Categories

Apr 13th, 2026
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 16.64 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 Categories : Form // Клас вікна керування категоріями
  9.     {
  10.         string connectionString = "server=localhost;database=lab;uid=root;pwd=;"; // Налаштування підключення до БД
  11.         int selectedCategoryId = -1; // ID категорії, яку вибрали в таблиці
  12.         bool isSelectionProcessing = false; // Прапорець для блокування зайвих перевірок при виборі рядка
  13.  
  14.         public Categories() // Конструктор форми
  15.         {
  16.             InitializeComponent(); // Завантаження візуальних компонентів
  17.             Table.SelectionMode = DataGridViewSelectionMode.FullRowSelect; // Режим виділення рядка повністю
  18.             Table.MultiSelect = false; // Заборона виділяти кілька рядків одночасно
  19.             Table.Sorted += Table_Sorted; // Подія, що спрацьовує після сортування таблиці
  20.         }
  21.  
  22.         private void Form1_Load(object sender, EventArgs e) // Метод, що виконується при відкритті вікна
  23.         {
  24.             LoadData(); // Завантаження даних з бази в таблицю
  25.             if (Table.Rows.Count > 0) // Перевірка, чи є в таблиці хоча б один рядок
  26.             {
  27.                 SelectRow(0); // Викликаємо виділення першого рядка
  28.             }
  29.         }
  30.  
  31.         private void Table_Sorted(object sender, EventArgs e) // Обробка події після сортування
  32.         {
  33.             if (Table.Rows.Count > 0) // Перевірка наявності даних
  34.             {
  35.                 SelectRow(0); // Виділяємо перший рядок у новому списку
  36.             }
  37.         }
  38.  
  39.         private void LoadData() // Головний метод завантаження даних
  40.         {
  41.             try // Початок блоку обробки можливих помилок
  42.             {
  43.                 MySqlConnection conn = new MySqlConnection(connectionString); // Створення об'єкта з'єднання
  44.                 conn.Open(); // Відкриття підключення до сервера БД
  45.  
  46.                 string query = "SELECT id, name FROM categories ORDER BY id ASC"; // SQL-запит на отримання списку
  47.                 MySqlDataAdapter adapter = new MySqlDataAdapter(query, conn); // Адаптер для передачі даних
  48.                 DataTable dt = new DataTable(); // Тимчасова таблиця в оперативній пам'яті
  49.                 adapter.Fill(dt); // Заповнення тимчасової таблиці результатом запиту
  50.  
  51.                 string lastSort = ""; // Змінна для збереження поточного сортування користувача
  52.                 if (Table.SortedColumn != null) // Перевірка, чи сортував користувач таблицю раніше
  53.                 {
  54.                     string columnName = Table.SortedColumn.DataPropertyName; // Отримання назви стовпця сортування
  55.                     if (Table.SortOrder == SortOrder.Ascending) // Якщо сортування за зростанням
  56.                     {
  57.                         lastSort = columnName + " ASC"; // Формування SQL-команди для зростання
  58.                     }
  59.                     else // Якщо сортування за спаданням
  60.                     {
  61.                         lastSort = columnName + " DESC"; // Формування SQL-команди для спадання
  62.                     }
  63.                 }
  64.  
  65.                 Table.DataSource = dt; // Відображення отриманих даних у таблиці на формі
  66.  
  67.                 if (Table.Columns.Count > 0) // Перевірка, чи створилися стовпці
  68.                 {
  69.                     Table.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.None; // Відключення авторозміру для ID
  70.                     Table.Columns[0].Width = 60; // Встановлення фіксованої ширини для ID
  71.                 }
  72.  
  73.                 if (lastSort != "") // Якщо було активне сортування до оновлення
  74.                 {
  75.                     dt.DefaultView.Sort = lastSort; // Застосування попереднього сортування до нових даних
  76.                 }
  77.  
  78.                 conn.Close(); // Закриття з'єднання з базою
  79.             }
  80.             catch (Exception ex) // Виконається у разі помилки (наприклад, немає зв'язку з БД)
  81.             {
  82.                 MessageBox.Show(ex.Message); // Показ вікна з повідомленням про помилку
  83.             }
  84.         }
  85.  
  86.         void SelectRow(int i) // Метод для правильного виділення рядка програмно
  87.         {
  88.             isSelectionProcessing = true; // Повідомляємо системі, що зараз йде процес вибору
  89.             Table.ClearSelection(); // Зняття виділення з усіх рядків
  90.             Table.Rows[i].Selected = true; // Виділення рядка з індексом i
  91.  
  92.             if (Table.Rows[i].Displayed == false) // Якщо рядок знаходиться поза межами видимості
  93.             {
  94.                 Table.FirstDisplayedScrollingRowIndex = i; // Прокручування таблиці до вибраного рядка
  95.             }
  96.  
  97.             selectedCategoryId = Convert.ToInt32(Table.Rows[i].Cells[0].Value); // Отримання ID з клітинки
  98.             Input.Text = Table.Rows[i].Cells[1].Value.ToString(); // Передача назви в поле введення
  99.             isSelectionProcessing = false; // Завершення процесу вибору
  100.  
  101.             Input_TextChanged(null, null); // Оновлення доступності кнопок керування
  102.         }
  103.  
  104.         private void Table_CellClick(object sender, DataGridViewCellEventArgs e) // Подія кліку мишею по таблиці
  105.         {
  106.             if (e.RowIndex >= 0) // Перевірка, що клікнули по рядку, а не по заголовку
  107.             {
  108.                 SelectRow(e.RowIndex); // Виділення рядка, по якому клікнули
  109.             }
  110.         }
  111.  
  112.         private void Add_Click(object sender, EventArgs e) // Обробка натискання кнопки "Додати"
  113.         {
  114.             if (Input.Text.Trim() == "") // Перевірка на пусте поле (з ігноруванням пробілів)
  115.             {
  116.                 return; // Якщо пусте — припиняємо виконання
  117.             }
  118.  
  119.             MySqlConnection conn = new MySqlConnection(connectionString); // Створення з'єднання
  120.             conn.Open(); // Відкриття з'єднання
  121.             MySqlCommand cmd = new MySqlCommand("INSERT INTO categories (name) VALUES (@name)", conn); // SQL-запит на додавання
  122.             cmd.Parameters.AddWithValue("@name", Input.Text.Trim()); // Передача безпечного параметра назви
  123.             cmd.ExecuteNonQuery(); // Виконання запиту на сервері
  124.             conn.Close(); // Закриття з'єднання
  125.  
  126.             LoadData(); // Перезавантаження таблиці для відображення змін
  127.             if (Table.Rows.Count > 0) // Перевірка наявності даних
  128.             {
  129.                 SelectRow(0); // Виділення першого рядка після додавання
  130.             }
  131.         }
  132.  
  133.         private void Edit_Click(object sender, EventArgs e) // Обробка натискання кнопки "Змінити"
  134.         {
  135.             if (selectedCategoryId == -1) // Перевірка, чи вибрана категорія для редагування
  136.             {
  137.                 return; // Якщо не вибрана — виходимо
  138.             }
  139.  
  140.             MySqlConnection conn = new MySqlConnection(connectionString); // Створення з'єднання
  141.             conn.Open(); // Відкриття з'єднання
  142.             string sql = "UPDATE categories SET name=@name WHERE id=@id"; // SQL-запит на оновлення назви за ID
  143.             MySqlCommand cmd = new MySqlCommand(sql, conn); // Створення об'єкта команди
  144.             cmd.Parameters.AddWithValue("@name", Input.Text.Trim()); // Нова назва з поля введення
  145.             cmd.Parameters.AddWithValue("@id", selectedCategoryId); // ID категорії, яку редагуємо
  146.             cmd.ExecuteNonQuery(); // Виконання оновлення в базі
  147.             conn.Close(); // Закриття з'єднання
  148.  
  149.             LoadData(); // Оновлення таблиці на екрані
  150.             Input.Clear(); // Очищення текстового поля
  151.             selectedCategoryId = -1; // Скидання вибраного ID
  152.             if (Table.Rows.Count > 0) // Якщо дані є
  153.             {
  154.                 SelectRow(0); // Виділення першого рядка
  155.             }
  156.         }
  157.  
  158.         private void Delete_Click(object sender, EventArgs e) // Обробка натискання кнопки "Видалити"
  159.         {
  160.             if (Table.SelectedRows.Count == 0) // Перевірка, чи виділено рядок у таблиці
  161.             {
  162.                 return; // Якщо нічого не вибрано — виходимо
  163.             }
  164.  
  165.             string id = Table.SelectedRows[0].Cells[0].Value.ToString(); // Отримання ID вибраного запису
  166.             string name = Table.SelectedRows[0].Cells[1].Value.ToString(); // Отримання назви для тексту повідомлення
  167.  
  168.             DialogResult dr = MessageBox.Show("Видалити категорію " + name + "?", "Підтвердження", MessageBoxButtons.YesNo); // Питання користувачу
  169.             if (dr == DialogResult.Yes) // Якщо користувач натиснув "Так"
  170.             {
  171.                 MySqlConnection conn = new MySqlConnection(connectionString); // Створення з'єднання
  172.                 conn.Open(); // Відкриття бази
  173.                 MySqlCommand cmd = new MySqlCommand("DELETE FROM categories WHERE id=@id", conn); // SQL-запит на видалення
  174.                 cmd.Parameters.AddWithValue("@id", id); // Передача ID для видалення
  175.                 cmd.ExecuteNonQuery(); // Виконання видалення в базі
  176.                 conn.Close(); // Закриття бази
  177.  
  178.                 LoadData(); // Оновлення списку категорій
  179.                 if (Table.Rows.Count > 0) // Якщо таблиця не стала порожньою
  180.                 {
  181.                     SelectRow(0); // Виділення нового першого рядка
  182.                 }
  183.                 else // Якщо видалили останній запис
  184.                 {
  185.                     Input.Clear(); // Очищення тексту
  186.                     selectedCategoryId = -1; // Скидання вибраного ID
  187.                 }
  188.             }
  189.         }
  190.  
  191.         private void Input_TextChanged(object sender, EventArgs e) // Спрацьовує при кожній зміні тексту в полі
  192.         {
  193.             if (isSelectionProcessing == true) // Перевірка, чи зміна тексту викликана кліком по таблиці
  194.             {
  195.                 return; // Якщо так — ігноруємо, щоб не створювати конфліктів
  196.             }
  197.  
  198.             string text = Input.Text.Trim().ToLower(); // Перетворення введеного тексту для зручного порівняння
  199.             bool found = false; // Змінна-прапорець: чи знайдено таку назву вже в таблиці
  200.  
  201.             for (int i = 0; i < Table.Rows.Count; i++) // Перебір усіх рядків таблиці
  202.             {
  203.                 string cellValue = Table.Rows[i].Cells[1].Value.ToString().ToLower(); // Отримання назви з поточної строки
  204.                 if (cellValue == text) // Порівняння введеного тексту з існуючим у таблиці
  205.                 {
  206.                     Table.ClearSelection(); // Зняття виділення
  207.                     Table.Rows[i].Selected = true; // Автоматичне виділення рядка зі збігом
  208.                     if (Table.Rows[i].Displayed == false) // Якщо рядок не видно на екрані
  209.                     {
  210.                         Table.FirstDisplayedScrollingRowIndex = i; // Прокрутка до знайденого рядка
  211.                     }
  212.                     found = true; // Фіксуємо, що таку назву знайдено
  213.                     break; // Зупиняємо пошук
  214.                 }
  215.             }
  216.  
  217.             if (found == false && selectedCategoryId != -1) // Якщо назва нова, але якийсь рядок був вибраний
  218.             {
  219.                 for (int i = 0; i < Table.Rows.Count; i++) // Пошук рядка, що відповідає вибраному ID
  220.                 {
  221.                     int id = Convert.ToInt32(Table.Rows[i].Cells[0].Value); // Отримання ID рядка
  222.                     if (id == selectedCategoryId) // Якщо знайшли рядок, який ми вибирали раніше
  223.                     {
  224.                         Table.ClearSelection(); // Зняття виділень
  225.                         Table.Rows[i].Selected = true; // Повертаємо виділення на цей рядок
  226.                         break; // Вихід з циклу
  227.                     }
  228.                 }
  229.             }
  230.  
  231.             if (text != "" && found == false) // Якщо текст введено і такої назви ще немає
  232.             {
  233.                 Add.Enabled = true; // Кнопка "Додати" стає активною
  234.             }
  235.             else // Якщо поле порожнє або назва-дублікат
  236.             {
  237.                 Add.Enabled = false; // Кнопка "Додати" вимикається
  238.             }
  239.  
  240.             if (selectedCategoryId != -1 && text != "" && found == false) // Для редагування: вибрано рядок і введено нове ім'я
  241.             {
  242.                 Change.Enabled = true; // Кнопка "Змінити" стає активною
  243.             }
  244.             else // В іншому випадку
  245.             {
  246.                 Change.Enabled = false; // Кнопка "Змінити" вимикається
  247.             }
  248.  
  249.             if (found == true) // Якщо в полі введення назва, яка вже є в списку
  250.             {
  251.                 Delete.Enabled = true; // Кнопка "Видалити" стає активною
  252.             }
  253.             else // Якщо такої назви немає
  254.             {
  255.                 Delete.Enabled = false; // Кнопка "Видалити" вимикається
  256.             }
  257.         }
  258.  
  259.         private void Exit_Click(object sender, EventArgs e) // Клік по кнопці виходу
  260.         {
  261.             this.Close(); // Закриття поточної форми
  262.         }
  263.     }
  264. }
Advertisement
Add Comment
Please, Sign In to add comment