UC_GiangVien
using System;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
namespace QLMonHocApp
{
public partial class UC_GiangVien : UserControl
{
SqlConnection conn = new SqlConnection("Data Source=localhost;Initial
Catalog=QLMonHoc;Integrated Security=True");
SqlCommand cmd;
SqlDataAdapter adapter;
DataTable dt;
public UC_GiangVien()
{
InitializeComponent();
// Gắn sự kiện
this.Load += UC_GiangVien_Load;
btnThem.Click += btnThem_Click;
btnSua.Click += btnSua_Click;
btnXoa.Click += btnXoa_Click;
btnTimKiem.Click += btnTimKiem_Click;
btnTaiLai.Click += btnTaiLai_Click;
dgvGiangVien.CellClick += dgvGiangVien_CellClick;
}
private void MakeButtonRounded(Button btn, int radius = 20)
{
GraphicsPath path = new GraphicsPath();
path.StartFigure();
path.AddArc(new Rectangle(0, 0, radius, radius), 180, 90);
path.AddArc(new Rectangle(btn.Width - radius, 0, radius, radius), 270, 90);
path.AddArc(new Rectangle(btn.Width - radius, btn.Height - radius, radius, radius), 0,
90);
path.AddArc(new Rectangle(0, btn.Height - radius, radius, radius), 90, 90);
path.CloseFigure();
btn.Region = new Region(path);
}
private void RoundAllButtons(Control parent)
{
foreach (Control ctrl in parent.Controls)
{
if (ctrl is Button btn)
{
MakeButtonRounded(btn, 20); // Bo tròn nút
btn.FlatStyle = FlatStyle.Flat;
btn.FlatAppearance.BorderSize = 0; // Xóa viền nút
}
else if (ctrl.HasChildren)
{
RoundAllButtons(ctrl); // Gọi đệ quy cho container (Panel,...)
}
}
}
private void UC_GiangVien_Load(object sender, EventArgs e)
{
try
{
LoadGiangVien();
LoadMonHoc();
}
catch (Exception ex)
{
MessageBox.Show("Lỗi load: " + ex.Message);
}
RoundAllButtons(this);
}
private void LoadGiangVien()
{
try
{
if (conn.State == ConnectionState.Open) conn.Close();
conn.Open();
string query = "SELECT * FROM GiangVien";
adapter = new SqlDataAdapter(query, conn);
dt = new DataTable();
adapter.Fill(dt);
dgvGiangVien.DataSource = dt;
conn.Close();
}
catch (Exception ex)
{
MessageBox.Show("Lỗi load giảng viên: " + ex.Message);
}
}
private void LoadMonHoc()
{
try
{
if (conn.State == ConnectionState.Open) conn.Close();
conn.Open();
SqlCommand cmd = new SqlCommand("SELECT MaMon FROM MonHoc", conn);
SqlDataReader reader = cmd.ExecuteReader();
comboMaMon.Items.Clear(); // clear tránh bị trùng
while (reader.Read())
{
comboMaMon.Items.Add(reader["MaMon"].ToString());
}
reader.Close();
conn.Close();
}
catch (Exception ex)
{
MessageBox.Show("Lỗi load môn học: " + ex.Message);
}
}
private void dgvGiangVien_CellClick(object sender, DataGridViewCellEventArgs e)
{
int i = e.RowIndex;
if (i >= 0)
{
txtMaGV.Text = dgvGiangVien.Rows[i].Cells["MaGV"].Value.ToString();
txtHoTen.Text = dgvGiangVien.Rows[i].Cells["HoTen"].Value.ToString();
txtSDT.Text = dgvGiangVien.Rows[i].Cells["SDT"].Value.ToString();
txtEmail.Text = dgvGiangVien.Rows[i].Cells["Email"].Value.ToString();
comboMaMon.Text = dgvGiangVien.Rows[i].Cells["MaMon"].Value.ToString();
}
}
private void btnThem_Click(object sender, EventArgs e)
{
try
{
if (conn.State == ConnectionState.Open) conn.Close();
conn.Open();
string query = "INSERT INTO GiangVien (MaGV, HoTen, SDT, Email, MaMon) VALUES
(@MaGV, @HoTen, @SDT, @Email, @MaMon)";
cmd = new SqlCommand(query, conn);
cmd.Parameters.AddWithValue("@MaGV", txtMaGV.Text);
cmd.Parameters.AddWithValue("@HoTen", txtHoTen.Text);
cmd.Parameters.AddWithValue("@SDT", txtSDT.Text);
cmd.Parameters.AddWithValue("@Email", txtEmail.Text);
cmd.Parameters.AddWithValue("@MaMon", comboMaMon.Text);
cmd.ExecuteNonQuery();
conn.Close();
LoadGiangVien();
MessageBox.Show("Thêm thành công!");
}
catch (Exception ex)
{
MessageBox.Show("Lỗi thêm: " + ex.Message);
}
}
private void btnSua_Click(object sender, EventArgs e)
{
try
{
if (conn.State == ConnectionState.Open) conn.Close();
conn.Open();
string query = "UPDATE GiangVien SET HoTen=@HoTen, SDT=@SDT,
Email=@Email, MaMon=@MaMon WHERE MaGV=@MaGV";
cmd = new SqlCommand(query, conn);
cmd.Parameters.AddWithValue("@MaGV", txtMaGV.Text);
cmd.Parameters.AddWithValue("@HoTen", txtHoTen.Text);
cmd.Parameters.AddWithValue("@SDT", txtSDT.Text);
cmd.Parameters.AddWithValue("@Email", txtEmail.Text);
cmd.Parameters.AddWithValue("@MaMon", comboMaMon.Text);
cmd.ExecuteNonQuery();
conn.Close();
LoadGiangVien();
MessageBox.Show("Sửa thành công!");
}
catch (Exception ex)
{
MessageBox.Show("Lỗi sửa: " + ex.Message);
}
}
private void btnXoa_Click(object sender, EventArgs e)
{
DialogResult result = MessageBox.Show("Bạn có chắc chắn muốn xoá?", "Xác nhận",
MessageBoxButtons.YesNo);
if (result == DialogResult.Yes)
{
try
{
if (conn.State == ConnectionState.Open) conn.Close();
conn.Open();
string query = "DELETE FROM GiangVien WHERE MaGV=@MaGV";
cmd = new SqlCommand(query, conn);
cmd.Parameters.AddWithValue("@MaGV", txtMaGV.Text);
cmd.ExecuteNonQuery();
conn.Close();
LoadGiangVien();
MessageBox.Show("Xoá thành công!");
}
catch (Exception ex)
{
MessageBox.Show("Lỗi xoá: " + ex.Message);
}
}
}
private void btnTaiLai_Click(object sender, EventArgs e)
{
LoadGiangVien();
}
private void btnTimKiem_Click(object sender, EventArgs e)
{
try
{
if (conn.State == ConnectionState.Open) conn.Close();
conn.Open();
string keyword = txtTimKiem.Text.Trim();
string query = "SELECT * FROM GiangVien WHERE MaGV LIKE @kw OR HoTen LIKE
@kw";
cmd = new SqlCommand(query, conn);
cmd.Parameters.AddWithValue("@kw", "%" + keyword + "%");
adapter = new SqlDataAdapter(cmd);
dt = new DataTable();
adapter.Fill(dt);
dgvGiangVien.DataSource = dt;
conn.Close();
}
catch (Exception ex)
{
MessageBox.Show("Lỗi tìm kiếm: " + ex.Message);
}
}
private void panel2_Paint(object sender, PaintEventArgs e)
{
private void lblHoTen_Click(object sender, EventArgs e)
{
private void btnTaiLai_Click_1(object sender, EventArgs e)
{
}
}
}
UC_SinhVien
using System;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
namespace QLMonHocApp
{
public partial class UC_SinhVien : UserControl
{
string chuoiKetNoi = "Data Source=.;Initial Catalog=QLMonHoc;Integrated
Security=True";
public UC_SinhVien()
{
InitializeComponent();
// Gắn sự kiện
this.Load += UC_SinhVien_Load;
btnThem.Click += btnThem_Click;
btnSua.Click += btnSua_Click;
btnXoa.Click += btnXoa_Click;
btnTaiLai.Click += btnTaiLai_Click;
btnTimKiemSV.Click += btnTimKiemSV_Click;
dgvSinhVien.CellClick += dgvSinhVien_CellClick;
private void MakeButtonRounded(Button btn, int radius = 20)
{
GraphicsPath path = new GraphicsPath();
path.StartFigure();
path.AddArc(new Rectangle(0, 0, radius, radius), 180, 90);
path.AddArc(new Rectangle(btn.Width - radius, 0, radius, radius), 270, 90);
path.AddArc(new Rectangle(btn.Width - radius, btn.Height - radius, radius, radius), 0,
90);
path.AddArc(new Rectangle(0, btn.Height - radius, radius, radius), 90, 90);
path.CloseFigure();
btn.Region = new Region(path);
}
private void RoundAllButtons(Control parent)
{
foreach (Control ctrl in parent.Controls)
{
if (ctrl is Button btn)
{
MakeButtonRounded(btn, 20); // Bo tròn nút
btn.FlatStyle = FlatStyle.Flat;
btn.FlatAppearance.BorderSize = 0; // Xóa viền nút
}
else if (ctrl.HasChildren)
{
RoundAllButtons(ctrl); // Gọi đệ quy cho container (Panel,...)
}
}
}
private void UC_SinhVien_Load(object sender, EventArgs e)
{
LoadData();
LoadMaMon(); // GỌI Ở ĐÂY
RoundAllButtons(this);
private void LoadData()
{
using (SqlConnection conn = new SqlConnection(chuoiKetNoi))
{
string query = "SELECT * FROM SinhVien";
SqlDataAdapter da = new SqlDataAdapter(query, conn);
DataTable dt = new DataTable();
da.Fill(dt);
dgvSinhVien.DataSource = dt;
}
}
private void btnThem_Click(object sender, EventArgs e)
{
using (SqlConnection conn = new SqlConnection(chuoiKetNoi))
{
string query = "INSERT INTO SinhVien (MaSV, HoTen, NgaySinh, SDT, Email, Lop,
MaMon) VALUES (@MaSV, @HoTen, @NgaySinh, @SDT, @Email, @Lop, @MaMon)";
SqlCommand cmd = new SqlCommand(query, conn);
cmd.Parameters.AddWithValue("@MaSV", txtMaSV.Text);
cmd.Parameters.AddWithValue("@HoTen", txtHoTen.Text);
cmd.Parameters.AddWithValue("@NgaySinh", dtpNgaySinh.Value); // dùng
DateTimePicker
cmd.Parameters.AddWithValue("@SDT", txtSDT.Text);
cmd.Parameters.AddWithValue("@Email", txtEmail.Text);
cmd.Parameters.AddWithValue("@Lop", txtLop.Text);
cmd.Parameters.AddWithValue("@MaMon", comboMaMon.Text);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
LoadData();
MessageBox.Show("Thêm thành công!");
}
}
private void btnSua_Click(object sender, EventArgs e)
{
using (SqlConnection conn = new SqlConnection(chuoiKetNoi))
{
string query = "UPDATE SinhVien SET HoTen=@HoTen, NgaySinh=@NgaySinh,
SDT=@SDT, Email=@Email, Lop=@Lop, MaMon=@MaMon WHERE MaSV=@MaSV";
SqlCommand cmd = new SqlCommand(query, conn);
cmd.Parameters.AddWithValue("@MaSV", txtMaSV.Text);
cmd.Parameters.AddWithValue("@HoTen", txtHoTen.Text);
cmd.Parameters.AddWithValue("@NgaySinh", dtpNgaySinh.Value);
cmd.Parameters.AddWithValue("@SDT", txtSDT.Text);
cmd.Parameters.AddWithValue("@Email", txtEmail.Text);
cmd.Parameters.AddWithValue("@Lop", txtLop.Text);
cmd.Parameters.AddWithValue("@MaMon", comboMaMon.Text);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
LoadData();
MessageBox.Show("Sửa thành công!");
}
}
private void btnXoa_Click(object sender, EventArgs e)
{
DialogResult result = MessageBox.Show("Xác nhận xoá sinh viên này?", "Cảnh báo",
MessageBoxButtons.YesNo);
if (result == DialogResult.Yes)
{
using (SqlConnection conn = new SqlConnection(chuoiKetNoi))
{
string query = "DELETE FROM SinhVien WHERE MaSV=@MaSV";
SqlCommand cmd = new SqlCommand(query, conn);
cmd.Parameters.AddWithValue("@MaSV", txtMaSV.Text);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
LoadData();
MessageBox.Show("Xoá thành công!");
}
}
}
private void btnTaiLai_Click(object sender, EventArgs e)
{
LoadData();
}
private void btnTimKiemSV_Click(object sender, EventArgs e)
{
using (SqlConnection conn = new SqlConnection(chuoiKetNoi))
{
btnTimKiemSV.Click += btnTimKiemSV_Click;
string keyword = txtTimKiemSV.Text.Trim();
string query = "SELECT * FROM SinhVien WHERE MaSV LIKE @kw OR HoTen LIKE
@kw";
SqlCommand cmd = new SqlCommand(query, conn);
cmd.Parameters.AddWithValue("@kw", "%" + keyword + "%");
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
dgvSinhVien.DataSource = dt;
}
}
private void dgvSinhVien_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex >= 0)
{
txtMaSV.Text = dgvSinhVien.Rows[e.RowIndex].Cells["MaSV"].Value.ToString();
txtHoTen.Text = dgvSinhVien.Rows[e.RowIndex].Cells["HoTen"].Value.ToString();
dtpNgaySinh.Value =
Convert.ToDateTime(dgvSinhVien.Rows[e.RowIndex].Cells["NgaySinh"].Value);
txtSDT.Text = dgvSinhVien.Rows[e.RowIndex].Cells["SDT"].Value.ToString();
txtEmail.Text = dgvSinhVien.Rows[e.RowIndex].Cells["Email"].Value.ToString();
txtLop.Text = dgvSinhVien.Rows[e.RowIndex].Cells["Lop"].Value.ToString();
comboMaMon.Text =
dgvSinhVien.Rows[e.RowIndex].Cells["MaMon"].Value.ToString();
}
private void LoadMaMon()
{
comboMaMon.Items.Clear();
using (SqlConnection conn = new SqlConnection(chuoiKetNoi))
{
conn.Open();
string query = "SELECT MaMon FROM MonHoc";
SqlCommand cmd = new SqlCommand(query, conn);
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
comboMaMon.Items.Add(reader["MaMon"].ToString());
}
reader.Close();
}
if (comboMaMon.Items.Count > 0)
comboMaMon.SelectedIndex = 0;
}
private void UC_SinhVien_Load_1(object sender, EventArgs e)
{
private void lblNgaySinhSV_Click(object sender, EventArgs e)
{
private void txtTimKiemSV_TextChanged(object sender, EventArgs e)
{
private void btnXoa_Click_1(object sender, EventArgs e)
{
private void btnTaiLai_Click_1(object sender, EventArgs e)
{
}
}
}
UC_XemDiem
using System;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
namespace QLMonHocApp
{
public partial class UC_XemDiem : UserControl
{
private string chuoiKetNoi = "Data Source=.;Initial Catalog=QLMonHoc;Integrated
Security=True";
public UC_XemDiem()
{
InitializeComponent();
this.Load += UC_XemDiem_Load;
btnXem.Click += btnXem_Click;
}
private void UC_XemDiem_Load(object sender, EventArgs e)
{
LoadComboBoxMaSV();
LoadComboBoxMonHoc();
RoundAllButtons(this);
}
private void MakeButtonRounded(Button btn, int radius = 20)
{
GraphicsPath path = new GraphicsPath();
path.StartFigure();
path.AddArc(new Rectangle(0, 0, radius, radius), 180, 90);
path.AddArc(new Rectangle(btn.Width - radius, 0, radius, radius), 270, 90);
path.AddArc(new Rectangle(btn.Width - radius, btn.Height - radius, radius, radius), 0,
90);
path.AddArc(new Rectangle(0, btn.Height - radius, radius, radius), 90, 90);
path.CloseFigure();
btn.Region = new Region(path);
}
private void RoundAllButtons(Control parent)
{
foreach (Control ctrl in parent.Controls)
{
if (ctrl is Button btn)
{
MakeButtonRounded(btn, 20); // Bo tròn nút
btn.FlatStyle = FlatStyle.Flat;
btn.FlatAppearance.BorderSize = 0; // Xóa viền nút
}
else if (ctrl.HasChildren)
{
RoundAllButtons(ctrl); // Gọi đệ quy cho container (Panel,...)
}
}
}
private void LoadComboBoxMaSV()
{
cboSinhVien.Items.Clear();
using (SqlConnection conn = new SqlConnection(chuoiKetNoi))
{
conn.Open();
string query = "SELECT MaSV FROM SinhVien";
SqlCommand cmd = new SqlCommand(query, conn);
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
cboSinhVien.Items.Add(reader["MaSV"].ToString());
}
reader.Close();
}
if (cboSinhVien.Items.Count > 0)
cboSinhVien.SelectedIndex = 0;
}
private void LoadComboBoxMonHoc()
{
cboMonHoc.Items.Clear();
using (SqlConnection conn = new SqlConnection(chuoiKetNoi))
{
conn.Open();
string query = "SELECT MaMon FROM MonHoc";
SqlCommand cmd = new SqlCommand(query, conn);
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
cboMonHoc.Items.Add(reader["MaMon"].ToString());
}
reader.Close();
}
if (cboMonHoc.Items.Count > 0)
cboMonHoc.SelectedIndex = 0;
}
private void btnXem_Click(object sender, EventArgs e)
{
if (cboSinhVien.SelectedItem == null || cboMonHoc.SelectedItem == null)
{
MessageBox.Show("Vui lòng chọn sinh viên và môn học.");
return;
}
string maSV = cboSinhVien.SelectedItem.ToString();
string maMon = cboMonHoc.SelectedItem.ToString();
try
{
using (SqlConnection conn = new SqlConnection(chuoiKetNoi))
{
conn.Open();
string query = @"
SELECT
MaSV AS [Mã SV],
MaMon AS [Mã môn],
TenMon AS [Tên môn],
DiemCC AS [Chuyên cần],
DiemGK AS [Giữa kỳ],
DiemCK AS [Cuối kỳ],
DiemTK AS [Tổng kết]
FROM Diem
WHERE MaSV = @MaSV AND MaMon = @MaMon";
SqlCommand cmd = new SqlCommand(query, conn);
cmd.Parameters.AddWithValue("@MaSV", maSV);
cmd.Parameters.AddWithValue("@MaMon", maMon);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
dgvDiem.DataSource = dt;
if (dt.Rows.Count > 0)
{
double diemTK = Convert.ToDouble(dt.Rows[0]["Tổng kết"]);
lblTongKet.Text = $"Điểm tổng kết: {diemTK:0.00}";
}
else
{
lblTongKet.Text = "Không có điểm cho SV và môn học này.";
}
}
}
catch (Exception ex)
{
MessageBox.Show("Lỗi khi xem điểm:\n" + ex.Message);
}
}
private void btnXemDanhSach_Click(object sender, EventArgs e)
{
string connectionString = "Data Source=.;Initial Catalog=QLMonHoc;Integrated
Security=True";
string query = "SELECT MaMon, MaSV, TenMon, DiemCC, DiemGK, DiemCK, DiemTK
FROM Diem";
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlDataAdapter da = new SqlDataAdapter(query, conn);
DataTable dt = new DataTable();
da.Fill(dt);
dgvDiem.DataSource = dt; // gán dữ liệu cho bảng bên dưới
}
}
private void btnInDanhSach_Click(object sender, EventArgs e)
{
if (dgvDiem.Rows.Count == 0)
{
MessageBox.Show("Không có dữ liệu để in.");
return;
}
SaveFileDialog sfd = new SaveFileDialog
{
Filter = "CSV file (*.csv)|*.csv",
FileName = "DanhSachDiem.csv"
};
if (sfd.ShowDialog() == DialogResult.OK)
{
try
{
using (System.IO.StreamWriter sw = new System.IO.StreamWriter(sfd.FileName,
false, System.Text.Encoding.UTF8))
{
// Ghi tiêu đề cột
for (int i = 0; i < dgvDiem.Columns.Count; i++)
{
sw.Write(dgvDiem.Columns[i].HeaderText);
if (i < dgvDiem.Columns.Count - 1) sw.Write(",");
}
sw.WriteLine();
// Ghi từng dòng dữ liệu
foreach (DataGridViewRow row in dgvDiem.Rows)
{
for (int i = 0; i < dgvDiem.Columns.Count; i++)
{
sw.Write(row.Cells[i].Value?.ToString());
if (i < dgvDiem.Columns.Count - 1) sw.Write(",");
}
sw.WriteLine();
}
}
MessageBox.Show("Xuất danh sách thành công!");
}
catch (Exception ex)
{
MessageBox.Show("Lỗi khi xuất danh sách:\n" + ex.Message);
}
}
}
private void lblTongKet_Click(object sender, EventArgs e)
{
}
}
}
UC_Monhoc
using System;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
namespace QLMonHocApp
{
public partial class UC_MonHoc : UserControl
{
string connectionString = "Data Source=localhost;Initial Catalog=QLMonHoc;Integrated
Security=True";
public UC_MonHoc()
{
InitializeComponent();
// Gán sự kiện thủ công
btnThem.Click += btnThem_Click;
btnSua.Click += btnSua_Click;
btnXoa.Click += btnXoa_Click;
btnTim.Click += btnTim_Click;
btnTaiLai.Click += btnTaiLai_Click;
dgvMonHoc.CellClick += dgvMonHoc_CellClick;
LoadData();
}
private void MakeButtonRounded(Button btn, int radius = 20)
{
GraphicsPath path = new GraphicsPath();
path.StartFigure();
path.AddArc(new Rectangle(0, 0, radius, radius), 180, 90);
path.AddArc(new Rectangle(btn.Width - radius, 0, radius, radius), 270, 90);
path.AddArc(new Rectangle(btn.Width - radius, btn.Height - radius, radius, radius), 0,
90);
path.AddArc(new Rectangle(0, btn.Height - radius, radius, radius), 90, 90);
path.CloseFigure();
btn.Region = new Region(path);
}
private void RoundAllButtons(Control parent)
{
foreach (Control ctrl in parent.Controls)
{
if (ctrl is Button btn)
{
MakeButtonRounded(btn, 20); // Bo tròn nút
btn.FlatStyle = FlatStyle.Flat;
btn.FlatAppearance.BorderSize = 0; // Xóa viền nút
}
else if (ctrl.HasChildren)
{
RoundAllButtons(ctrl); // Gọi đệ quy cho container (Panel,...)
}
}
}
private void LoadData()
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
string query = "SELECT * FROM MonHoc";
SqlDataAdapter adapter = new SqlDataAdapter(query, conn);
DataTable dt = new DataTable();
adapter.Fill(dt);
dgvMonHoc.AutoGenerateColumns = true;
dgvMonHoc.DataSource = dt;
}
dgvMonHoc.ReadOnly = true;
dgvMonHoc.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dgvMonHoc.AllowUserToAddRows = false;
dgvMonHoc.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
RoundAllButtons(this);
}
private void btnThem_Click(object sender, EventArgs e)
{
if (!ValidateInput()) return;
using (SqlConnection conn = new SqlConnection(connectionString))
{
string query = "INSERT INTO MonHoc (MaMon, TenMon, SoTinChi, TenGV) VALUES
(@MaMon, @TenMon, @SoTinChi, @TenGV)";
SqlCommand cmd = new SqlCommand(query, conn);
cmd.Parameters.AddWithValue("@MaMon", txtMaMon.Text);
cmd.Parameters.AddWithValue("@TenMon", txtTenMon.Text);
cmd.Parameters.AddWithValue("@SoTinChi", int.Parse(txtSoTinChi.Text));
cmd.Parameters.AddWithValue("@TenGV", txtTenGV.Text);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
}
LoadData();
ClearText();
}
private void btnXoa_Click(object sender, EventArgs e)
{
if (string.IsNullOrWhiteSpace(txtMaMon.Text))
{
MessageBox.Show("Vui lòng chọn môn học để xoá.", "Thông báo",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
DialogResult result = MessageBox.Show(
"Bạn có chắc muốn xoá môn học này không?",
"Xác nhận xoá",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question
);
if (result == DialogResult.Yes)
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
string query = "DELETE FROM MonHoc WHERE MaMon = @MaMon";
SqlCommand cmd = new SqlCommand(query, conn);
cmd.Parameters.AddWithValue("@MaMon", txtMaMon.Text);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
}
LoadData();
ClearText();
}
}
private void btnSua_Click(object sender, EventArgs e)
{
if (!ValidateInput()) return;
using (SqlConnection conn = new SqlConnection(connectionString))
{
string query = "UPDATE MonHoc SET TenMon = @TenMon, SoTinChi = @SoTinChi,
TenGV = @TenGV WHERE MaMon = @MaMon";
SqlCommand cmd = new SqlCommand(query, conn);
cmd.Parameters.AddWithValue("@MaMon", txtMaMon.Text);
cmd.Parameters.AddWithValue("@TenMon", txtTenMon.Text);
cmd.Parameters.AddWithValue("@SoTinChi", int.Parse(txtSoTinChi.Text));
cmd.Parameters.AddWithValue("@TenGV", txtTenGV.Text);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
}
LoadData();
ClearText();
}
private void dgvMonHoc_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex >= 0)
{
DataGridViewRow row = dgvMonHoc.Rows[e.RowIndex];
txtMaMon.Text = row.Cells["MaMon"].Value?.ToString() ?? "";
txtTenMon.Text = row.Cells["TenMon"].Value?.ToString() ?? "";
txtSoTinChi.Text = row.Cells["SoTinChi"].Value?.ToString() ?? "";
txtTenGV.Text = row.Cells["TenGV"].Value?.ToString() ?? "";
// Debug thử xem TenGV có lấy được không
if (string.IsNullOrEmpty(txtTenGV.Text))
{
MessageBox.Show("Không lấy được TenGV. Tên cột có thể không khớp!");
}
}
}
private void btnTim_Click(object sender, EventArgs e)
{
string keyword = txtTimKiem.Text.Trim();
using (SqlConnection conn = new SqlConnection(connectionString))
{
string query = "SELECT * FROM MonHoc WHERE MaMon LIKE '%' + @keyword + '%'
OR TenMon LIKE '%' + @keyword + '%' OR TenGV LIKE '%' + @keyword + '%'";
SqlCommand cmd = new SqlCommand(query, conn);
cmd.Parameters.AddWithValue("@keyword", keyword);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
adapter.Fill(dt);
dgvMonHoc.DataSource = dt;
}
}
private void btnTaiLai_Click(object sender, EventArgs e)
{
LoadData();
}
private void ClearText()
{
txtMaMon.Clear();
txtTenMon.Clear();
txtSoTinChi.Clear();
txtTenGV.Clear();
txtMaMon.Focus();
}
private bool ValidateInput()
{
if (string.IsNullOrWhiteSpace(txtMaMon.Text) ||
string.IsNullOrWhiteSpace(txtTenMon.Text) ||
string.IsNullOrWhiteSpace(txtSoTinChi.Text) ||
string.IsNullOrWhiteSpace(txtTenGV.Text))
{
MessageBox.Show("Vui lòng nhập đầy đủ thông tin môn học và giảng viên.", "Thiếu
dữ liệu", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return false;
}
if (!int.TryParse(txtSoTinChi.Text, out int soTinChi) || soTinChi < 0)
{
MessageBox.Show("Số tín chỉ phải là một số nguyên không âm.", "Sai định dạng",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
return false;
}
return true;
}
private void panel2_Paint(object sender, PaintEventArgs e)
{
private void txtTenMon_TextChanged(object sender, EventArgs e)
{
private void txtTenGV_TextChanged(object sender, EventArgs e)
{
private void btnTaiLai_Click_1(object sender, EventArgs e)
{
private void txtSoTinChi_TextChanged(object sender, EventArgs e)
{
private void UC_MonHoc_Load(object sender, EventArgs e)
{
}
}
}
MainForm
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Windows.Forms;
namespace QLMonHocApp
{
public partial class MainForm : Form
{
private int fadeStep = 0;
// Slideshow
private List<Image> slideImages = new List<Image>();
private int currentImageIndex = 0;
private Control[] trangChuControls;
public MainForm()
{
InitializeComponent();
// Load UserControl vào panelContent
private void LoadControl(UserControl control)
{
panelContent.Controls.Clear();
control.Dock = DockStyle.Fill;
panelContent.Controls.Add(control);
}
// Menu
private void btnMonHoc_Click(object sender, EventArgs e) => LoadControl(new
UC_MonHoc());
private void btnGiangVien_Click(object sender, EventArgs e) => LoadControl(new
UC_GiangVien());
private void btnSinhVien_Click(object sender, EventArgs e) => LoadControl(new
UC_SinhVien());
private void btnDiem_Click(object sender, EventArgs e) => LoadControl(new
UC_XemDiem());
// Load form
private void MainForm_Load(object sender, EventArgs e)
{
slideImages = new List<Image>
{
Properties.Resources.img1,
Properties.Resources.img2,
Properties.Resources.img3
};
// Gán ảnh đầu tiên ngay lập tức
currentImageIndex = 0;
pictureBoxSlide.Image = slideImages[currentImageIndex];
pictureBoxSlide.SizeMode = PictureBoxSizeMode.Zoom;
pictureBoxFade.SizeMode = PictureBoxSizeMode.Zoom;
pictureBoxFade.Visible = false; // Ẩn fade lúc đầu
// Timer Slide
timerSlide.Tick += TimerSlide_Tick;
timerSlide.Interval = 3000;
timerSlide.Start();
trangChuControls = panelContent.Controls.Cast<Control>().ToArray();
pictureBoxSlide.Invalidate();
}
// Auto chuyển ảnh
private void TimerSlide_Tick(object sender, EventArgs e)
{
if (slideImages.Count == 0) return;
currentImageIndex = (currentImageIndex + 1) % slideImages.Count;
StartFadeToImage(slideImages[currentImageIndex]);
}
private void btnTrangchu_Click(object sender, EventArgs e)
{
panelContent.Controls.Clear();
panelContent.Controls.AddRange(trangChuControls);
}
// Fade
private void StartFadeToImage(Image nextImage)
{
pictureBoxFade.Image = nextImage;
pictureBoxFade.Visible = true;
fadeStep = 0;
timerFade.Start();
}
private void timerFade_Tick(object sender, EventArgs e)
{
fadeStep += 10;
if (fadeStep >= 100)
{
timerFade.Stop();
pictureBoxSlide.Image = pictureBoxFade.Image;
pictureBoxFade.Visible = false;
return;
}
pictureBoxSlide.Image = BlendImages(pictureBoxSlide.Image, pictureBoxFade.Image,
fadeStep / 100f);
}
private Image BlendImages(Image img1, Image img2, float alpha)
{
Bitmap bmp = new Bitmap(img1.Width, img1.Height);
using (Graphics g = Graphics.FromImage(bmp))
{
g.DrawImage(img1, new Rectangle(0, 0, bmp.Width, bmp.Height));
ColorMatrix cm = new ColorMatrix { Matrix33 = alpha };
ImageAttributes ia = new ImageAttributes();
ia.SetColorMatrix(cm, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
g.DrawImage(img2, new Rectangle(0, 0, bmp.Width, bmp.Height),
0, 0, img2.Width, img2.Height, GraphicsUnit.Pixel, ia);
}
return bmp;
}
private void pictureBoxFade_Click(object sender, EventArgs e) { }
}
}
Program
using System;
using System.Windows.Forms;
namespace QLMonHocApp
{
internal static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
FormLogin loginForm = new FormLogin();
if (loginForm.ShowDialog() == DialogResult.OK)
{
MessageBox.Show("Đăng nhập thành công!", "Thông báo", MessageBoxButtons.OK,
MessageBoxIcon.Information);
Application.Run(new MainForm());
}
else
{
// Nếu muốn thoát hẳn khi login fail
Application.Exit();
}
}
}
}
Login
using System;
using System.Data.SqlClient;
using System.Windows.Forms;
namespace QLMonHocApp
{
public partial class FormLogin : Form
{
public FormLogin()
{
InitializeComponent();
}
private void FormLogin_Load(object sender, EventArgs e)
{
lblError.Visible = false;
this.AcceptButton = btnLogin; // Nhấn Enter là bấm Login
}
private void btnLogin_Click(object sender, EventArgs e)
{
string user = txtUser.Text.Trim();
string pass = txtPass.Text.Trim();
string connStr = "Data Source=.;Initial Catalog=QLMonHoc;Integrated Security=True";
try
{
using (SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();
string query = "SELECT COUNT(*) FROM TaiKhoan WHERE Username = @user
AND Password = @pass";
SqlCommand cmd = new SqlCommand(query, conn);
cmd.Parameters.AddWithValue("@user", user);
cmd.Parameters.AddWithValue("@pass", pass);
int count = (int)cmd.ExecuteScalar();
if (count > 0)
{
// ✅ Đúng tài khoản => cho FormLogin đóng lại với kết quả OK
this.DialogResult = DialogResult.OK;
this.Close();
}
else
{
// ❌ Sai tài khoản
lblError.Text = "Sai tài khoản hoặc mật khẩu!";
lblError.Visible = true;
}
}
}
catch (Exception ex)
{
MessageBox.Show("Lỗi kết nối: " + ex.Message, "Lỗi", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}