CƠ BẢN
SỰ KIỆN
NÂNG CAO
FIREBASE
WINDOWS FORM
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

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.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

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.

bai8 01 png

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

bai8 02 png

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ả:

bai8 03 png

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ả:

bai8 04 png

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ả:

bai8 05 png

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ả:

bai8 06 png

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é !!!

Cùng chuyên mục:

Memento Design Pattern trong C# - Cách triển khai và ví dụ

Memento Design Pattern trong C# - Cách triển khai và ví dụ

Interpreter Design Pattern trong C# - Cách triển khai và ví dụ

Interpreter Design Pattern trong C# - Cách triển khai và ví dụ

Strategy Design Pattern trong C# - Cách triển khai và ví dụ

Strategy Design Pattern trong C# - Cách triển khai và ví dụ

Visitor Design Pattern trong C# - Cách triển khai và ví dụ

Visitor Design Pattern trong C# - Cách triển khai và ví dụ

Command Design Pattern trong C# - Cách triển khai và ví dụ

Command Design Pattern trong C# - Cách triển khai và ví dụ

Observer Design Pattern trong C# - Cách triển khai và ví dụ

Observer Design Pattern trong C# - Cách triển khai và ví dụ

Iterator Design Pattern trong C# - Cách triển khai và ví dụ

Iterator Design Pattern trong C# - Cách triển khai và ví dụ

Proxy Design Pattern trong C# - Cách triển khai và ví dụ

Proxy Design Pattern trong C# - Cách triển khai và ví dụ

Composite Design Pattern trong C# - Cách triển khai và ví dụ

Composite Design Pattern trong C# - Cách triển khai và ví dụ

Bridge Design Pattern trong C# - Cách triển khai và ví dụ

Bridge Design Pattern trong C# - Cách triển khai và ví dụ

Decorator Design Pattern trong C# - Cách triển khai và ví dụ

Decorator Design Pattern trong C# - Cách triển khai và ví dụ

Facade Design Pattern trong C# - Cách triển khai và ví dụ

Facade Design Pattern trong C# - Cách triển khai và ví dụ

Adapter Design Pattern trong C# - Cách triển khai và ví dụ

Adapter Design Pattern trong C# - Cách triển khai và ví dụ

Singleton Design Pattern trong C# - Cách triển khai và ví dụ

Singleton Design Pattern trong C# - Cách triển khai và ví dụ

Prototype Design Pattern trong C# - Cách triển khai và ví dụ

Prototype Design Pattern trong C# - Cách triển khai và ví dụ

Builder Design Pattern trong C# - Cách triển khai và ví dụ

Builder Design Pattern trong C# - Cách triển khai và ví dụ

Tự viết ứng dụng quản lý xe ra vào C# Winforms và Firebase

Tự viết ứng dụng quản lý xe ra vào C# Winforms và Firebase

Trong bài viết này Freetuts chia sẽ cho các bạn một ứng dụng khá thú…

Factory Design Pattern trong C# - Cách triển khai và ví dụ

Factory Design Pattern trong C# - Cách triển khai và ví dụ

Chúng ta sẽ tìm hiểu về Factory Design Pattern trong C# là gì? Cách triển…

Hướng dẫn giải phương trình bậc hai trong C#

Hướng dẫn giải phương trình bậc hai trong C#

Giải phương trình bậc nhất ax + b = 0 trong C#

Giải phương trình bậc nhất ax + b = 0 trong C#

Top