Tạo nút thêm sửa xóa trong access
Giới thiệu
Với sự phát triển của công nghệ thông tin, ngày nay mọi lĩnh vực đều cố gắng xây dựng các phần mềm quản lý để tiết kiệm chi phí và tăng hiệu quả lao động như các phần mềm quản lý sản phẩm, quản lý bán hàng, quản lý nhân sự, v.v. Làm sao chúng ta có thể lập trình được một ứng dụng sử dụng dữ liệu được lưu trữ ở một hệ quản trị CSDL nào đó ví dụ như Access hoặc SQL Server. Với sự ra đời của .Net, bạn có thể xây dựng những ứng dụng lập trình với CSDL một cách dễ dàng và nhanh chóng. Đây là bài hướng dẫn từng bước cách lập trình với cơ sở dữ liệu sử dụng ngôn ngữ C# và hệ quản trị CSDL SQL Server.
Bạn đang xem: Tạo nút thêm sửa xóa trong access
Chuẩn bị trước
Các câu lệnh SQL cơ bản như SELECT, INSERT, UPDATE, DELETEYêu cầu bài toán
Thiết kế cơ sở dữ liêu đặt tên QLBanHang, trong đó có bảng:
tblMatHang( MaSP nchar(5), TenSP nvarchar(30), NgaySX Date, NgayHH Date, DonVi nvarchar(10), DonGia Float , GhiChu nvarchar(200))
Thiết kết giao diện:
Các phần cửa sổ co giãn hợp lý khi của sổ của Form phóng to hoặc thu nhỏ, ví dụ cửa sổ (3) luôn giữ cố định ở bên trái, phần cửa sổ (4) và (5) co giãn khi Form thay đổi kích thước, (1) và (2) luôn nằm trên đầu và phía dưới cùng của Form.Các nút có gắn các phím tắt ví dụ như Alt + T cho nút Tìm kiếm, Alt + H cho nút Thêm, v.v.
Hỗ trợ các tiêu chí: MaSP, TenSP, NgaySX, NgayHetHan, DonGia
Tiêu đề: TÌM KIẾM MẶT HÀNG
Khi ấn nút Tìm:
dgvDanhSach sẽ hiển thị tất cả các thông tin về các sản phẩm thoả mãn các tiêu chí lựa chọn.Cấm Click vào các nút Sửa, XoáKhi Click vào từng trường, các thông tin sẽ hiển thị chi tiết sang các control bên grbChiTiet, nhưng không cho phép sửa đổi dữ liệu. Không cho kích vào nút Lưu, Huỷ trong grbChiTiet.b) Chức năng ThêmTiêu đề: THÊM MẶT HÀNG
Sẽ xoá trắng các control trong grbChiTiet và hai nút Lưu và Huỷ sẽ kích hoạt.Cấm Click vào các nút Sửa, Xoá.Khi ấn nút Huỷ, sẽ thoát khỏi chức năng thêm (Xoá trắng grbChiTiet, không cho nhập dữ liệu)Khi ấn vào nút Lưu, nếu thêm mới thành công, cập nhật lại dữ liệu trong dgvDanhSachc) Chức năng Sửa
Tiêu đề: CẬP NHẬT MẶT HÀNG
Nút Sửa chỉ cho Enable = True khi người dùng chọn một bản ghi trong dgvDanhSach.
Xem thêm: Lịch Phát Sóng 'Hậu Duệ Mặt Trời' Việt Nam Tập 23, 24
Khi ấn nút Sửa:
Cấm Click vào các nút Thêm, Xoá.grbChiTiet cho phép sửa dữ liệu. Trong grbChiTiet cho hiển thị nút lệnh Lưu, Huỷ bỏ. Khi ấn nút Huỷ, sẽ thoát khỏi chức năng Sửa (cấm Click vào nút Sửa, cho phép Click vào nút Thêm)Nếu Cập nhật thành công, cập nhật lại dgvDanhSachd) Chức năng XoáTiêu đề: XOÁ MẶT HÀNG
Nút Xoá chỉ cho phép Click khi người dùng chọn một bản ghi trong dgvDanhSach
Khi ấn nút Xoá:
Cấm Click vào các nút Thêm, Sửa.Các control trên grbChiTiet không cho phép sửa dữ liệu. Trong grbChiTiet cho hiển thị nút lệnh Lưu, Huỷ bỏ. Khi ấn nút Huỷ sẽ thoát khỏi chức năng Xoá (cấm Click vào nút Xoá, cho phép Click vào nút Thêm)Xây dựng chương trình
1. Tạo mới ProjectKích vào menu Start > All Programs > Microsoft Visual Studio 2010 (tuỳ theo phiên bản bạn cài)Rồi trên cửa sổ VS 2010 kích vào menu File > New > Project …Chọn ngôn ngữ C# và kiểu ứng dụng bạn lập trình. Trong trường hợp này bạn chọn Windows Form Application

