II.1. Các khai báo
Nguồn dữ liệu cho màn đơn chỉ là một bảng, phần khai báo cho màn hình này thường như sau:
Ví dụ:
Private <bang_du_lieu> As <XL_TEN_BANG> Private Them_moi As Boolean = False
Private WithEvents Danh_sach As BindingManagerBase
<bang_du_lieu> là biến tham chiếu đến đối tượng của lớp xử lý nghiệp vụ trên màn hình.
Them_moi là biến theo dõi trạng thái thêm mới của dịng đang làm việc trên màn hình.
Danh_sach là biến tham chiếu đến BindingManagerBase của <bang_du_lieu> đang hiển thị trên màn hình
II.2. Các thủ tục nhập xuất
Thực hiện nhập xuất trên màn hình đơn, chúng ta cĩ ba thủ tục sau:
Xuat_ho_so_<ten_bang>:
Private Sub Xuat_ho_so_<ten_bang> () If Danh_sach.Position >= 0 Then Them_moi = False
<Điều khiển 1>.<Thuộc tính liên kết dữ liệu> = _
Danh_sach.Current(<Cột 1>)
<Điều khiển 2>.<Thuộc tính liên kết dữ liệu> = _
Danh_sach.Current(<Cột 2>) . . . Else Xuat_ho_so_<ten_bang>_moi End If End Sub Xuat_ho_so_<ten_bang>_moi:
Private Sub Xuat_ho_so_<ten_bang>_moi() Them_moi = True
<Điều khiển 1>.<Thuộc tính liên kết dữ liệu> = _
<Giá trị mặc định của cột hoặc của kiểu> <Điều khiển 2>.<Thuộc tính liên kết dữ liệu> = _
<Giá trị mặc định của cột hoặc của kiểu> . . .
Nhap_ho_so_<ten_bang>:
Private Sub Nhap_ho_so_<ten_bang>()
Danh_sach.Current(<Cột 1>) = <Điều khiển 1>.<Thuộc tính liên kết dữ
liệu>
Danh_sach.Current(<Cột 2>) = <Điều khiển 2>.<Thuộc tính liên kết dữ
liệu> . . . End Sub
Nếu trên màn hình cĩ sử dụng các điều khiển liệt kê (ListControl) như ComboBox, ListBox, CheckListBox, lúc này cần phải cĩ thêm nguồn dữ liệu liệt kê cho điều khiển (<bang_liet_ke>) và cĩ thêm thủ tục:
Xuat_danh_sach_chon_<ten_bang>:
‘ <bang_liet_ke> là đối tượng cung cấp danh sách liệt kê cho điều khiển Private Sub Xuat_danh_sach_chon_<ten_bang>()
<Điều khiển liệt kê>.DisplayMember = _
<Tên cột muốn hiển thị trên bảng liệt kê> <Điều khiển liệt kê>.ValueMember = _
<Tên cột muốn liên kết trên bảng dữ liệu> <Điều khiển liệt kê>.DataSource = <bang_liet_ke>
End Sub
Nếu màn hình hiển thị dữ liệu dưới dạng dịng cột sử dụng DataGrid, thủ tục xuất lưới sẽ là:
Xuat_luoi_<ten_bang>:
Private Sub Xuat_luoi_<ten_bang>()
<Điều khiển lưới>.DataSource = <bang_du_lieu> End Sub
II.3. Các hàm kiểm tra
Trước khi thực hiện nhập dữ liệu vào DataTable, cần kiểm tra dữ liệu nhập của mỗi điều khiển cĩ hợp lệ (khơng vi phạm các ràng buộc tồn vẹn dữ liệu, miền giá trị, v.v...)
Các hàm hiểm tra trả về trị Boolean: True là hợp lệ, False là khơng hợp lệ
Nội dung các hàm kiểm tra như sau:
Kiem_tra_<ten cot > As Boolean: (số lượng tùy theo sốđiều khiển cần kiểm tra) Private Function Kiem_tra_<ten_cot> As Boolean
Dim Ketqua As Boolean = <điều kiện giá trị trên điều khiển muốn kiểm tra hợp lệ>
If Not Ketqua Then ' Thơng báo lỗi <Điều khiển>.Focus
' Phần này thay đổi tùy mỗi trường hợp [Else
Ketqua = <điều kiện kiểm tra khác trên cùng điều khiển nếu cĩ> If Not Ketqua Then
' Thơng báo lỗi <Điều khiển>.Focus End If] End If Return Ketqua End Function
Kiem_tra_ghi_<ten_bang > As Boolean: phối hợp các hàm kiểm tra trên để lấy kết quả tổng hợp
Private Function Kiem_tra_ghi_<ten_bang> As Boolean Dim Ketqua As Boolean = Kiem_tra_<ten_cot_1> AndAlso _
Kiem_tra_<ten_cot_2> ...
Return Ketqua End Function
Kiem_tra_huy_<ten_bang > As Boolean: kiểm tra hủy dữ liệu cĩ vi phạm ràng buộc tồn vẹn khơng (kiểm tra trên các bảng nhiều)
Private Function Kiem_tra_huy_<ten_bang> As Boolean Dim Ketqua As Boolean
Dim bang As _
New XL_<TEN_BANG_CON>(<điều kiện lọc theo khĩa bảng kiểm tra>) Ketqua = (bang.So_dong = 0)
' kiểm tra trên các bảng con khác nếu cần Return Ketqua
End Function
II.4. Các xử lý sự kiện
Trên màn hình đơn, chúng ta thường cĩ các xử lý sự kiện sau:
Form_Load: Khởi tạo bảng dữ liệu và thực hiện xuất danh sách chọn (nếu cĩ), xuất lưới, xuất hồ sơ
Private Sub MH_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load <bang_du_lieu> = New <XL_TEN_BANG>
Danh_sach = Me.BindingContext(<bang_du_lieu>) Xuat_luoi_<ten_bang>()
Xuat_ho_so_<ten_bang>() End Sub
Sự kiện nhấn của các nút lệnh di chuyển: thay đổi dịng hiện hành nếu hợp lệ
Private Sub Dau_Click(ByVal sender As Object, ByVal e As _
System.EventArgs) Handles Dau.Click
If Danh_sach.Position > 0 Then Danh_sach.Position = 0 End If
End Sub
Private Sub Truoc_Click(ByVal sender As Object, ByVal e As _
System.EventArgs) Handles Truoc.Click
If Danh_sach.Position > 0 Then Danh_sach.Position -= 1 End If
End Sub
Private Sub Sau_Click(ByVal sender As Object, ByVal e As _
System.EventArgs) Handles Sau.Click
If Danh_sach.Position < Danh_sach.Count - 1 Then Danh_sach.Position += 1
End If End Sub
Private Sub Cuoi_Click(ByVal sender As Object, ByVal e As _
System.EventArgs) Handles Cuoi.Click
If Danh_sach.Position < Danh_sach.Count - 1 Then Danh_sach.Position = Danh_sach.Count - 1 End If
End Sub
Sự kiện nhấn của nút thêm: Thực hiện xuất hồ sơ mới và đưa con trỏ nhập liệu về điều khiển bắt đầu
Private Sub Them_Click(ByVal sender As Object, ByVal e As _
System.EventArgs) Handles Them.Click
Xuat_ho_so_<ten bang>_moi() <Điều khiển bắt đầu>.Focus End Sub
Sự kiện nhấn của nút ghi: Thực hiện kiểm tra ghi. Nếu hợp lệ, thực hiện các bước: + Nếu Them_moi là True (đang thêm), thêm dịng mới trên Danh_sach
+ Nhập hồ sơ
+ Xuất hồ sơ
Private Sub Ghi_Click(ByVal sender As Object, ByVal e As _
System.EventArgs) Handles Ghi.Click
If Kiem_tra_ghi_<ten bang>() Then If Them_moi Then Danh_sach.AddNew() Nhap_ho_so_<ten bang>() Danh_sach.EndCurrentEdit() <bang_du_lieu>.Ghi() Xuat_ho_so_<ten bang>() End If End Sub
Sự kiện nhấn của nút khơng: Thực hiện xuất lại thơng tin trước đĩ.
Private Sub Khong_Click(ByVal sender As Object, ByVal e As _
System.EventArgs) Handles Khong.Click
Xuat_ho_so_<ten bang>() End Sub
Sự kiện nhấn của nút hủy: Nếu Them_moi là True, thực hiện xuất hồ sơ; ngược lại nếu kiểm tra hủy hợp lệ và đồng ý xĩa thực hiện:
+ Đánh dấu hủy dịng hiện hành trên Danh_sach + Thực hiện ghi dữ liệu của lớp xử lý
+ Xuất hồ sơ
Private Sub Huy_Click(ByVal sender As Object, ByVal e As _
System.EventArgs) Handles Huy.Click
If Them_moi Then
Xuat_ho_so_<ten bang>() Exit Sub
Else If Kiem_tra_huy_<ten bang>() Then
If MsgBox("Đồng ý hủy ?", MsgBoxStyle.Question + _
MsgBoxStyle.YesNo,"Xin cho biết") = MsgBoxResult.Yes Then Danh_sach.Current.Delete() <bang_du_lieu>.Ghi() End If Else ' Thơng báo lỗi End If End Sub
Sự kiện CurrentChanged của Danh_sach: Thực hiện xuất hồ sơ, nếu khơng phải đang thêm mới Private Sub Danh_sach_CurrentChanged(ByVal sender As Object, ByVal e As _ System.EventArgs) Handles Danh_sach.CurrentChanged
If Not Them_moi Then
Xuat_ho_so_<ten_bang>() End If
End Sub