Lavig

EnrollmentsView

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