Lập trình CSDL với .NET có một chuẩn chung với các nguồn cơ sở dữ liệu khác nhau, nó chỉ khác nhau về .NET Data Provider. Trong bài này chúng ta sẽ sử dụng hệ quản trị CSDL SQL Server được cài mặc định khi cài Visual Studio
Kích chuột phải vào tên Project trong của sổ Solution Explorer > Add > New Item > Service-based Database


Cửa sổ chính | Form | Name = frmMatHangText = Quản lý sản phẩm |
ErrorProvider | Name = errChiTiet | |
(1) | Panel | Dock = Top |
Label | Name = lblTieuDe | |
(2) | Panel | Dock = Bottom |
Button | Name = btnTimKiemText = &Tìm kiếm | |
Button | Name = btnThemText = T&hêm | |
Button | Name = btnSuaText = &Sửa | |
Button | Name = btnXoaText = &Xoá | |
Button | Name = btnThoatText = Th&oát | |
Button | Name = btnTimKiemText = &Tìm kiếm | |
(3) | GroupBox | Dock = LeftText = Chi tiết |
Spliter | Dock = Left | |
Label | Text = Mã SP: | |
TextBox | Name = txtMaSP | |
Label | Text = Tên SP: | |
TextBox | Name = txtTenSP | |
Label | Text = Ngày SX: | |
DateTimePicker | Name = dtpNgaySXFormat=Short | |
Label | Text = Ngày HH: | |
DateTimePicker | Name = dtpNgayHHFormat=Short | |
Label | Text = Đơn vị: | |
TextBox | Name = txtDonVi | |
Label | Text = Đơn giá: | |
TextBox | Name = txtDonGiaTextAlign = Right | |
Label | Text = Ghi chú: | |
TextBox | Name = txtGhiChuMultiline = True | |
Button | Name = btnLuuText = &Lưu | |
Button | Name = btnHuyText = &Huỷ | |
(4) | GroupBox | Text = Tìm kiếmDock = Top |
Spliter | Dock = Top | |
Label | Text = Mã SP: | |
TextBox | Name = txtTKMaSP | |
Label | Text = Tên SP: | |
TextBox | Name = txtTKTenSP | |
(5) | GroupBox | Text = Kết quảDock = Fill |
DataGridView | Name = dgvKetQua |
Chú ý để thiết kế được giao diện thân thiện với người dùng và các control tự co giãn khi Form thay đổi kích thước cần thiết kế, chú ý kéo các control đúng thứ tự như sau:Giao diện phần (1): là phần nhãn tiêu đề, kéo control Panel vào Form và đặt thuộc tính Dock = Top để cho Panel luôn nằm ở trên đầu của Form, sau đó kéo một Label nằm trên Panel này.Giao diện phần (2): là phần các nút Tìm kiếm, Thêm … cũng làm tương tự như phần (1), kéo control Panel và đặt thuộc tính Dock = Bottom để Panel này luôn nằm cuối của Form, sau đó mới đặt các Button nằm trên Panel này.Giao diện phần (3): là phần chi tiết, kéo control GroupBox vào Form và đặt thuộc tính Dock = Left, sau đó thiết kế các control cho nhập Mã SP, Tên SP … Sau đó ta kéo thêm control Spliter và đặt thuộc tính Dock = Left để cho phép người dùng thay đổi độ rộng giữa phần (3) với phần (4) và (5).Giao diện phần (4): là phần tìm kiếm, kéo control GroupBox vào Form và đặt thuộc tính Dock = Top, lúc này nó sẽ nằm ở trên phần còn lại. Sau đó đặt các control cho phép nhập tìm kiếm như Mã SP, Tên SP … Trong phần này ta cũng kéo control Spliter, đặt thuộc tính Dock = Top để cho phép người sử dụng thay đổi độ rộng giữa phần (4) và phần (5)Giao diện phần (5): là phần hiển thị dữ liệu, kéo control GroupBox và đặt thuộc tính Dock = Fill, sau đó kéo control DataGridView nằm trong GroupBox này nó sẽ chiếm toàn bộ phần không gian còn lại.Viết chương trình chạy trên Windows thì cần tuân theo chuẩn của Windows, ví dụ khi ấn phím Tab trên bàn phím thì con trỏ sẽ chạy từ bên trên -> sang trái -> xuống dưới -> sang phải. Nếu thứ tự bạn kéo control không đúng thì khi ấn phím Tab sẽ nhảy lung tung. Bạn có thể đặt lại bằng cách vào menu View > Tab Order để đặt lại thứ tự Tab trên các control. Sau khi đặt xong quay lại chọn lại menu View > Tab Order để kết thúc.4. Phần code lập trình các chức năngKhai báo .Net Data Provider cho SQL Server
using System.Data.SqlClient;Khai báo các biến toàn cục nằm ngay dưới classnamespace QLBanHang{ public partial class frmMatHang : Form { //Khai báo các biến toàn cục SqlConnection con;//Khai báo đối tượng thực hiện kết nối đến cơ sở dữ liệu SqlCommand cmd;//Khai báo đối tượng thực hiện các câu lệnh truy vấn SqlDataAdapter dap;//Khai báo đối tượng gắn kết DataSource với DataSet DataSet ds;//Đối tượng chứa dữ liệu tại local public frmMatHang() { InitializeComponent(); } }}Viết sự kiện Form_Load, xảy ra khi form khởi động lên. Chúng ta thực hiện khởi tạo kết nối và nạp dữ liệu lên DataGridView private void frmMatHang_Load(object sender, EventArgs e) { //Tạo đối tượng Connection con = new SqlConnection(); //Truyền vào chuỗi kết nối tới cơ sở dữ liệu //Gọi Application.StartupPath để lấy đường dẫn tới thư mục chứa file chạy chương trình con.ConnectionString =
"\QLBanHang.mdf;Integrated Security=True;User Instance=True"; //Gọi phương thức Load dự liệu LoadDuLieu("Select * from tblMatHang"); //Khi Form mới Load lên thì ẩn các bút Sửa và Xóa btnSua.Enabled = false; btnXoa.Enabled = false; //An groupbox chi tiet HienChiTiet(false); } //Viết một hàm nạp dữ liệu lên DataGrid private void LoadDuLieu(String sql) { //tạo đối tượng DataSet ds = new DataSet(); //Khởi tạo đối tượng DataAdapter và cung cấp vào câu lệnh SQL và đối tượng Connection dap = new SqlDataAdapter(sql,con); //Dùng phương thức Fill của DataAdapter để đổ dữ liệu từ DataSource tới DataSet dap.Fill(ds); //Gắn dữ liệu từ DataSet lên DataGridView dgvKetQua.DataSource = ds.Tables<0>; } //Phương thức ẩn hiện các control ở groupbox chi tiết private void HienChiTiet(Boolean hien) { txtMaSP.Enabled = hien; txtTenSP.Enabled = hien; dtpNgayHH.Enabled = hien; dtpNgaySX.Enabled = hien; txtDonVi.Enabled = hien; txtDonGia.Enabled = hien; txtGhiChu.Enabled = hien; //Ẩn hiện 2 nút Lưu và Hủy btnLuu.Enabled = hien; btnHuy.Enabled = hien; }Chức năng tìm kiếm, sử dụng sự kiện Click của nút Tìm kiếm //Chức năng tìm kiếm private void btnTimKiem_Click(object sender, EventArgs e) { //Cập nhật trên nhãn tiêu đề lblTieuDe.Text = "TÌM KIẾM MẶT HÀNG"; //Cấm nút Sửa và Xóa btnSua.Enabled = false; btnXoa.Enabled = false; //Viet cau lenh SQL cho tim kiem String sql = "SELECT * FROM tblMatHang"; String dk = ""; //Tim theo MaSP khac rong if (txtTKMaSP.Text.Trim() != "") { dk += " MaSP like "%" + txtTKMaSP.Text + "%""; } //kiem tra TenSP va MaSP khac rong if (txtTKTenSP.Text.Trim() != "" && dk != "") { dk += " AND TenSP like N"%" + txtTKTenSP.Text + "%""; } //Tim kiem theo TenSP khi MaSP la rong if (txtTKTenSP.Text.Trim() != "" && dk == "") { dk += " TenSP like N"%" + txtTKTenSP.Text + "%""; } //Ket hoi dk if (dk != "") { sql += " WHERE" + dk; } //Goi phương thức Load dữ liệu kết hợp điều kiện tìm kiếm LoadDuLieu(sql); }Chức năng Thêm, sử dụng sự kiện Click của nút Thêm //Sự kiện thêm mới mặt hàng private void btnThem_Click(object sender, EventArgs e) { lblTieuDe.Text = "THÊM MẶT HÀNG"; //Xoa trang GroupBox chi tiết sản phẩm XoaTrangChiTiet(); //Cam nut sua xoa btnSua.Enabled = false; btnXoa.Enabled = false; //Hiện GroupBox Chi tiết HienChiTiet(true); }Chức năng Sửa xảy ra khi chọn một bản ghi trên DataGridView. Kích đúp vàp DataGridView, VS sẽ phát sinh tự động sự kiện CellContentClick. Chúng ta lấy giá trị hàng hiện tại thông qua tham số của sự kiện DataGridViewCellEventArgs e trả về qua thuộc tính RowIndex. Sau đó ta viết sự kiện Click của nút Sửa //Sư kiện khi người dùng chọn một hàng trên DataGridView private void dgvKetQua_CellContentClick(object sender, DataGridViewCellEventArgs e) { //Hien thi nut sua btnSua.Enabled = true; btnXoa.Enabled = true; btnThem.Enabled = false; //Bắt lỗi khi người sử dụng kích linh tinh lên datagrid try { txtMaSP.Text = dgvKetQua<0, e.RowIndex>.Value.ToString(); txtTenSP.Text = dgvKetQua<1, e.RowIndex>.Value.ToString(); dtpNgaySX.Value = (DateTime)dgvKetQua<2, e.RowIndex>.Value; dtpNgayHH.Value = (DateTime)dgvKetQua<3, e.RowIndex>.Value; txtDonVi.Text = dgvKetQua<4, e.RowIndex>.Value.ToString(); txtDonGia.Text = dgvKetQua<5, e.RowIndex>.Value.ToString(); txtGhiChu.Text = dgvKetQua<6, e.RowIndex>.Value.ToString(); } catch (Exception ex) { } } //Sự kiện Click của nút sửa private void btnSua_Click(object sender, EventArgs e) { //Cập nhật tiêu đề lblTieuDe.Text = "CẬP NHẬT MẶ HÀNG"; //Ẩn hai nút Thêm và Sửa btnThem.Enabled = false; btnXoa.Enabled = false; //Hiện gropbox chi tiết HienChiTiet(true); }Chức năng Xoá xảy ra khi chọn một bản ghi trên DataGridView. Chúng ta vẫn sử dụng lại sự kiện ở CellContentClick của DataGridView ở phía trên. Sau đó ta viết sự kiện Click của nút Xoá //Sự kiện Click của nút Xóa private void btnXoa_Click(object sender, EventArgs e) { //Bật Message Box cảnh báo người sử dụng if (MessageBox.Show("Bạn có chắc chắn xóa mã mặt hàng " + txtMaSP.Text + " không? Nếu có ấn nút Lưu, không thì ấn nút Hủy", "Xóa sản phẩm", MessageBoxButtons.YesNo) == DialogResult.Yes) { lblTieuDe.Text = "XÓA MẶT HÀNG"; btnThem.Enabled = false; btnSua.Enabled = false; //Hiện gropbox chi tiết HienChiTiet(true); } }Chức năng Lưu, chúng ta dựa vào trạng thái Enable của các nút Thêm, Sửa hoặc Xoá để xác nhận trạng thái thực thi câu lệnh SQL //Sự kiện click vào button Lưu private void btnLuu_Click(object sender, EventArgs e) { string sql = ""; //Kiếm tra nếu kết nối chưa mở thì thực hiện mở kết nối if (con.State != ConnectionState.Open) con.Open(); //Chúng ta sử dụng control ErrorProvider để hiển thị lỗi //Kiểm tra tên sản phầm có bị để trống không if (txtTenSP.Text.Trim() == "") { errChiTiet.SetError(txtTenSP, "Bạn không để trống tên sản phẩm!"); return; } else { errChiTiet.Clear(); } //Kiểm tra ngày sản xuất, lỗi nếu người sử dụng nhập vào ngày sản xuất lớn hơn ngày hiện tại if (dtpNgaySX.Value > DateTime.Now) { errChiTiet.SetError(dtpNgaySX, "Ngày sản xuất không hợp lệ!"); return; } else { errChiTiet.Clear(); } //Kiểm tra ngày hết hạn xem có lớn hơn ngày sản xuất không if (dtpNgaySX.Value > DateTime.Now) { errChiTiet.SetError(dtpNgaySX, "Ngày sản xuất không hợp lệ!"); return; } else { errChiTiet.Clear(); } //Kiểm tra ngày hết hạn xem có lớn hơn ngày sản xuất không if (dtpNgayHH.Value 0) { errChiTiet.SetError(txtMaSP, "Mã sản phẩm trùng trong cơ sở dữ liệu"); return; } errChiTiet.Clear(); } //Insert vao CSDL sql = "INSERT INTO tblMatHang(MaSP,TenSP,NgaySX,NgayHH,DonVi,DonGia,GhiChu)VALUES ("; sql += "N"" + txtMaSP.Text + "",N"" + txtTenSP.Text + "","" + dtpNgaySX.Value.Date + "","" + dtpNgayHH.Value.Date + "",N"" + txtDonVi.Text + "",N"" + txtDonGia.Text + "",N"" + txtGhiChu.Text + "")"; } //Nếu nút Sửa enable thì thực hiện cập nhật dữ liệu if (btnSua.Enabled == true) { sql = "Update tblMatHang SET "; sql += "TenSP = N"" + txtTenSP.Text + "","; sql += "NgaySX = "" + dtpNgaySX.Value.Date + "","; sql += "NgayHH = "" + dtpNgayHH.Value.Date + "","; sql += "DonVi = N"" + txtDonVi.Text + "","; sql += "DonGia = "" + txtDonGia.Text + "","; sql += "GhiChu = N"" + txtGhiChu.Text + "" "; sql += "Where MaSP = N"" + txtMaSP.Text + """; } //Nếu nút Xóa enable thì thực hiện xóa dữ liệu if (btnXoa.Enabled == true) { sql = "Delete From tblMatHang Where MaSP =N"" + txtMaSP.Text + """; } //Thuc thi cau lenh sql cmd = new SqlCommand(sql, con); cmd.ExecuteNonQuery(); //Cap nhat lai DataGrid sql = "Select * from tblMatHang"; LoadDuLieu(sql); //dong ket noi con.Close(); //Ẩn hiện các nút phù hợp chức năng HienChiTiet(false); btnSua.Enabled = false; btnXoa.Enabled = false; }Kích vào nút Huỷ để huỷ bỏ công việc đang làm //Click vào nút Hủy private void btnHuy_Click(object sender, EventArgs e) { //Thiết lập lại các nút như ban đầu btnXoa.Enabled = false; btnSua.Enabled = false; btnThem.Enabled = true; //xoa trang XoaTrangChiTiet(); //Cam nhap HienChiTiet(false); }Kích vào nút Thoát private void btnThoat_Click(object sender, EventArgs e) { //Đóng form this.Close(); }