Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System; // Підключення основних системних функцій
- using System.Data; // Робота з таблицями даних (DataTable)
- using System.Windows.Forms; // Робота з елементами інтерфейсу Windows Forms
- using MySql.Data.MySqlClient; // Бібліотека для взаємодії з MySQL
- namespace lab8 // Простір імен проекту
- {
- public partial class UsersView : Form // Клас форми перегляду списку користувачів
- {
- string connectionString = "server=localhost;database=lab;uid=root;pwd=;"; // Параметри підключення до БД
- int selectedUserId = -1; // Змінна для зберігання ID вибраного в таблиці користувача
- bool isSelectionProcessing = false; // Прапорець для запобігання конфліктів під час вибору рядків
- public UsersView() // Конструктор форми
- {
- InitializeComponent(); // Створення візуальних компонентів форми
- Table.Sorted += Table_Sorted; // Підписка на подію завершення сортування таблиці
- }
- private void UsersView_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 users.id, users.full_name, users.phone, users.email, users.role_id, " +
- "roles.role_name, users.is_active, users.registration_date, users.avatar_url " +
- "FROM users " +
- "JOIN roles ON users.role_id = roles.id " +
- "ORDER BY users.id ASC"; // SQL-запит для отримання даних користувачів та назв їхніх ролей
- MySqlDataAdapter adapter = new MySqlDataAdapter(query, conn); // Адаптер для наповнення DataTable
- DataTable dt = new DataTable(); // Створення об'єкта таблиці в пам'яті
- adapter.Fill(dt); // Заповнення таблиці результатом запиту
- dt.Columns.Add("Стан"); // Додавання віртуальної колонки для зручного відображення статусу
- for (int i = 0; i < dt.Rows.Count; i++) // Перебір усіх отриманих рядків
- {
- string active = dt.Rows[i]["is_active"].ToString(); // Отримання значення активності
- if (active == "1" || active.ToLower() == "true") // Перевірка, чи користувач активний
- {
- dt.Rows[i]["Стан"] = "Активний"; // Встановлення текстового значення
- }
- else
- {
- dt.Rows[i]["Стан"] = "Неактивний"; // Встановлення текстового значення для заблокованих
- }
- }
- Table.DataSource = dt; // Прив'язка даних до візуального компонента DataGridView
- Table.Columns["role_id"].Visible = false; // Приховування технічної колонки ID ролі
- Table.Columns["avatar_url"].Visible = false; // Приховування посилання на аватар
- Table.Columns["registration_date"].Visible = false; // Приховування дати реєстрації
- Table.Columns["is_active"].Visible = false; // Приховування логічного поля активності
- Table.Columns["password_hash"].Visible = false; // Приховування хешу пароля (якщо він є у вибірці)
- Table.Columns["id"].HeaderText = "ID"; // Перейменування заголовка ID
- Table.Columns["full_name"].HeaderText = "ПІБ"; // Перейменування заголовка ПІБ
- Table.Columns["phone"].HeaderText = "Телефон"; // Перейменування заголовка телефону
- Table.Columns["email"].HeaderText = "Email"; // Перейменування заголовка пошти
- Table.Columns["role_name"].HeaderText = "Роль"; // Перейменування заголовка ролі
- Table.Columns["Стан"].HeaderText = "Стан"; // Перейменування заголовка стану
- conn.Close(); // Закриття з'єднання з БД
- }
- catch (Exception ex) // Обробка можливих помилок
- {
- MessageBox.Show(ex.Message); // Виведення тексту помилки користувачу
- }
- }
- void SelectRow(int i) // Допоміжний метод для виділення конкретного рядка
- {
- if (i < 0 || i >= Table.Rows.Count) return; // Перевірка на коректність індексу
- isSelectionProcessing = true; // Блокування обробки інших подій вибору
- Table.ClearSelection(); // Зняття попередніх виділень
- Table.Rows[i].Selected = true; // Виділення вказаного рядка
- if (Table.Rows[i].Cells["id"].Value != DBNull.Value) // Якщо в комірці ID є значення
- {
- selectedUserId = Convert.ToInt32(Table.Rows[i].Cells["id"].Value); // Збереження ID у змінну
- }
- isSelectionProcessing = false; // Розблокування подій
- Change.Enabled = true; // Активація кнопки редагування
- Delete.Enabled = true; // Активація кнопки видалення
- }
- private void Table_CellClick(object sender, DataGridViewCellEventArgs e) // Подія натискання на комірку
- {
- if (e.RowIndex >= 0) // Перевірка, що натиснуто не на заголовок
- {
- SelectRow(e.RowIndex); // Виклик методу виділення рядка
- }
- }
- private void Add_Click(object sender, EventArgs e) // Обробник кнопки "Додати"
- {
- UsersEdit editForm = new UsersEdit(-1); // Створення форми редагування з ID -1 (новий)
- DialogResult result = editForm.ShowDialog(); // Відкриття форми як модального вікна
- if (result == DialogResult.OK) // Якщо дані успішно збережено
- {
- LoadData(); // Оновлення списку в таблиці
- if (Table.Rows.Count > 0)
- {
- SelectRow(0); // Виділення першого запису
- }
- }
- }
- private void Change_Click(object sender, EventArgs e) // Обробник кнопки "Змінити"
- {
- if (selectedUserId == -1) return; // Якщо нікого не вибрано, нічого не робити
- UsersEdit editForm = new UsersEdit(selectedUserId); // Створення форми з передачею ID вибраного юзера
- DialogResult result = editForm.ShowDialog(); // Відкриття вікна редагування
- if (result == DialogResult.OK) // Якщо редагування завершено успішно
- {
- LoadData(); // Оновлення даних у таблиці
- }
- }
- private void Delete_Click(object sender, EventArgs e) // Обробник кнопки "Видалити"
- {
- if (Table.SelectedRows.Count == 0) return; // Перевірка, чи вибрано рядок
- string name = Table.SelectedRows[0].Cells["full_name"].Value.ToString(); // Отримання імені для підтвердження
- DialogResult confirm = MessageBox.Show("Видалити користувача " + name + "? Ця дія видалить всі дані, пов'язані з користувачем!", "Видалення", MessageBoxButtons.YesNo); // Запит на підтвердження
- if (confirm == DialogResult.Yes) // Якщо користувач підтвердив видалення
- {
- MySqlConnection conn = new MySqlConnection(connectionString); // Створення підключення
- conn.Open(); // Відкриття з'єднання
- MySqlCommand cmd = new MySqlCommand("DELETE FROM users WHERE id=@id", conn); // Команда видалення запису
- cmd.Parameters.AddWithValue("@id", selectedUserId); // Безпечна передача параметра ID
- cmd.ExecuteNonQuery(); // Виконання видалення в БД
- conn.Close(); // Закриття з'єднання
- LoadData(); // Перезавантаження списку
- if (Table.Rows.Count > 0) // Якщо в таблиці ще є записи
- {
- SelectRow(0); // Виділити перший рядок
- }
- else // Якщо записів не залишилося
- {
- Input.Clear(); // Очистити поле пошуку
- selectedUserId = -1; // Скинути вибраний ID
- Change.Enabled = false; // Деактивувати кнопку редагування
- Delete.Enabled = false; // Деактивувати кнопку видалення
- }
- }
- }
- private void Input_TextChanged(object sender, EventArgs e) // Обробник зміни тексту в полі пошуку
- {
- if (isSelectionProcessing == true) return; // Пропустити, якщо йде програмна зміна вибору
- DataTable dt = (DataTable)Table.DataSource; // Отримання джерела даних таблиці
- if (dt != null) // Якщо дані існують
- {
- string text = Input.Text.Replace("'", "''"); // Екранування одинарних лапок для безпеки фільтра
- string filter = "full_name LIKE '%" + text + "%' OR email LIKE '%" + text + "%' OR role_name LIKE '%" + text + "%' OR Стан LIKE '%" + text + "%'"; // Рядок фільтрації по кількох колонках
- dt.DefaultView.RowFilter = filter; // Застосування фільтра до таблиці
- }
- if (Table.Rows.Count > 0) // Якщо після фільтрації є результати
- {
- SelectRow(0); // Виділити перший знайдений рядок
- }
- else // Якщо нічого не знайдено
- {
- selectedUserId = -1; // Скинути ID
- Change.Enabled = false; // Вимкнути кнопки дій
- Delete.Enabled = false;
- }
- }
- private void Exit_Click(object sender, EventArgs e) // Обробник кнопки виходу
- {
- this.Close(); // Закриття форми перегляду
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment