Xây dựng phần mềm quản lý điểm trong C# Winforms
Trong bài viết này mình sẽ hướng dẫn các bạn xây dựng một phần mềm quản lý điểm đơn giản với C# Winforms và SQL Server. Chỉ với các thao tác như hiển thị điểm, cập nhật điểm và xóa bảng điểm.
Qua bài này bạn sẽ biết cách kết nối CSDL, cách sử dụng các form controls cũng như các đối tượng ADO .NET dùng để truy vấn và xử lý dữ liệu trong C#.
1. Yêu cầu của phần mềm quản lý điểm trong C# Winforms
Để có thể xây dựng một phần mềm quản lý điểm hoàn chỉnh đòi hỏi rất nhiều yếu tố và kỹ thuật với các ràng buộc chặc chẽ. Ở đây mình chỉ hướng dẫn với một số chức năng cơ bản nhưng rất quan trọng như sau:
- Hiển thị danh sách mã số học sinh (MaHS) vào ComboBox "Mã số học sinh" để người dùng lựa chọn. Danh sách này được lấy từ bảng "Student" trong database StudentDB.
- Hiển thị danh sách môn học vào ComboBox "Môn học" để người dùng lựa chọn. Danh sách này được lấy từ bảng "MonHoc" trong database StudentDB.
- Hiển thị các thông tin tương ứng với các TextBox và ComboBox khi người dùng chọn vào bảng dữ liệu (sử dụng sự kiện CellClick).
- Hiển thị danh sách bảng điểm ở DataGridView với các trường tương ứng như: STT, Mã số, Họ Tên, Môn Học, Điểm.
- Khi người dùng chọn vào button "Cập nhật điểm" sẽ có hai trường hợp xảy ra. Nếu mã số học sinh (MaHS) và mã môn học (MaMH) đã tồn tại trong bảng "Diem" thì cập nhật điểm. Ngược lại nếu không tồn tại một trong hai thì thêm mới một hàng dữ liệu trong bảng "Diem".
- Khi người dùng chọn vào button "Xóa" thì xóa hàng dữ liệu được chọn khỏi database.
- Có điều kiện ràng buộc khi nhập dữ liệu như: Không để trống dữ liệu hoặc điểm phải >=0 và <=10.
- Sau mỗi thao tác đều cập nhật lại bảng dữ liệu DataGridView.
2. Xây dựng giao diện form quản lý điểm trong C# Winforms
Chúng ta sẽ bắt đầu thiết kế giao diện form quản lý điểm theo yêu cầu ở trên. Cụ thể với các control như sau:
Bài viết này được đăng tại [free tuts .net]
- Hai ComboBox hiển thị mã học sinh và môn học cho người dùng chọn.
- Một TextBox để nhập điểm và hiển thị điểm của học sinh.
- Button "Cập nhật điểm", "Thoát", "Reset", "Xóa" với các chức năng tương ứng.
- DataGridView để hiển thị danh sách điểm với các Columns: STT, Mã số, Họ tên, Môn học, Điểm.
3. Tạo database và Stored Procedure trong SQL Server
Trong ứng dụng quản lý điểm này mình cần 3 bảng dữ liệu: "Student", "MonHoc", "Diem" với các trường dữ liệu tương ứng. Các bạn có thể tự tạo mới database hoặc sử dụng đoạn code dưới đây để tạo database sau đó thêm các trường dữ liệu.
Create database StudentDB go USE [StudentDB] GO /****** Object: Table [dbo].[Diem] Script Date: 8/23/2021 2:10:45 PM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Diem]( [MaHS] [int] NOT NULL, [MaMH] [int] NOT NULL, [Diem] [float] NULL, CONSTRAINT [PK_Diem] PRIMARY KEY CLUSTERED ( [MaHS] ASC, [MaMH] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO /****** Object: Table [dbo].[MonHoc] Script Date: 8/23/2021 2:10:45 PM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[MonHoc]( [MaMH] [int] NOT NULL, [TenMH] [nvarchar](50) NULL, CONSTRAINT [PK_MonHoc] PRIMARY KEY CLUSTERED ( [MaMH] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO /****** Object: Table [dbo].[Student] Script Date: 8/23/2021 2:10:45 PM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[Student]( [Id] [int] IDENTITY(1,1) NOT NULL, [Name] [varchar](100) NULL, [Email] [varchar](50) NULL, [Mobile] [varchar](50) NULL, CONSTRAINT [PK__Student__3214EC077F60ED59] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO
Bây giờ sẽ tạo các Stored Procedure trong SQL Server với chức năng như yêu cầu.
Proc lấy danh sách học sinh và danh sách môn học
create proc [dbo].[SP_LayDSHS] as begin select * from Student end --------------------------------- create proc [dbo].[SP_DSMonHoc] as begin select * from MonHoc end
Proc lấy danh sách điểm với các trường dữ liệu: STT, Mã số, Họ Tên, Môn Học, Điểm.
create proc [dbo].[SP_LayDiem] as begin select MaHS,Name,TenMH,Diem from Student, Diem, MonHoc where Student.Id = Diem.MaHS and MonHoc.MaMH = Diem.MaMH end
Proc cập nhật điểm: Sửa điểm hoặc thêm mới tùy vào điều kiện nhập từ người dùng.
create proc [dbo].[SP_CapNhatDiem] @MaHS int, @MaMH int, @Diem float as begin if exists (select * from Diem where MaHS = @MaHS and MaMH = @MaMH) -- trường hợp sửa điểm begin update Diem set Diem = @Diem where MaHS = @MaHS and MaMH = @MaMH end else -- trường hợp thêm mới begin insert Diem(MaHS, MaMH, Diem) values(@MaHS, @MaMH, @Diem) end end
Proc xóa một trường dữ liệu điểm với mã số học sinh và mã môn học.
create proc [dbo].[SP_XoaDiem] @MaHS int, @MaMH int as begin delete Diem where MaHS = @MaHS and MaMH = @MaMH end
4. Xử lý các sự kiện trên form
Ở phần này chúng ta bắt đầu xử lý các sự kiện theo yêu cầu đã đề ra lúc đầu. Cụ thể sẽ xử lý lần lượt các yêu cầu như sau.
Hiển thị danh sách mã học sinh vào ComboBox "Mã số học sinh".
Khi bắt đầu chương trình thì ComboBox "Mã số học sinh" sẽ hiển thị danh sách mã số của các học sinh có trong bảng "Student". Ta sẽ gọi proc "SP_LayDSHS" từ SQL Server để lấy dữ liệu từ bảng "Student".
Sau đó sử dụng DataTable để đổ dữ liệu vào ComboBox thông qua thuộc tính DataSource. Để hiển thị được mã học sinh trong ComboBox ta sử dụng thuộc tính DisplayMember với giá trị mà "Id", tức là mã số học sinh.
Bây giờ chúng ta muốn hiển thị ngay khi chương trình khởi chạy thì gọi hàm này ở sự kiện Form_Load.
private void LayDSHS() { SqlConnection conn = new SqlConnection(); conn.ConnectionString = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString; SqlCommand cmd = new SqlCommand("SP_LayDSHS", conn); cmd.CommandType = CommandType.StoredProcedure; DataTable dt = new DataTable(); SqlDataAdapter da = new SqlDataAdapter(cmd); da.SelectCommand.Connection = conn; conn.Open(); da.Fill(dt); cboMaHS.DataSource = dt; cboMaHS.DisplayMember = "Id"; cboMaHS.Text = ""; conn.Close(); } private void Diem_Load(object sender, EventArgs e) { //hiển thị ds môn học LayDSMonHoc(); //hiển thị ds điểm LayDiem(); //hiển thị ds học sinh LayDSHS(); }
Kết quả:
Hiển thị danh sách môn học vào ComboBox "Môn học".
Tương tự như hiển thị danh sách mã học sinh, ta chỉ cần gọi proc "SP_DSMonHoc" và gán giá trị "TenMH" cho thuộc tính DisplayMember.
Ở đây ta cần chú ý thêm là sử dụng thuộc tính SelectedValue để nhận giá trị trả về khi người dùng chọn vào ComboBox. Ví dụ người dùng chọn vào tên môn học nhưng giá trị trả về sẽ là mã số của môn học đó.
private void LayDSMonHoc() { SqlConnection conn = new SqlConnection(); conn.ConnectionString = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString; SqlCommand cmd = new SqlCommand("SP_DSMonHoc", conn); cmd.CommandType = CommandType.StoredProcedure; DataTable dt = new DataTable(); SqlDataAdapter da = new SqlDataAdapter(cmd); da.SelectCommand.Connection = conn; conn.Open(); da.Fill(dt); cboMaMH.DataSource = dt; cboMaMH.DisplayMember = "TenMH"; cboMaMH.ValueMember = "MaMH"; cboMaMH.SelectedValue = 0; conn.Close(); }
Kết quả:
Hiển thị danh sách điểm vào DataGridView.
Lúc thiết kế giao diện ta đã thêm các Columns STT, Mã số, Họ tên, Môn học, Điểm trong DataGridView. Vậy nên khi hiển thị dữ liệu ta cũng sẽ hiển thị tương ứng với các columns trên DataGridView. Để làm được điều đó ta sử dụng phương thức ExecuteReader()
của class SqlDataReader kèm thêm một vòng lặp while.
*Lưu ý: Proc "SP_LayDiem" sẽ trả về các trường dữ liệu Mã số, Họ tên, Môn học, Điểm. Vậy nên chúng ta gán cho đúng kiểu dữ liệu nhé.
Ví dụ: Mã số là số int và ở vị trí số 0 thì ta gán như sau: dr.GetInt32(0)
.
private void LayDiem() { dtgDiem.Rows.Clear(); SqlConnection conn = new SqlConnection(); conn.ConnectionString = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString; SqlCommand cmd = new SqlCommand("SP_LayDiem", conn); cmd.CommandType = CommandType.StoredProcedure; SqlDataReader dr; conn.Open(); dr = cmd.ExecuteReader(); int STT = 0; while (dr.Read()) { STT = STT + 1; dtgDiem.Rows.Add(STT, dr.GetInt32(0), dr.GetString(1), dr.GetString(2), dr.GetDouble(3)); } dr.Close(); }
Xử lý sự kiện CellClick trên DataGridView.
Khi người dùng chọn vào một trường dữ liệu nào đó trên DataGridView thì các thông tin sẽ được hiển thị tương ứng trên ComboBox và TextBox để có thể xem và thay đổi nó.
private void dtgDiem_CellClick(object sender, DataGridViewCellEventArgs e) { DataGridViewRow row = new DataGridViewRow(); row = dtgDiem.Rows[e.RowIndex]; txtDiem.Text = Convert.ToString(row.Cells["DiemMH"].Value); cboMaHS.Text = Convert.ToString(row.Cells["MaHS"].Value); cboMaMH.Text = Convert.ToString(row.Cells["TenMH"].Value); }
Xử lý sự kiện trên button "Reset".
Ta sẽ viết một hàm Reset()
để xóa các thông tin đang hiển thị trên ComboBox và TextBox. Sở dĩ phải viết một hàm Reset()
là vì ta sẽ sử dụng nó sau khi thực hiện một thao tác thay đổi dữ liệu như thêm, sửa, xóa.
public void Reset() { txtDiem.Text = ""; cboMaHS.Text = ""; cboMaMH.Text = ""; } //button Reset private void btnReset_Click(object sender, EventArgs e) { Reset(); }
Xử lý sự kiện trên button "Cập nhật điểm".
Ở proc "SP_CapNhatDiem" ta đã chia làm ra trường hợp thêm mới hoặc sửa điểm. Vậy nên chỉ cần gọi nó ở C# và truyền vào đúng các tham số mà thôi. Để đảm rằng người dùng nhập đầy đủ thông tin ta sẽ viết một hàm kiểm tra thông tin.
private bool KiemTraThongTin() { if(cboMaHS.Text == "") { MessageBox.Show("Vui lòng nhập mã học sinh", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); cboMaHS.Focus(); return false; } if (cboMaMH.Text == "") { MessageBox.Show("Vui lòng chọn môn học", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); cboMaMH.Focus(); return false; } if (txtDiem.Text == "") { MessageBox.Show("Vui lòng nhập điểm học sinh", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); txtDiem.Focus(); return false; } if(Convert.ToDouble(txtDiem.Text) < 0 || Convert.ToDouble(txtDiem.Text) > 10) { MessageBox.Show("Vui lòng nhập điểm từ 0 đến 10", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); txtDiem.Focus(); txtDiem.SelectAll(); return false; } return true; }
Ta sẽ gọi hàm kiểm tra thông tin này trong sự kiện button_click của button "Cập nhật điểm" để kiểm tra. Nếu đầy đủ và chính xác thì ta mới gọi proc "SP_CapNhatDiem" và cập nhật dữ liệu trong SQL Server.
private void btnCapNhat_Click(object sender, EventArgs e) { if (KiemTraThongTin()) { try { SqlConnection conn = new SqlConnection(); conn.ConnectionString = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString; SqlCommand cmd = new SqlCommand(); cmd.CommandText = "SP_CapNhatDiem"; cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("@MaHS", SqlDbType.Int).Value = Convert.ToInt32(cboMaHS.Text); cmd.Parameters.Add("@MaMH", SqlDbType.Int).Value = Convert.ToInt32(cboMaMH.SelectedValue); cmd.Parameters.Add("@Diem", SqlDbType.Float).Value = Convert.ToDouble(txtDiem.Text); cmd.Connection = conn; conn.Open(); cmd.ExecuteNonQuery(); conn.Close(); MessageBox.Show("Cập nhật thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); Reset(); LayDiem(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } }
Kết quả:
Xử lý sự kiện trên button "Xóa".
Để xóa một trường dữ liệu trong bảng "Diem" ta cần có hai thông tin MaHS (mã số học sinh) và MaMH (mã môn học). Đây cũng là hai khóa chính của bảng "Diem", vậy nên khi muốn xóa ta sẽ yêu cầu người dùng nhập hai tham số này.
Proc "SP_XoaDiem" sẽ có hai tham số cần truyền vào đó là MaHS và MaMH. Để đảm bảo rằng chắc chắn người dùng nhập đầy đủ, ta sẽ thêm điều kiện nếu người dùng chưa nhập thì sẽ thông báo.
private void btnXoa_Click(object sender, EventArgs e) { if (cboMaHS.Text == "") { MessageBox.Show("Vui lòng nhập mã học sinh", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); cboMaHS.Focus(); } else if (cboMaMH.Text == "") { MessageBox.Show("Vui lòng chọn môn học", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); cboMaMH.Focus(); } else { try { SqlConnection conn = new SqlConnection(); conn.ConnectionString = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString; SqlCommand cmd = new SqlCommand(); cmd.CommandText = "SP_XoaDiem"; cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("@MaHS", SqlDbType.Int).Value = Convert.ToInt32(cboMaHS.Text); cmd.Parameters.Add("@MaMH", SqlDbType.Int).Value = Convert.ToInt32(cboMaMH.SelectedValue); cmd.Connection = conn; conn.Open(); cmd.ExecuteNonQuery(); conn.Close(); MessageBox.Show("Xóa thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); Reset(); LayDiem(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } }
Kết quả:
Xử lý sự kiện trên button "Thoát".
Để chắc chắn người dùng muốn thoát, ta cho hiển thị hộp thoại yêu cầu người dùng xác nhận. Nếu chọn OK thì thoát, ngược lại sẽ hủy bỏ lệnh.
private void btnThoat_Click(object sender, EventArgs e) { DialogResult dg = MessageBox.Show("Bạn có chắc muốn thoát?", "Thông báo", MessageBoxButtons.OKCancel, MessageBoxIcon.Question); if (dg == DialogResult.OK) { Application.Exit(); } }
5. Code hoàn chỉnh của phần mềm quản lý điểm trong C# Winforms
using System; using System.Collections.Generic; using System.ComponentModel; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace ExampleStudent { public partial class Diem : Form { public Diem() { InitializeComponent(); } //button thoát private void btnThoat_Click(object sender, EventArgs e) { DialogResult dg = MessageBox.Show("Bạn có chắc muốn thoát?", "Thông báo", MessageBoxButtons.OKCancel, MessageBoxIcon.Question); if (dg == DialogResult.OK) { Application.Exit(); } } public void Reset() { txtDiem.Text = ""; cboMaHS.Text = ""; cboMaMH.Text = ""; } //button Reset private void btnReset_Click(object sender, EventArgs e) { Reset(); } //hàm lấy danh sách môn học và hiển thị ra ComboBox Môn học private void LayDSMonHoc() { SqlConnection conn = new SqlConnection(); conn.ConnectionString = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString; SqlCommand cmd = new SqlCommand("SP_DSMonHoc", conn); cmd.CommandType = CommandType.StoredProcedure; DataTable dt = new DataTable(); SqlDataAdapter da = new SqlDataAdapter(cmd); da.SelectCommand.Connection = conn; conn.Open(); da.Fill(dt); cboMaMH.DataSource = dt; cboMaMH.DisplayMember = "TenMH"; cboMaMH.ValueMember = "MaMH"; cboMaMH.SelectedValue = 0; conn.Close(); } //hàm lấy danh sách học sinh và hiển thị ra ComboBox học sinh private void LayDSHS() { SqlConnection conn = new SqlConnection(); conn.ConnectionString = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString; SqlCommand cmd = new SqlCommand("SP_LayDSHS", conn); cmd.CommandType = CommandType.StoredProcedure; DataTable dt = new DataTable(); SqlDataAdapter da = new SqlDataAdapter(cmd); da.SelectCommand.Connection = conn; conn.Open(); da.Fill(dt); cboMaHS.DataSource = dt; cboMaHS.DisplayMember = "Id"; cboMaHS.Text = ""; conn.Close(); } //hàm kiểm tra thông tin nhập vào có đầy đủ hay không private bool KiemTraThongTin() { if(cboMaHS.Text == "") { MessageBox.Show("Vui lòng nhập mã học sinh", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); cboMaHS.Focus(); return false; } if (cboMaMH.Text == "") { MessageBox.Show("Vui lòng chọn môn học", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); cboMaMH.Focus(); return false; } if (txtDiem.Text == "") { MessageBox.Show("Vui lòng nhập điểm học sinh", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); txtDiem.Focus(); return false; } if(Convert.ToInt32(txtDiem.Text) < 0 || Convert.ToInt32(txtDiem.Text) > 10) { MessageBox.Show("Vui lòng nhập điểm từ 0 đến 10", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); txtDiem.Focus(); txtDiem.SelectAll(); return false; } return true; } //sự kiện khi bắt đầu chạy chương trình private void Diem_Load(object sender, EventArgs e) { LayDSMonHoc(); LayDiem(); LayDSHS(); } //hàm lấy điểm từ SQL Server private void LayDiem() { dtgDiem.Rows.Clear(); SqlConnection conn = new SqlConnection(); conn.ConnectionString = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString; SqlCommand cmd = new SqlCommand("SP_LayDiem", conn); cmd.CommandType = CommandType.StoredProcedure; SqlDataReader dr; conn.Open(); dr = cmd.ExecuteReader(); int STT = 0; while (dr.Read()) { STT = STT + 1; dtgDiem.Rows.Add(STT, dr.GetInt32(0), dr.GetString(1), dr.GetString(2), dr.GetDouble(3)); } dr.Close(); } //sự kiện khi người dùng click chuột vào datagridview private void dtgDiem_CellClick(object sender, DataGridViewCellEventArgs e) { DataGridViewRow row = new DataGridViewRow(); row = dtgDiem.Rows[e.RowIndex]; txtDiem.Text = Convert.ToString(row.Cells["DiemMH"].Value); cboMaHS.Text = Convert.ToString(row.Cells["MaHS"].Value); cboMaMH.Text = Convert.ToString(row.Cells["TenMH"].Value); } //button cập nhật với hai chức năng là thêm mới và sửa điểm private void btnCapNhat_Click(object sender, EventArgs e) { if (KiemTraThongTin()) { try { SqlConnection conn = new SqlConnection(); conn.ConnectionString = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString; SqlCommand cmd = new SqlCommand(); cmd.CommandText = "SP_CapNhatDiem"; cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("@MaHS", SqlDbType.Int).Value = Convert.ToInt32(cboMaHS.Text); cmd.Parameters.Add("@MaMH", SqlDbType.Int).Value = Convert.ToInt32(cboMaMH.SelectedValue); cmd.Parameters.Add("@Diem", SqlDbType.Float).Value = Convert.ToDouble(txtDiem.Text); cmd.Connection = conn; conn.Open(); cmd.ExecuteNonQuery(); conn.Close(); MessageBox.Show("Cập nhật thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); Reset(); LayDiem(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } } //button xóa điểm private void btnXoa_Click(object sender, EventArgs e) { if (cboMaHS.Text == "") { MessageBox.Show("Vui lòng nhập mã học sinh", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); cboMaHS.Focus(); } else if (cboMaMH.Text == "") { MessageBox.Show("Vui lòng chọn môn học", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); cboMaMH.Focus(); } else { try { SqlConnection conn = new SqlConnection(); conn.ConnectionString = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString; SqlCommand cmd = new SqlCommand(); cmd.CommandText = "SP_XoaDiem"; cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("@MaHS", SqlDbType.Int).Value = Convert.ToInt32(cboMaHS.Text); cmd.Parameters.Add("@MaMH", SqlDbType.Int).Value = Convert.ToInt32(cboMaMH.SelectedValue); cmd.Connection = conn; conn.Open(); cmd.ExecuteNonQuery(); conn.Close(); MessageBox.Show("Xóa thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); Reset(); LayDiem(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } } } }
Trên đây là ứng dụng quản lý học sinh trong C# winforms với các chức năng đơn giản. Để có thể đưa ra sử dụng thì cần thêm rất nhiều các ràng buộc và chức năng. Tuy nhiên để học thì mình nghĩ từ các chức năng cơ bản này các bạn sẽ phát triển thêm các chức năng khác nữa, chúc các bạn thành công nhé !!!