CƠ BẢN
NÂNG CAO
CÁC CHỦ ĐỀ
BÀI MỚI 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.

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:

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.
  • 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:

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

Bình luận

Cùng chuyên mục:

Cách in ra hình tam giác ký tự * trong C#

Cách in ra hình tam giác ký tự * trong C#

Trong bài viết này mình sẽ hướng dẫn các bạn cách ...

Cách tính tổng các số chẵn từ 1 đến N trong C#

Cách tính tổng các số chẵn từ 1 đến N trong C#

Trước khi đi vào viết chương trình, chúng ta cùng tìm hiểu qua số chẵn…

Cách tính tổng các số lẻ từ 1 đến N trong C#

Cách tính tổng các số lẻ từ 1 đến N trong C#

Trong bài viết này mình sẽ hướng dẫn các bạn cách tính tổng các lẻ…

Cách đếm số chữ số của một số nguyên trong C#

Cách đếm số chữ số của một số nguyên trong C#

Chúng ta cùng xem qua một số ví dụ để hiểu rõ hơn về chương…

Cách tính chu vi và diện tích hình tam giác trong C#

Cách tính chu vi và diện tích hình tam giác trong C#

Tam giác là một loại hình cơ bản trong hình học, có ba đỉnh là…

Cách tính chu vi và diện tích hình tròn trong C#

Cách tính chu vi và diện tích hình tròn trong C#

Trước khi đi vào viết chương trình tính chu vi và diện ..

Cách tính chu vi và diện tích hình chữ nhật trong C#

Cách tính chu vi và diện tích hình chữ nhật trong C#

Trong bài viết này mình sẽ hướng dẫn các bạn ...

Cách xóa phần tử trùng lặp khỏi mảng trong C#

Cách xóa phần tử trùng lặp khỏi mảng trong C#

Trong bài viết này mình sẽ hướng dẫn các bạn cách loại bỏ các ..

Cách tìm tất cả các chuỗi con của chuỗi đã cho trong C#

Cách tìm tất cả các chuỗi con của chuỗi đã cho trong C#

Trong bài viết này mình sẽ hướng dẫn các bạn cách tìm ...

Cách xóa các ký tự trùng lặp khỏi chuỗi trong C#

Cách xóa các ký tự trùng lặp khỏi chuỗi trong C#

Trong bài viết này mình sẽ hướng dẫn các bạn cách xóa các ký tự…

Đếm số lần xuất hiện của ký tự trong chuỗi trong C#

Đếm số lần xuất hiện của ký tự trong chuỗi trong C#

Trong bài viết này minh sẽ hướng dẫn các bạn cách đếm ...

Cách chuyển đổi nhị phân sang thập phân trong C#

Cách chuyển đổi nhị phân sang thập phân trong C#

Trong bài viết này mình sẽ hướng dẫn các bạn cách chuyển đổi số ...

Cách chuyển đổi thập phân sang nhị phân trong C#

Cách chuyển đổi thập phân sang nhị phân trong C#

Số nhị phân là các con số có cơ số là 2. Các số nhị…

Cách tính tổng các chữ số của một số trong C#

Cách tính tổng các chữ số của một số trong C#

Trong bài viết này mình sẽ hướng dẫn các bạn ...

Cách tính giai thừa của một số trong C#

Cách tính giai thừa của một số trong C#

Trước tiên ta cần tìm hiểu xem giai thừa là gì đã nhé. Các bạn…

Cách kiểm tra số Armstrong trong C#

Cách kiểm tra số Armstrong trong C#

Trong bài viết này mình sẽ hướng dẫn các bạn cách kiểm tra số Armstrong…

Cách đảo ngược một số và một chuỗi trong C#

Cách đảo ngược một số và một chuỗi trong C#

Trong bài viết này mình sẽ hướng dẫn các bạn cách đảo ngược ..

Kiểm tra số đối xứng trong C# (Palindrome)

Kiểm tra số đối xứng trong C# (Palindrome)

Trong bài viết này mình sẽ hướng dẫn các bạn cách kiểm tra một ...

Cách kiểm tra số nguyên tố trong C#

Cách kiểm tra số nguyên tố trong C#

Chúng ta sẽ cùng nhau tìm hiểu số nguyên tố là gì và cách kiểm…

In dãy số Fibonacci trong C#

In dãy số Fibonacci trong C#

Trong bài viết này mình sẽ hướng dẫn các bạn cách in dãy số Fibonacci…

Top