Chương 5 Xây dựng các màn hình quản lý
5.1 Màn hình Tiếp nhận nhân viên
Xây dựng màn hình tiếp nhận nhân viên theo hình sau:
STT Tên Control Loại Tiêu đề (Caption)
Chương 5 - Xây dựng các màn hình quản lý
86
7 lblHoTen Label “Họ tên”
8 txtHoTen Textbox
9 lblBangCap Label “Bằng cấp”
10 cbBangCap ComboBox
11 lblBoPhan Label “Bộ phân”
12 cbBoPhan ComboBox
13 lblChucVu Label “Chức vụ”
14 cbChucVu ComboBox
15 lblNgaySinh Label “Ngày sinh”
16 dtNgaySinh DateTimePicker
17 lblDienThoai Label “Điện thoại”
18 txtDienThoai Textbox
19 lblDiaChi Label “Địa chỉ”
20 txtDiaChi Textbox
Màn hình tiếp nhận nhân viên được cài đặt thành 2 lớp: lớp NhanVien_Form là lớp giao diện và lớp NhanVien là lớp xử lý chính.
5.1.1 Lớp NhanVien_Form
Bên cạnh các controls mô tả ở trên, lớp NhanVien_Form còn các biến thành phần và phương thức như sau:
Lớp NhanVien_Form Thuộc tính
Tên Lớp Ý nghĩa
nv NhanVien Biến đảm nhận việc xử lý
dữ liệu Các hàm xử lý biến cố
Tên Điều kiện phát sinh Ý nghĩa
NhanVien_Form_Load Form Load Khi form load, hiển thị danh sách các nhân viên hiện tại lên listview NVList_SelectedIndexChanged Khi một item khác của
listview được chọn
Khi một nhân viên trong listivew được chọn, thông tin chi tiết của nhân viên này sẽ được hiện thị trong phậ “Thông tin chi tiết”
ToolBar1_ButtonClick Các nút của toolbar được click
Thực hiện tác vụ tương ứng với các nút “Thêm”, “Xóa”,
“Sửa” và “Soạn lại”
Phương thức
Tên Ý nghĩa
HienThiDanhSachBangCap Nạp danh sách bằng cấp lên combobox cbBangCap HienThiDanhSachBoPhan Nạp danh sách các bộ phận lên combobox cbBoPhan
HienThiDanhSachChucVu Nạp danh sách chức vụ lên combobox cbChucVu HienThiDanhSachNhanVien Hiển thị danh sách nhận viên lên listview
HienThiThongTinChiTiet Hiển thị thông tin chi tiết của 1 nhận viên KiemTraNhap Kiểm tra dữ liệu nhập hợp lệ không SoanLai Xóa tất cả các ô nhập liệu.
Trước hết, khi màn hình hiển thị, ta cần phải hiển thị cho người dùng danh sách các nhân viên hiện có. Do đó, ta sẽ viết biến cố xử lý cho sự kiện form load. Trong hàm xử lý sự kiện này, ta sẽ phải hiển thị 4 thông tin: danh sách các bằng cấp, danh sách các bô phận, danh sách các chức vụ, và danh sách các nhận viên hiện tại.
Private Sub NhanVien_Form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Nap du lieu
HienThiDanhSachBangCap() HienThiDanhSachBoPhan() HienThiDanhSachChucVu() HienThiDanhSachNhanVien() End Sub
Việc hiển thị do được thực hiện nhiều lần nên ta cài đặt chúng thành các hàm. Cụ thể các hàm như sau:
Private Sub HienThiDanhSachBangCap()
Dim dt As DataTable = nv.LayDanhSachBangCap
‘Việc lấy dữ liệu được ủy nhiệm cho biến thuộc lớp xử lý (lớp NhanVien) chứ không trực tiếp thực hiện ở đây
Dim i As Integer Dim str As String
‘Nạp dữ liệu lên combobox
For i = 0 To dt.Rows.Count - 1
str = CType(dt.Rows(i)("TenBangCap"), String) cbBangCap.Items.Add(str)
Next
If cbBangCap.Items.Count > 0 Then cbBangCap.SelectedIndex = 0 End If
End Sub
Lưu ý là việc đọc dữ liệu được ủy nhiệm cho lớp xử lý là lớp NhanVien chứ không thực hiện trực tiếp ở đây, vì đây là lớp giao diện, không đảm nhiệm các tác vụ xử lý. Tương tự cho các phương thức còn lại:
Private Sub HienThiDanhSachBoPhan()
Dim dt As DataTable = nv.LayDanhSachBoPhan Dim i As Integer
Dim str As String
Chương 5 - Xây dựng các màn hình quản lý
88
End Sub
Private Sub HienThiDanhSachChucVu()
Dim dt As DataTable = nv.LayDanhSachChucVu Dim i As Integer
Dim str As String
For i = 0 To dt.Rows.Count - 1
str = CType(dt.Rows(i)("TenChucVu"), String) cbChucVu.Items.Add(str)
Next
If cbChucVu.Items.Count > 0 Then cbChucVu.SelectedIndex = 0
End If End Sub
Private Sub HienThiDanhSachNhanVien() NVList.Items.Clear()
Dim dt As DataTable = nv.LayDanhSachNhanVien Dim i As Integer
Dim str As String Dim ma As Integer
'Hiển thị danh sách nhân viên For i = 0 To dt.Rows.Count - 1 Dim lvi As ListViewItem
lvi = NVList.Items.Add((i + 1).ToString()) 'Số thứ tự của nhân viên
str = CType(dt.Rows(i)("HoTenNhanVien"), String) lvi.SubItems.Add(str)
ma = CType(dt.Rows(i)("MaBangCap"), String)
lvi.SubItems.Add(cbBangCap.GetItemText(cbBangCap.Items(ma - 1))) ma = CType(dt.Rows(i)("MaBoPhan"), String)
lvi.SubItems.Add(cbBoPhan.GetItemText(cbBoPhan.Items(ma - 1))) ma = CType(dt.Rows(i)("MaChucVu"), String)
lvi.SubItems.Add(cbChucVu.GetItemText(cbChucVu.Items(ma - 1))) If (i + 1) Mod 2 = 0 Then
NVList.Items(i).BackColor = MainForm.ListRowColor End If
Next
'Hiển thị tổng số nhân viên
lbNVNum.Text = dt.Rows.Count.ToString End Sub
Sau khi viết xong mã nguồn cho phần form load, chúng ta bắt đầu quan tâm đến các biến cố.
Khi người dùng click chọn một nhân viên trong listview, chúng ta sẽ hiển thị thông tin chi tiết của nhân viên đó. Để làm được điều này, chúng ta viết hàm xử lý cho sự kiện
SelectedIndexChanged của listview.
Private Sub NVList_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles NVList.SelectedIndexChanged
If NVList.SelectedIndices.Count > 0 Then
HienThiThongTinChiTiet(NVList.SelectedIndices.Item(0)) End If
End Sub
Trong đó, hàm HienThiThongTinChiTiet sẽ làm công việc là lấy thông tin của nhân viên được chọn đưa lên các textbox và combobox tương ứng. Cài đặt như sau:
Private Sub HienThiThongTinChiTiet(ByVal index As Integer) Dim dt As DataTable
dt = nv.NhanVienInfo
txtHoTen.Text = dt.Rows(index)("HoTenNhanVien") dtNgaySinh.Value = dt.Rows(index)("NgaySinh") txtDiaChi.Text = dt.Rows(index)("Diachi")
txtDienThoai.Text = dt.Rows(index)("DienThoai") Dim str As String
cbBangCap.SelectedIndex =
cbBangCap.FindString(NVList.Items(index).SubItems(2).Text) cbBoPhan.SelectedIndex =
cbBoPhan.FindString(NVList.Items(index).SubItems(3).Text) cbChucVu.SelectedIndex =
cbChucVu.FindString(NVList.Items(index).SubItems(4).Text) End Sub
Tiếp theo, ta sẽ viết mã nguồn xử lý cho các tác vụ thêm, xóa, sửa nhân viên. Để làm việc này, ta viết hàm xử lý sự kiện click của các nút trên Toolbar. Trước hết ta viết hàm xử lý cho tác vụ thêm nhân viên.
Private Sub ToolBar1_ButtonClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) Handles
ToolBar1.ButtonClick
Select Case ToolBar1.Buttons.IndexOf(e.Button) Case 0 'Them
If KiemTraNhap() = True Then
nv.ThemNhanVien(txtHoTen.Text,
dtNgaySinh.Value.ToString, txtDiaChi.Text, txtDienThoai.Text, _
cbBangCap.SelectedIndex, cbBoPhan.SelectedIndex, cbChucVu.SelectedIndex)
'Hiển thị lại danh sách nhân viên HienThiDanhSachNhanVien()
MessageBox.Show("Nhân viên '" + txtHoTen.Text + "' đã được thêm thành công", "Thông báo",
MessageBoxButtons.OK, MessageBoxIcon.Information) SoanLai()
End If ....
Khi thêm một nhân viên, cần phải kiểm tra thông tin nhập vào có hợp lệ không, việc này được thực hiện thông qua hàm KiemTraNhap. Nếu không tin nhập là không hợp lệ thì sẽ hiện thông báo cho người dùng. Sau khi đảm bào thông tin nhập là hợp lệ, chúng ta tiến hành thêm nhân viên này vào cơ sở dữ liệu nhờ biến thành phần nv thuộc lớp NhanVien. Tiếp đó, do danh sách nhân viên đã thay đổi, ta tiến hành nạp lại dữ liệu để cập nhật lại danh sách nhân viên hiển thị
Chương 5 - Xây dựng các màn hình quản lý
90
End If Return True End Function
Sau khi viết xong hàm cho sự kiện thêm, chúng ta tiếp tục viết hàm xử lý cho sự kiện xóa.
...
Case 1 'Xoa
If NVList.SelectedIndices.Count > 0 Then
If MessageBox.Show("Bạn có chắc chắn là muốn xóa nhân viên '" + txtHoTen.Text + "' không ?", "Hỏi lại", MessageBoxButtons.YesNo,
MessageBoxIcon.Question) = DialogResult.Yes Then nv.XoaNhanVien(NVList.SelectedIndices.Item(0))
HienThiDanhSachNhanVien() 'Thông báo xóa thành công
MessageBox.Show("Nhân viên '" + txtHoTen.Text + "' đã được xóa.", "Thông báo",
MessageBoxButtons.OK,
MessageBoxIcon.Information) SoanLai()
End If Else
MessageBox.Show("Bạn phải chọn 1 nhân viên trong danh sách trước", "Thông báo", MessageBoxButtons.OK,
MessageBoxIcon.Exclamation) End If
...
Đối với sư kiện xóa, chúng ta phải hỏi lại người dùng cho chắc chắn. Chỉ khi họ xác nhận lại là họ thực sự muốn xóa, chúng ta mới tiến hành xóa. Tương tự như thêm, việc xóa được thực hiện thông qua biến thành phần nv thuộc lớp NhanVien, và sau khi xóa cũng hiển thị lại danh sách nhân viên. Để tiện cho người sử dụng trong việc nhập liệu, sau khi xóa một nhân viên, ứng dụng sẽ tự xóa trắng các ô nhập liệu cho người dùng, việc này được thực hiện nhò hàm SoanLai.
Private Sub SoanLai() txtHoTen.Text = ""
dtNgaySinh.Value = Today() txtDiaChi.Text = ""
txtDienThoai.Text = ""
End Sub
Tiếp đến, chúng ta viết hàm xử lý cho tác vụ cập nhật nhân viên.
...
Case 2 'Cập nhật
If NVList.SelectedIndices.Count > 0 Then If KiemTraNhap() = True Then
nv.CapNhatNhanVien(NVList.SelectedIndices.Item(0), txtHoTen.Text, dtNgaySinh.Value.ToString,
txtDiaChi.Text, txtDienThoai.Text, _
cbBangCap.SelectedIndex, cbBoPhan.SelectedIndex, cbChucVu.SelectedIndex)
'Hiển thị lại danh sách nhân viên HienThiDanhSachNhanVien()
'Thông báo cập nhật thành công
MessageBox.Show("Nhân viên '" + txtHoTen.Text + "' đã được cập nhật thành công", "Thông báo",
MessageBoxButtons.OK, MessageBoxIcon.Information) End If
Else
MessageBox.Show("Bạn phải chọn 1 nhân viên trong danh sách trước", "Thông báo", MessageBoxButtons.OK,
MessageBoxIcon.Exclamation) End If
...
Tương tự như thêm nhân viên, khi tiến hành cập nhật, ta phải kiểm tra xem dữ liệu mới có hợp lệ không bằng hàm KiemTraNhap. Nếu dữ liệu không hợp lệ thì thông báo cho người dùng, còn nếu hợp lệ thì tiến hành cập nhật nhờ biến thành phần nv, sau đó hiển thị lại danh sách nhân viên. Sau cùng là thông báo cho người dùng biết là việc cập nhật đã được tiến hành thành công.
Đến đây chúng ta đã cài đặt xong lớp NhanVien_Form. Vì đây là lớp giao diện nên nó chỉ phục phụ cho việc tương tác với người dụng, mọi tác vụ xử lý thông tin đều được ủy nhiệm cho biến thuộc lớp NhanVien.
5.1.2 Lớp NhanVien
Lớp NhanVien là lớp đảm nhận việc xử lý cho màn hình tiếp nhận nhân viên.
Lớp NhanVien Thuộc tính
Tên Lớp Ý nghĩa
db Database Lớp giao tiếp với CSDL
nv_dt DataTable Bảng Nhân viên
bc_dt DataTable Bảng Bằng cấp
bp_dt DataTable Bảng Bộ phận
cv_dt DataTable Bảng Chức vụ
Phương thức
Tên Ý nghĩa
New Hàm tạo
LayDanhSachBangCap Lấy danh sách bằng cấp từ CSDL LayDanhSachBoPhan Lấy danh sách bô phận từ CSDL LayDanhSachChucVu Lấy danh sách chức vụ từ CSDL LayDanhSachNhanVien Lấy danh sách nhân viên từ CSDL ThemNhanVien Thêm 1 nhân viên vào CSDL XoaNhanVien Xóa 1 nhân viên ra khỏi CSDL CapNhatNhanVien Cập nhật 1 nhân viên
Chương 5 - Xây dựng các màn hình quản lý
92 toán (chứ không phải select all)
• Thực thi câu lẹnh truy vấn
• Trả về kết quả là một DataTable
2. Nhóm phương thức nghiệp vụ: có cấu trúc như sau:
• Phát sinh mã (nếu cần)
• Phát sinh câu lệnh truy vấn
• Thực thi lệnh truy vấn này
• Trả về kết quả thực thi true/false
5.1.3 New
Public Sub New()
db = New Database(MainForm.SvrName, MainForm.DbName, True, "", "") End Sub
5.1.4 LayDanhSachBangCap
Public Function LayDanhSachBangCap() As DataTable
bc_dt = db.Execute("Select MaBangCap,TenBangCap from BANGCAP") Return bc_dt
End Function
5.1.5 LayDanhSachBoPhan
Public Function LayDanhSachBoPhan() As DataTable
bp_dt = db.Execute("Select MaBoPhan,TenBoPhan from BOPHAN") Return bp_dt
End Function
5.1.6 LayDanhSachChucVu
Public Function LayDanhSachChucVu() As DataTable
cv_dt = db.Execute("Select MaChucVu,TenChucVu from CHUCVU") Return cv_dt
End Function
5.1.7 LayDanhSachNhanVien
Public Function LayDanhSachNhanVien() As DataTable nv_dt = db.Execute("Select * from NHANVIEN") Return nv_dt
End Function
5.1.8 ThemNhanVien Tham số:
Tên Kiểu / Lớp Ý nghĩa
ten String Tên nhân viên
ngaysinh DateTime Ngày sinh nhân viên
diachi String Địa chỉ
dienthoai String Điện thoại
index_bc Integer Số thứ tự của bằng cấp trong combox index_bp Integer Số thứ tự của bộ phận trong combox index_cv Integer Số thứ tự của chức vụ trong combox Kết quả trả về: True/False
Mã nguồn:
Public Function ThemNhanVien(ByVal ten As String, ByVal ngaysinh As String, ByVal diachi As String, ByVal dienthoai As String, ByVal index_bc As Integer, ByVal index_bp As Integer, ByVal index_cv As Integer) As Boolean
'Mã nhân viên mới = Mã nhân viên lớn nhật hiện tại + 1
Dim dt As DataTable
dt = db.Execute("select MaNhanVien from NHANVIEN where MaNhanVien >=
all (select MaNhanVien from NHANVIEN)")
'dt chỉ có 1 dòng chữa mã nhân viên lớn nhất
Dim MaNV As Integer MaNV = dt.Rows(0)(0) + 1 Dim str As String
‘Tạo câu lệnh truy vấn
str = "Insert into NHANVIEN values(" + MaNV.ToString() + ",N'" + ten +
"','" + _
ngaysinh + "',N'" + diachi + "','" + dienthoai + "'," + bc_dt.Rows(index_bc)("MaBangCap").ToString + "," + _
bp_dt.Rows(index_bp)("MaBoPhan").ToString + "," + cv_dt.Rows(index_cv)("MaChucVu").ToString + ")"
db.ExecuteNonQuery(str)
'Cập nhật lại nv_dt
LayDanhSachNhanVien() Return True
End Function
5.1.9 XoaNhanVien Tham số:
Tên Kiểu / Lớp Ý nghĩa
index Integer Số thứ tự của nhân viên cần xóat Kết quả trả về: True/False
Mã nguồn:
Public Function XoaNhanVien(ByVal index As Integer) As Boolean Dim str As String
‘Chuẩn bị câu lệnh truy vấn
str = "Delete from NHANVIEN where MaNhanVien = " + nv_dt.Rows(index)("MaNhanVien").ToString
Chương 5 - Xây dựng các màn hình quản lý
94 5.1.10 CapNhatNhanVien
Tham số:
Tên Kiểu / Lớp Ý nghĩa
index Integer Số thứ tự của nhân viên cần cập nhật
ten String Tên nhân viên
ngaysinh DateTime Ngày sinh nhân viên
diachi String Địa chỉ
dienthoai String Điện thoại
index_bc Integer Số thứ tự của bằng cấp trong combox index_bp Integer Số thứ tự của bộ phận trong combox index_cv Integer Số thứ tự của chức vụ trong combox Kết quả trả về: True/False
Mã nguồn:
Public Function CapNhatNhanVien(ByVal index As Integer, ByVal hoten As
String, ByVal ngaysinh As String, ByVal diachi As String, ByVal dienthoai As String, ByVal index_bc As Integer, ByVal index_bp As Integer, ByVal index_cv As Integer)
Dim str As String
‘Chuẩn bị câu lẹnh truy vấn
tr = "Update NHANVIEN set HoTenNhanVien = N'" + hoten + "', NgaySinh = '" + ngaysinh + _
"',diachi = N'" + diachi + "', dienthoai = '" + dienthoai + _
"', MaBangCap = " + bc_dt.Rows(index_bc)("MaBangCap").ToString + ", MaBoPhan = " + bp_dt.Rows(index_bp)("MaBoPhan").ToString + _
", MaChucVu = " + cv_dt.Rows(index_cv)("MaChucVu").ToString + " where MaNhanVien = " + nv_dt.Rows(index)("MaNhanVien").ToString
db.ExecuteNonQuery(str)
'Cập nhật lại data table nv_dt
LayDanhSachNhanVien() End Function