Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System; // Підключення базових функцій системи
- using System.Collections.Generic; // Робота з колекціями даних
- using System.Data; // Робота з таблицями даних у пам'яті
- using System.Windows.Forms; // Бібліотека для створення віконного інтерфейсу
- using MySql.Data.MySqlClient; // Драйвер для взаємодії з базою даних MySQL
- namespace lab8 // Простір імен проекту
- {
- public partial class Roles : Form // Клас форми для керування ролями користувачів
- {
- string connectionString = "server=localhost;database=lab;uid=root;pwd=;"; // Налаштування доступу до БД
- int selectedRoleId = -1; // Змінна для зберігання ID обраної ролі
- bool isSelectionProcessing = false; // Прапорець для запобігання рекурсії при виборі рядка
- public Roles() // Конструктор форми
- {
- InitializeComponent(); // Ініціалізація компонентів дизайну
- Table.SelectionMode = DataGridViewSelectionMode.FullRowSelect; // Налаштування виділення всього рядка
- Table.MultiSelect = false; // Заборона виділення декількох рядків одночасно
- Table.Sorted += Table_Sorted; // Прив'язка події після сортування таблиці
- }
- private void Roles_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, role_name FROM roles ORDER BY id ASC"; // Запит на отримання ролей
- MySqlDataAdapter adapter = new MySqlDataAdapter(query, conn); // Створення адаптера даних
- DataTable dt = new DataTable(); // Таблиця в пам'яті
- adapter.Fill(dt); // Перенесення даних із БД у таблицю dt
- string lastSort = ""; // Змінна для збереження поточного стану сортування
- if (Table.SortedColumn != null) // Якщо таблиця вже була відсортована
- {
- string columnName = Table.SortedColumn.DataPropertyName; // Отримання назви колонки
- if (Table.SortOrder == SortOrder.Ascending) // Перевірка напрямку сортування
- {
- lastSort = columnName + " ASC"; // Сортування за зростанням
- }
- else
- {
- lastSort = columnName + " DESC"; // Сортування за спаданням
- }
- }
- Table.DataSource = dt; // Відображення отриманих даних у DataGridView
- 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; // Прокручування таблиці до цього рядка
- }
- selectedRoleId = 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 roles (role_name) VALUES (@name)", conn); // Команда вставки
- cmd.Parameters.AddWithValue("@name", Input.Text.Trim()); // Захист від SQL-ін'єкцій
- cmd.ExecuteNonQuery(); // Виконання запиту
- conn.Close();
- LoadData(); // Оновлення таблиці
- if (Table.Rows.Count > 0)
- {
- SelectRow(Table.Rows.Count - 1); // Виділення останнього доданого запису
- }
- }
- private void Edit_Click(object sender, EventArgs e) // Кнопка "Редагувати" (альтернативна назва)
- {
- Change_Click(sender, e); // Виклик основного методу зміни
- }
- 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 roles WHERE id=@id", conn); // Команда видалення
- cmd.Parameters.AddWithValue("@id", id); // Прив'язка ID
- cmd.ExecuteNonQuery(); // Виконання видалення
- conn.Close();
- LoadData(); // Оновлення даних
- if (Table.Rows.Count > 0)
- {
- SelectRow(0); // Виділення першого запису після видалення
- }
- else
- {
- Input.Clear(); // Очищення поля вводу
- selectedRoleId = -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 && selectedRoleId != -1) // Якщо назва змінена і не дублює існуючі
- {
- for (int i = 0; i < Table.Rows.Count; i++) // Пошук рядка за збереженим ID
- {
- int id = Convert.ToInt32(Table.Rows[i].Cells[0].Value);
- if (id == selectedRoleId)
- {
- Table.ClearSelection();
- Table.Rows[i].Selected = true; // Тримаємо виділеним редагований запис
- break;
- }
- }
- }
- if (text != "" && found == false) // Умова для активації кнопки "Додати"
- {
- Add.Enabled = true;
- }
- else
- {
- Add.Enabled = false;
- }
- if (selectedRoleId != -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(); // Закриття поточної форми
- }
- private void Change_Click(object sender, EventArgs e) // Кнопка збереження змін (UPDATE)
- {
- if (selectedRoleId == -1 || Input.Text.Trim() == "") // Перевірка наявності даних
- {
- return;
- }
- try
- {
- MySqlConnection conn = new MySqlConnection(connectionString); // З'єднання з БД
- conn.Open();
- string query = "UPDATE roles SET role_name = @name WHERE id = @id"; // Запит на оновлення
- MySqlCommand cmd = new MySqlCommand(query, conn);
- cmd.Parameters.AddWithValue("@name", Input.Text.Trim()); // Нова назва
- cmd.Parameters.AddWithValue("@id", selectedRoleId); // ID ролі, яку міняємо
- cmd.ExecuteNonQuery(); // Виконання оновлення
- conn.Close();
- LoadData(); // Оновлення таблиці після редагування
- for (int i = 0; i < Table.Rows.Count; i++) // Пошук та виділення оновленого рядка
- {
- if (Convert.ToInt32(Table.Rows[i].Cells[0].Value) == selectedRoleId)
- {
- SelectRow(i);
- break;
- }
- }
- }
- catch (Exception ex)
- {
- MessageBox.Show(ex.Message); // Виведення помилки при оновленні
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment