Lavig

UsersView

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