Lavig

Roles

Apr 13th, 2026
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 14.39 KB | None | 0 0
  1. using System; // Підключення базових функцій системи
  2. using System.Collections.Generic; // Робота з колекціями даних
  3. using System.Data; // Робота з таблицями даних у пам'яті
  4. using System.Windows.Forms; // Бібліотека для створення віконного інтерфейсу
  5. using MySql.Data.MySqlClient; // Драйвер для взаємодії з базою даних MySQL
  6.  
  7. namespace lab8 // Простір імен проекту
  8. {
  9.     public partial class Roles : Form // Клас форми для керування ролями користувачів
  10.     {
  11.         string connectionString = "server=localhost;database=lab;uid=root;pwd=;"; // Налаштування доступу до БД
  12.         int selectedRoleId = -1; // Змінна для зберігання ID обраної ролі
  13.         bool isSelectionProcessing = false; // Прапорець для запобігання рекурсії при виборі рядка
  14.  
  15.         public Roles() // Конструктор форми
  16.         {
  17.             InitializeComponent(); // Ініціалізація компонентів дизайну
  18.             Table.SelectionMode = DataGridViewSelectionMode.FullRowSelect; // Налаштування виділення всього рядка
  19.             Table.MultiSelect = false; // Заборона виділення декількох рядків одночасно
  20.             Table.Sorted += Table_Sorted; // Прив'язка події після сортування таблиці
  21.         }
  22.  
  23.         private void Roles_Load(object sender, EventArgs e) // Подія при відкритті вікна
  24.         {
  25.             LoadData(); // Завантаження списку ролей із бази
  26.             if (Table.Rows.Count > 0) // Якщо дані є в таблиці
  27.             {
  28.                 SelectRow(0); // Автоматично виділяємо перший рядок
  29.             }
  30.         }
  31.  
  32.         private void Table_Sorted(object sender, EventArgs e) // Спрацьовує після зміни сортування користувачем
  33.         {
  34.             if (Table.Rows.Count > 0) // Перевірка на наявність рядків
  35.             {
  36.                 SelectRow(0); // Повернення виділення на перший рядок
  37.             }
  38.         }
  39.  
  40.         private void LoadData() // Метод для отримання даних із БД
  41.         {
  42.             try // Початок блоку перевірки на помилки
  43.             {
  44.                 MySqlConnection conn = new MySqlConnection(connectionString); // Створення з'єднання
  45.                 conn.Open(); // Відкриття сесії з БД
  46.                 string query = "SELECT id, role_name FROM roles ORDER BY id ASC"; // Запит на отримання ролей
  47.                 MySqlDataAdapter adapter = new MySqlDataAdapter(query, conn); // Створення адаптера даних
  48.                 DataTable dt = new DataTable(); // Таблиця в пам'яті
  49.                 adapter.Fill(dt); // Перенесення даних із БД у таблицю 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"; // Сортування за зростанням
  58.                     }
  59.                     else
  60.                     {
  61.                         lastSort = columnName + " DESC"; // Сортування за спаданням
  62.                     }
  63.                 }
  64.  
  65.                 Table.DataSource = dt; // Відображення отриманих даних у DataGridView
  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.             selectedRoleId = 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 roles (role_name) VALUES (@name)", conn); // Команда вставки
  122.             cmd.Parameters.AddWithValue("@name", Input.Text.Trim()); // Захист від SQL-ін'єкцій
  123.             cmd.ExecuteNonQuery(); // Виконання запиту
  124.             conn.Close();
  125.  
  126.             LoadData(); // Оновлення таблиці
  127.             if (Table.Rows.Count > 0)
  128.             {
  129.                 SelectRow(Table.Rows.Count - 1); // Виділення останнього доданого запису
  130.             }
  131.         }
  132.  
  133.         private void Edit_Click(object sender, EventArgs e) // Кнопка "Редагувати" (альтернативна назва)
  134.         {
  135.             Change_Click(sender, e); // Виклик основного методу зміни
  136.         }
  137.  
  138.         private void Delete_Click(object sender, EventArgs e) // Кнопка "Видалити"
  139.         {
  140.             if (Table.SelectedRows.Count == 0) // Якщо нічого не вибрано
  141.             {
  142.                 return;
  143.             }
  144.  
  145.             string id = Table.SelectedRows[0].Cells[0].Value.ToString(); // Отримання ID для видалення
  146.             string name = Table.SelectedRows[0].Cells[1].Value.ToString(); // Отримання назви для повідомлення
  147.  
  148.             DialogResult dr = MessageBox.Show("Видалити роль " + name + "? Ця дія видалить роль разом з усіма користувачами!", "Видалення", MessageBoxButtons.YesNo); // Попередження
  149.             if (dr == DialogResult.Yes) // Якщо користувач підтвердив
  150.             {
  151.                 MySqlConnection conn = new MySqlConnection(connectionString); // З'єднання з БД
  152.                 conn.Open();
  153.                 MySqlCommand cmd = new MySqlCommand("DELETE FROM roles WHERE id=@id", conn); // Команда видалення
  154.                 cmd.Parameters.AddWithValue("@id", id); // Прив'язка ID
  155.                 cmd.ExecuteNonQuery(); // Виконання видалення
  156.                 conn.Close();
  157.  
  158.                 LoadData(); // Оновлення даних
  159.                 if (Table.Rows.Count > 0)
  160.                 {
  161.                     SelectRow(0); // Виділення першого запису після видалення
  162.                 }
  163.                 else
  164.                 {
  165.                     Input.Clear(); // Очищення поля вводу
  166.                     selectedRoleId = -1; // Скидання ID
  167.                 }
  168.             }
  169.         }
  170.  
  171.         private void Input_TextChanged(object sender, EventArgs e) // Логіка перевірки тексту в реальному часі
  172.         {
  173.             if (isSelectionProcessing == true) // Ігнорувати, якщо текст змінюється програмою при виборі рядка
  174.             {
  175.                 return;
  176.             }
  177.  
  178.             string text = Input.Text.Trim().ToLower(); // Підготовка тексту для пошуку
  179.             bool found = false; // Прапорець знаходження співпадіння
  180.  
  181.             for (int i = 0; i < Table.Rows.Count; i++) // Перебір рядків для пошуку існуючої ролі
  182.             {
  183.                 string cellValue = Table.Rows[i].Cells[1].Value.ToString().ToLower();
  184.                 if (cellValue == text) // Якщо роль з такою назвою вже є
  185.                 {
  186.                     Table.ClearSelection();
  187.                     Table.Rows[i].Selected = true; // Виділяємо її в таблиці
  188.                     if (Table.Rows[i].Displayed == false)
  189.                     {
  190.                         Table.FirstDisplayedScrollingRowIndex = i; // Прокручуємо до неї
  191.                     }
  192.                     found = true;
  193.                     break;
  194.                 }
  195.             }
  196.  
  197.             if (found == false && selectedRoleId != -1) // Якщо назва змінена і не дублює існуючі
  198.             {
  199.                 for (int i = 0; i < Table.Rows.Count; i++) // Пошук рядка за збереженим ID
  200.                 {
  201.                     int id = Convert.ToInt32(Table.Rows[i].Cells[0].Value);
  202.                     if (id == selectedRoleId)
  203.                     {
  204.                         Table.ClearSelection();
  205.                         Table.Rows[i].Selected = true; // Тримаємо виділеним редагований запис
  206.                         break;
  207.                     }
  208.                 }
  209.             }
  210.  
  211.             if (text != "" && found == false) // Умова для активації кнопки "Додати"
  212.             {
  213.                 Add.Enabled = true;
  214.             }
  215.             else
  216.             {
  217.                 Add.Enabled = false;
  218.             }
  219.  
  220.             if (selectedRoleId != -1 && text != "" && found == false) // Умова для активації кнопки "Змінити"
  221.             {
  222.                 Change.Enabled = true;
  223.             }
  224.             else
  225.             {
  226.                 Change.Enabled = false;
  227.             }
  228.  
  229.             if (found == true) // Умова для активації кнопки "Видалити"
  230.             {
  231.                 Delete.Enabled = true;
  232.             }
  233.             else
  234.             {
  235.                 Delete.Enabled = false;
  236.             }
  237.         }
  238.  
  239.         private void Exit_Click(object sender, EventArgs e) // Кнопка виходу
  240.         {
  241.             this.Close(); // Закриття поточної форми
  242.         }
  243.  
  244.         private void Change_Click(object sender, EventArgs e) // Кнопка збереження змін (UPDATE)
  245.         {
  246.             if (selectedRoleId == -1 || Input.Text.Trim() == "") // Перевірка наявності даних
  247.             {
  248.                 return;
  249.             }
  250.  
  251.             try
  252.             {
  253.                 MySqlConnection conn = new MySqlConnection(connectionString); // З'єднання з БД
  254.                 conn.Open();
  255.                 string query = "UPDATE roles SET role_name = @name WHERE id = @id"; // Запит на оновлення
  256.                 MySqlCommand cmd = new MySqlCommand(query, conn);
  257.                 cmd.Parameters.AddWithValue("@name", Input.Text.Trim()); // Нова назва
  258.                 cmd.Parameters.AddWithValue("@id", selectedRoleId); // ID ролі, яку міняємо
  259.                 cmd.ExecuteNonQuery(); // Виконання оновлення
  260.                 conn.Close();
  261.  
  262.                 LoadData(); // Оновлення таблиці після редагування
  263.  
  264.                 for (int i = 0; i < Table.Rows.Count; i++) // Пошук та виділення оновленого рядка
  265.                 {
  266.                     if (Convert.ToInt32(Table.Rows[i].Cells[0].Value) == selectedRoleId)
  267.                     {
  268.                         SelectRow(i);
  269.                         break;
  270.                     }
  271.                 }
  272.             }
  273.             catch (Exception ex)
  274.             {
  275.                 MessageBox.Show(ex.Message); // Виведення помилки при оновленні
  276.             }
  277.         }
  278.     }
  279. }
Advertisement
Add Comment
Please, Sign In to add comment