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 Categories : Form // Клас вікна керування категоріями
- {
- string connectionString = "server=localhost;database=lab;uid=root;pwd=;"; // Налаштування підключення до БД
- int selectedCategoryId = -1; // ID категорії, яку вибрали в таблиці
- bool isSelectionProcessing = false; // Прапорець для блокування зайвих перевірок при виборі рядка
- public Categories() // Конструктор форми
- {
- InitializeComponent(); // Завантаження візуальних компонентів
- Table.SelectionMode = DataGridViewSelectionMode.FullRowSelect; // Режим виділення рядка повністю
- Table.MultiSelect = false; // Заборона виділяти кілька рядків одночасно
- Table.Sorted += Table_Sorted; // Подія, що спрацьовує після сортування таблиці
- }
- private void Form1_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 id, name FROM categories ORDER BY id ASC"; // SQL-запит на отримання списку
- MySqlDataAdapter adapter = new MySqlDataAdapter(query, conn); // Адаптер для передачі даних
- DataTable dt = new DataTable(); // Тимчасова таблиця в оперативній пам'яті
- adapter.Fill(dt); // Заповнення тимчасової таблиці результатом запиту
- string lastSort = ""; // Змінна для збереження поточного сортування користувача
- if (Table.SortedColumn != null) // Перевірка, чи сортував користувач таблицю раніше
- {
- string columnName = Table.SortedColumn.DataPropertyName; // Отримання назви стовпця сортування
- if (Table.SortOrder == SortOrder.Ascending) // Якщо сортування за зростанням
- {
- lastSort = columnName + " ASC"; // Формування SQL-команди для зростання
- }
- else // Якщо сортування за спаданням
- {
- lastSort = columnName + " DESC"; // Формування SQL-команди для спадання
- }
- }
- Table.DataSource = dt; // Відображення отриманих даних у таблиці на формі
- if (Table.Columns.Count > 0) // Перевірка, чи створилися стовпці
- {
- Table.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.None; // Відключення авторозміру для ID
- Table.Columns[0].Width = 60; // Встановлення фіксованої ширини для ID
- }
- if (lastSort != "") // Якщо було активне сортування до оновлення
- {
- dt.DefaultView.Sort = lastSort; // Застосування попереднього сортування до нових даних
- }
- conn.Close(); // Закриття з'єднання з базою
- }
- catch (Exception ex) // Виконається у разі помилки (наприклад, немає зв'язку з БД)
- {
- MessageBox.Show(ex.Message); // Показ вікна з повідомленням про помилку
- }
- }
- void SelectRow(int i) // Метод для правильного виділення рядка програмно
- {
- isSelectionProcessing = true; // Повідомляємо системі, що зараз йде процес вибору
- Table.ClearSelection(); // Зняття виділення з усіх рядків
- Table.Rows[i].Selected = true; // Виділення рядка з індексом i
- if (Table.Rows[i].Displayed == false) // Якщо рядок знаходиться поза межами видимості
- {
- Table.FirstDisplayedScrollingRowIndex = i; // Прокручування таблиці до вибраного рядка
- }
- selectedCategoryId = Convert.ToInt32(Table.Rows[i].Cells[0].Value); // Отримання ID з клітинки
- Input.Text = Table.Rows[i].Cells[1].Value.ToString(); // Передача назви в поле введення
- isSelectionProcessing = false; // Завершення процесу вибору
- Input_TextChanged(null, null); // Оновлення доступності кнопок керування
- }
- private void Table_CellClick(object sender, DataGridViewCellEventArgs e) // Подія кліку мишею по таблиці
- {
- if (e.RowIndex >= 0) // Перевірка, що клікнули по рядку, а не по заголовку
- {
- SelectRow(e.RowIndex); // Виділення рядка, по якому клікнули
- }
- }
- private void Add_Click(object sender, EventArgs e) // Обробка натискання кнопки "Додати"
- {
- if (Input.Text.Trim() == "") // Перевірка на пусте поле (з ігноруванням пробілів)
- {
- return; // Якщо пусте — припиняємо виконання
- }
- MySqlConnection conn = new MySqlConnection(connectionString); // Створення з'єднання
- conn.Open(); // Відкриття з'єднання
- MySqlCommand cmd = new MySqlCommand("INSERT INTO categories (name) VALUES (@name)", conn); // SQL-запит на додавання
- cmd.Parameters.AddWithValue("@name", Input.Text.Trim()); // Передача безпечного параметра назви
- cmd.ExecuteNonQuery(); // Виконання запиту на сервері
- conn.Close(); // Закриття з'єднання
- LoadData(); // Перезавантаження таблиці для відображення змін
- if (Table.Rows.Count > 0) // Перевірка наявності даних
- {
- SelectRow(0); // Виділення першого рядка після додавання
- }
- }
- private void Edit_Click(object sender, EventArgs e) // Обробка натискання кнопки "Змінити"
- {
- if (selectedCategoryId == -1) // Перевірка, чи вибрана категорія для редагування
- {
- return; // Якщо не вибрана — виходимо
- }
- MySqlConnection conn = new MySqlConnection(connectionString); // Створення з'єднання
- conn.Open(); // Відкриття з'єднання
- string sql = "UPDATE categories SET name=@name WHERE id=@id"; // SQL-запит на оновлення назви за ID
- MySqlCommand cmd = new MySqlCommand(sql, conn); // Створення об'єкта команди
- cmd.Parameters.AddWithValue("@name", Input.Text.Trim()); // Нова назва з поля введення
- cmd.Parameters.AddWithValue("@id", selectedCategoryId); // ID категорії, яку редагуємо
- cmd.ExecuteNonQuery(); // Виконання оновлення в базі
- conn.Close(); // Закриття з'єднання
- LoadData(); // Оновлення таблиці на екрані
- Input.Clear(); // Очищення текстового поля
- selectedCategoryId = -1; // Скидання вибраного ID
- if (Table.Rows.Count > 0) // Якщо дані є
- {
- SelectRow(0); // Виділення першого рядка
- }
- }
- private void Delete_Click(object sender, EventArgs e) // Обробка натискання кнопки "Видалити"
- {
- if (Table.SelectedRows.Count == 0) // Перевірка, чи виділено рядок у таблиці
- {
- return; // Якщо нічого не вибрано — виходимо
- }
- string id = Table.SelectedRows[0].Cells[0].Value.ToString(); // Отримання ID вибраного запису
- string name = Table.SelectedRows[0].Cells[1].Value.ToString(); // Отримання назви для тексту повідомлення
- DialogResult dr = MessageBox.Show("Видалити категорію " + name + "?", "Підтвердження", MessageBoxButtons.YesNo); // Питання користувачу
- if (dr == DialogResult.Yes) // Якщо користувач натиснув "Так"
- {
- MySqlConnection conn = new MySqlConnection(connectionString); // Створення з'єднання
- conn.Open(); // Відкриття бази
- MySqlCommand cmd = new MySqlCommand("DELETE FROM categories WHERE id=@id", conn); // SQL-запит на видалення
- cmd.Parameters.AddWithValue("@id", id); // Передача ID для видалення
- cmd.ExecuteNonQuery(); // Виконання видалення в базі
- conn.Close(); // Закриття бази
- LoadData(); // Оновлення списку категорій
- if (Table.Rows.Count > 0) // Якщо таблиця не стала порожньою
- {
- SelectRow(0); // Виділення нового першого рядка
- }
- else // Якщо видалили останній запис
- {
- Input.Clear(); // Очищення тексту
- selectedCategoryId = -1; // Скидання вибраного ID
- }
- }
- }
- private void Input_TextChanged(object sender, EventArgs e) // Спрацьовує при кожній зміні тексту в полі
- {
- if (isSelectionProcessing == true) // Перевірка, чи зміна тексту викликана кліком по таблиці
- {
- return; // Якщо так — ігноруємо, щоб не створювати конфліктів
- }
- string text = Input.Text.Trim().ToLower(); // Перетворення введеного тексту для зручного порівняння
- bool found = false; // Змінна-прапорець: чи знайдено таку назву вже в таблиці
- for (int i = 0; i < Table.Rows.Count; i++) // Перебір усіх рядків таблиці
- {
- string cellValue = Table.Rows[i].Cells[1].Value.ToString().ToLower(); // Отримання назви з поточної строки
- if (cellValue == text) // Порівняння введеного тексту з існуючим у таблиці
- {
- Table.ClearSelection(); // Зняття виділення
- Table.Rows[i].Selected = true; // Автоматичне виділення рядка зі збігом
- if (Table.Rows[i].Displayed == false) // Якщо рядок не видно на екрані
- {
- Table.FirstDisplayedScrollingRowIndex = i; // Прокрутка до знайденого рядка
- }
- found = true; // Фіксуємо, що таку назву знайдено
- break; // Зупиняємо пошук
- }
- }
- if (found == false && selectedCategoryId != -1) // Якщо назва нова, але якийсь рядок був вибраний
- {
- for (int i = 0; i < Table.Rows.Count; i++) // Пошук рядка, що відповідає вибраному ID
- {
- int id = Convert.ToInt32(Table.Rows[i].Cells[0].Value); // Отримання ID рядка
- if (id == selectedCategoryId) // Якщо знайшли рядок, який ми вибирали раніше
- {
- Table.ClearSelection(); // Зняття виділень
- Table.Rows[i].Selected = true; // Повертаємо виділення на цей рядок
- break; // Вихід з циклу
- }
- }
- }
- if (text != "" && found == false) // Якщо текст введено і такої назви ще немає
- {
- Add.Enabled = true; // Кнопка "Додати" стає активною
- }
- else // Якщо поле порожнє або назва-дублікат
- {
- Add.Enabled = false; // Кнопка "Додати" вимикається
- }
- if (selectedCategoryId != -1 && text != "" && found == false) // Для редагування: вибрано рядок і введено нове ім'я
- {
- Change.Enabled = true; // Кнопка "Змінити" стає активною
- }
- else // В іншому випадку
- {
- Change.Enabled = false; // Кнопка "Змінити" вимикається
- }
- if (found == true) // Якщо в полі введення назва, яка вже є в списку
- {
- Delete.Enabled = true; // Кнопка "Видалити" стає активною
- }
- else // Якщо такої назви немає
- {
- Delete.Enabled = false; // Кнопка "Видалити" вимикається
- }
- }
- private void Exit_Click(object sender, EventArgs e) // Клік по кнопці виходу
- {
- this.Close(); // Закриття поточної форми
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment