Quản lý lớp học trong hệ thống quản lý điểm sinh viên với WinForms

1. Chức năng quản lý lớp học

Phần này triển khai các thao tác CRUD cho bảng lớp học (Class) trong ứng dụng WinForms. Lớp ListClassForm đóng vai trò là form chính để xử lý các tác vụ này.

private ClassService classService = new ClassService();

public ListClassForm()
{
    InitializeComponent();
    this.dgvListClass.Rows[0].Selected = false; // Bỏ chọn dòng đầu tiên
}

Hiển thị danh sách lớp

private void btnListCass_Click(object sender, EventArgs e)
{
    List<StuClass> classList = classService.GetClassList(); // Lấy tất cả lớp
    this.dgvListClass.AutoGenerateColumns = false;
    this.dgvListClass.DataSource = classList;
}

Xem số lượng sinh viên trong lớp (Double-click)

private void dgvListClass_CellContentDoubleClick(object sender, DataGridViewCellEventArgs e)
{
    string classId = this.dgvListClass.CurrentRow.Cells["ClassId"].Value.ToString();
    int studentCount = classService.GetClassNum(Convert.ToInt32(classId));
    MessageBox.Show("Số sinh viên hiện tại: " + studentCount + " người", "Thông tin");
}

Thêm lớp mới

private void btnAddClass_Click(object sender, EventArgs e)
{
    AddClassForm addForm = new AddClassForm();
    DialogResult result = addForm.ShowDialog();
    if (result == DialogResult.OK)
    {
        btnListCass_Click(null, null); // Làm mới danh sách
    }
}

Sửa tên lớp

private void btnEditClass_Click(object sender, EventArgs e)
{
    // Kiểm tra xem có dòng được chọn không
    if (this.dgvListClass.RowCount == 0 || this.dgvListClass.CurrentRow == null)
    {
        MessageBox.Show("Không có thông tin để sửa!", "Thông báo");
        return;
    }
    if (this.dgvListClass.CurrentRow.Cells["ClassId"].Value == null)
    {
        MessageBox.Show("Không có thông tin để sửa!", "Thông báo");
        return;
    }

    // Lấy ClassId từ dòng được chọn
    string classId = this.dgvListClass.CurrentRow.Cells["ClassId"].Value.ToString();
    StuClass currentClass = classService.QueryStuClassById(classId);

    // Mở form sửa với dữ liệu lớp hiện tại
    EditClassForm editForm = new EditClassForm(currentClass);
    DialogResult result = editForm.ShowDialog();
    if (result == DialogResult.OK)
    {
        btnListCass_Click(null, null);
    }
}

Xóa lớp

private void btnDelClass_Click(object sender, EventArgs e)
{
    // Kiểm tra dòng được chọn
    if (this.dgvListClass.RowCount == 0 || this.dgvListClass.CurrentRow == null)
    {
        MessageBox.Show("Không có thông tin để xóa!", "Thông báo");
        return;
    }
    if (this.dgvListClass.CurrentRow.Cells["ClassId"].Value == null)
    {
        MessageBox.Show("Không có thông tin để xóa!", "Thông báo");
        return;
    }

    // Xác nhận xóa
    DialogResult confirm = MessageBox.Show("Bạn có chắc chắn muốn xóa?", "Xác nhận", 
                                            MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
    if (confirm == DialogResult.Cancel)
        return;

    // Lấy ClassId và thực hiện xóa
    string classId = this.dgvListClass.CurrentRow.Cells["ClassId"].Value.ToString();
    try
    {
        if (classService.DeleteClassById(classId) == 1)
        {
            MessageBox.Show("Xóa thành công!", "Thông báo");
            btnListCass_Click(null, null);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "Lỗi xóa");
    }
}

Các phương thức xử lý dữ liệu (Service Layer)

Lấy danh sách lớp

/// <summary>
/// Lấy tất cả lớp học từ cơ sở dữ liệu
/// </summary>
/// <returns>Danh sách các lớp</returns>
public List<StuClass> GetClassList()
{
    List<StuClass> result = new List<StuClass>();
    string query = "SELECT ClassId, ClassName FROM Class";
    SqlDataReader reader = SQLHelper.GetReader(query);

    while (reader.Read())
    {
        StuClass item = new StuClass();
        item.ClassId = Convert.ToInt32(reader["ClassId"]);
        item.ClassName = reader["ClassName"].ToString();
        result.Add(item);
    }
    reader.Close();
    return result;
}

Thêm lớp mới

/// <summary>
/// Thêm một lớp mới vào cơ sở dữ liệu
/// </summary>
public int AddClass(StuClass newClass)
{
    string sql = $"INSERT INTO Class (ClassName) VALUES ('{newClass.ClassName}')";
    try
    {
        return SQLHelper.Update(sql);
    }
    catch (Exception ex)
    {
        throw new Exception("Lỗi khi thêm lớp: " + ex.Message);
    }
}

Cập nhật tên lớp

/// <summary>
/// Cập nhật tên lớp dựa trên ClassId
/// </summary>
public int UpdateClass(StuClass updatedClass)
{
    var sqlBuilder = new System.Text.StringBuilder();
    sqlBuilder.Append("UPDATE Class SET ClassName = '{0}' WHERE ClassId = {1}");
    string sql = string.Format(sqlBuilder.ToString(), updatedClass.ClassName, updatedClass.ClassId);
    try
    {
        return Convert.ToInt32(SQLHelper.Update(sql));
    }
    catch (SqlException ex)
    {
        throw new Exception("Cập nhật thất bại: " + ex.Message);
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

Xóa lớp (có kiểm tra ràng buộc)

/// <summary>
/// Xóa lớp theo ClassId. Nếu lớp có sinh viên, không thể xóa.
/// </summary>
public int DeleteClassById(string classId)
{
    string sql = "DELETE FROM Class WHERE ClassId = " + classId;
    try
    {
        return SQLHelper.Update(sql);
    }
    catch (SqlException ex)
    {
        // Mã lỗi 547: vi phạm khóa ngoại (FK)
        if (ex.Number == 547)
        {
            throw new Exception("Lớp hiện có sinh viên, không thể xóa!");
        }
        else
        {
            throw new Exception("Lỗi khi xóa: " + ex.Message);
        }
    }
    catch (Exception ex)
    {
        throw new Exception("Lỗi xóa lớp: " + ex.Message);
    }
}

Thẻ: WinForms C# SqlServer DataGridView CRUD

Đăng vào ngày 7 tháng 6 lúc 21:29