text:
TT. Visual Basic.NET
Trang 1
Phần 1
LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
VISUAL BASIC.NET
1) Viết chương trình hiển thị câu thông báo “Hello World!!!” lên màn hình.
2) Viết chương trình nhận một chuỗi ký tự từ bàn phím. Kiểm tra chuỗi có đối xứng
hay không? (TD: DBGBD - Chuỗi đối xứng; DBGB - Chuỗi không đối xứng).
3) Bảng dưới đây là các khóa tin học chứng chỉ A, B của khoa Công Nghệ Thông Tin:
TT Khóa học Học Phí Thời gian
1 Chứng chỉ A - Tin Học Văn Phòng 400.000 2 tháng
2 Chứng chỉ B - Visual Basic 350.000 1.5 tháng
3 Chứng chỉ B - Access 450.000 2 tháng
* Ghi chú: Đối tượng là sinh viên được giảm 10%
.
Viết chương trình mô phỏng việc đóng học phí của học viên. Người sử dụng
chương trình đầu tiên sẽ chọn loại chứng chỉ mà họ muốn đăng ký học (nhập từ bàn
phím ký tự A hay B); nếu chọn B, người dùng sẽ phải cho biết họ sẽ đăng ký học lớp
Visual Basic (nhập vào VB) hay Access (nhập vào AC). Sau khi thông tin về khóa học
đã được ghi nhận, một thông tin quan trọng khác là đối tượng đăng ký có phải là sinh
viên hay không (nếu có nhập vào C ngược lại K).
Tính tiền mà học viên phải trả.
Thí dụ:
Bạn muốn đăng ký học chứng chỉ A hay B: B
Bạn học lớp Visual Basic (VB) hay Access (Ac): AC
Bạn có là sinh viên không? C
Số tiền bạn phải trả là: 405000 đồng
4) Tạo lớp Con người với 2 thuộc tính là họ tên và ngày sinh để lấy về hay gán tên
cùng ngày sinh của một người cụ thể. Thiết kế lớp nhân viên kế thừa từ lớp con người,
lớp này có thêm 2 thuộc tính là ngày bắt đầu làm việc và tiền lương mỗi tháng.
Viết thủ tục Main cho phép tạo một đối tượng thuộc lớp nhân viên. Nhập từ bàn
phím các giá trị: họ tên, ngày sinh, ngày bắt đầu làm việc, tiền lương. Hiển thị lại các
kết quả đã nhập.
5) Một cửa hàng sách cần quản lý thông tin về các loại sách sẽ bán của mình. Một số
thông tin cần quản lý là: tên sách, số lượng, giá bán. Hãy thiết kế lớp sách bán cho
phép có những thuộc tính (có chỉ thị truy cập là Public) là các thông tin trên. Ngoài các
thuộc tính lớp nên có phương thức tính tiền dựa vào số lượng sách và giá bán mỗi
quyển. TT. Visual Basic.NET
Trang 2
Thí dụ: Quyển Mật mã của Da Vinci bán cho 1 khách hàng là 20 quyển, giá
bán 1 quyển là 99000đ. Vậy số tiền phải trả là 1.980.000 đ.
Viết thủ tục Main cho phép tạo một đối tượng sách bán và nhập từ bàn phím tên
sách bán, số lượng và giá bán mỗi quyển. Tính tiền phải trả.
6) Hằng năm, đến mùa khai trường; cửa hàng sách bán giảm giá 10% cho đối tượng là
sinh viên học sinh.
Thiết kế lớp sách bán cho sinh viên, lớp này kế thừa từ lớp sách bán ở câu 2;
bên cạnh đó lớp này còn có 1 thành viên kiểu Boolean cho biết đó có phải là sinh viên
hay không? Dĩ nhiên, phương thức tính tiền của lớp dẫn xuất này phải được thiết kế
lại: nếu là sinh viên thì giá bán giảm 10%, ngược lại sách được bán với giá gốc; để ý
rằng phương thức tính tiền của lớp con (sách bán cho sinh viên) sẽ ghi đè phương thức
tính tiền của lớp cơ sở (sách bán).
Viết thủ tục Main cho phép tạo một đối tượng sách bán cho sinh viên và nhập
từ bàn phím tên sách bán, số lượng, giá bán, người mua có là sinh viên hay không?
Tính tiền phải trả.
7) Thiết kế lớp Điểm trong không gian 2 chiều gồm 2 thuộc tính là tọa độ X & tọa độ
Y (2 thuộc tính có chỉ thị truy cập là Public).
- 2 phương thức xây dựng: một không có tham số (gán X, Y là 0), một có tham
số (cặp (X1,Y1) có sẵn để gán cho X,Y).
- Phương thức hiển thị tọa độ của điểm lên màn hình.
- Sử dụng Overload phương thức để tạo 2 phương thức tính khoảng cách từ
điểm hiện thời đến 1 điểm khác, một không tham số (tính khoảng cách đến gốc tọa
độ), một có tham số là một điểm khác (tính khoảng cách đến điểm này).
Viết thủ tục Main cho phép khởi tạo 3 điểm A, B, C và nhập tọa độ 3 điểm từ
bàn phím. Hiển thị tọa độ 3 điểm lên màn hình. Tính độ dài AB, BC, AC. Nếu AB,
BC, AC tạo thành tam giác, hãy tính diện tích tam giác ABC.
Thiết kế lớp điểm trong không gian 3 chiều kế thừa lớp điểm trong không gian 2
chiều ở câu 4, bên cạnh đó lớp mới có thêm thuộc tính là tọa độ trên trục Oz.
- Viết phương thức xây dựng cho lớp điểm trong không gian 3 chiều. Phương
thức này có 3 tham số là tọa độ X, Y, Z trong đó cặp (X, Y) sẽ được dùng để gọi đến
phương thức xây dựng có tham số của lớp điểm trong không gian 2 chiều.
- Sử dụng ghi đè phương thức để viết lại phương thức hiển thị tọa độ của điểm
trong không gian 3 chiều lên màn hình.
- Viết thủ tục Main cho phép nhập từ bàn phím các giá trị (X1,Y1,Z1) và khởi
tạo điểm M trong không gian 3 chiều là các tọa độ này. Gọi phương thức hiển thị để
hiển thị các tọa độ vừa nhập. TT. Visual Basic.NET
Trang 3
Phần 2
ỨNG DỤNG WINDOWS FORMS
PHẦN 1: Làm quen với môi trường VBNET
o Khởi động VBNET - Chọn Start và xác định thư mục Microsoft Visual
Studio.NET.
Màn hình đầu tiên của Visual Studio.NET IDE có dạng:
o Click New Project. Dự án đầu tiên của chúng ta là Visual Basic Project thuộc
kiểu Windows Application như hình dưới:
Xác lập tên dự án: MyName.
Chỉ ra nơi lưu dự án này. Chẳng hạn hình bên dưới là ổ đĩa A: và thư mục tên là
MyName.
Chúng ta không cần tạo thư mục trước. VB.NET sẽ tạo thư mục khi ta Click
chọn nút OK trong cửa sổ tạo dự án mới. TT. Visual Basic.NET
Trang 4
Môi trường phát triển tích hợp (IDE)
o Sau khi tạo dự án mới ta nhận được cửa sổ như hình dưới:
Nếu IDE của ta không như hình trên, ta có thể xác lập lại các thông số mặc định
cho bằng cách chọn Tools/Options/chọn Reset Windows Layout như hình:
TT. Visual Basic.NET
Trang 5
Dự án đầu tiên, cũng với dự án ở bài trên
Thiết kế Form
Đặt các điều khiển Label và Button trên form như hình dưới. Ta có thể thực
hiện bằng cách chọn chúng trong Toolbox và kéo thả lên form hay bằng cách
double_click chúng trong Toolbox.
Thay đổi kích thước của điều khiển và form cho phù hợp
1: Name: frmMyName; Text: MyName Project; Start Position: Center Screen
2: Name: lblMyName; Border Style: Fixed Single
3: Name: btnClickMe; Text: Click Me
4: Name: btnExit; Text: Exit
Start up object (Đối tượng khởi động)
Khi một dự án có nhiều hơn một form, chúng ta cần phải xác lập Start up
object của dự án. Ngoài ra chúng ta cũng nên phải xác lập lại thông số này mỗi khi
chúng ta thay đổi thuộc tính Name của một đối tượng Form. Thử suy nghĩ xem tại sao
ta phải làm như vậy?
2
1
3 4TT. Visual Basic.NET
Trang 6
Xác lập đối tượng khởi động bằng cách nhấp chuột phải vào dự án MyName
trong cửa sổ Solution Explorer (như hình).
Lưu và thực thi dự án
Để lưu dự án, ta chọn File/Save All (lưu tất cả các tập tin hay Save- lưu từng
tập tin).
Có một số cách để thực thi dự án: Chọn mục Debug/Start trên menu hay đơn
giản là bấm phím F5.
Viết mã lệnh
Giả sử khi chương trình được thực thi, mỗi khi người dùng nhấp chọn vào nút
Click Me. Lúc đó tên của ta sẽ xuất hiện trên điều khiển nhãn lblMyName. Hay khi họ
nhấp chọn Exit, chương trình kết thúc.
Khi người dùng nhấp chọn vào nút nhấn, lúc đó ta nói có sự kiện (event) xảy ra,
sự kiện đó là sự kiện Click và đối tượng nhận biết sự kiện đó là nút nhấn tương ứng.
Nếu chúng ta muốn thực thi các thao tác được mô tả ở trên, chúng ta phải viết mã lệnh
tương ứng. Đoạn mã lệnh đó gọi là đáp ứng sự kiện (event handler).
Chú thích trong VBNET
Chú thích giúp cho mã lệnh được rõ ràng, dễ tham chiếu về sau hơn. Điều này
rất có ích trong trường hợp mã lệnh của chương trình khá lớn.
Trong VBNET, việc chú thích được đặt sau từ REM hay sau dấu ‘. Chẳng hạn
như:
REM Programmer: Lam Hoai Bao
' Date Programmed: 12/09/2005
REM Program name: MyName
Để có thể viết được các chú thích trên trong dự án, ta chuyển sang cửa sổ mã
lệnh như trong hình:
TT. Visual Basic.NET
Trang 7
Gán trị cho điều khiển bằng mã lệnh
Sử dụng: Object.Property = Value
Nếu ta muốn gán họ và tên của chúng ta cho điều khiển nhãn lblMyName (giá
trị đó được lưu trữ trong thuộc tính Text), ta sử dụng:
lblMyName.Text = "Lâm Hoài Bảo"
Thực thi phương thức của một điều khiển
Sử dụng: Object.Method(<Các tham số - nếu có>)
Chẳng hạn, để đóng form frmMyName ta sử dụng phương thức Close()
frmMyName.Close()
Đáp ứng sự kiện:
Để có thể đáp ứng sự kiện Click ở trên, trong cửa sổ thiết kế (View Designer),
ta double click lên nút nhấn cần thiết, cửa sổ mã lệnh hiển thị như hình:
Nhấp chọn Form hay Code
Chọn View Code
Chọn View Designer TT. Visual Basic.NET
Trang 8
VBNET tạo ra 1 chương trình con bắt đầu bằng Private Sub và kết thúc bởi End
Sub. Mỗi chương trình con có một tên. Đối với chương trình con dùng để đáp ứng sự
kiện của 1 điều khiển, chương trình con đáp ứng sự kiện sẽ có tên là: Tên điều khiển
+ Tên sự kiện.
Ví dụ: Đối với nút nhấn btnClickMe ở trên, ta có chương trình con
btnClickMe_Click.
Lưu ý: Chương trình con đáp ứng sự kiện có thể có tham số.
Yêu cầu:
9 Viết các chú thích được mô tả như trên.
9 Viết mã lệnh đáp ứng sự kiện Click của các nút nhấn.
9 Lưu dự án và thực thi chương trình.
9 Đóng dự án lại và thoát khỏi Visual Studio.NET.
PHẦN 2: Tính toán học phí sinh viên
Trong phần này chúng ta sẽ tính toán học phí của các sinh viên trong trường đại học và
ghi nhận lại kết quả tổng.
Đầu vào: Người dùng hệ thống nhập dữ liệu vào các ô nhập. Chương trình sẽ lưu các
giá trị dưới dạng các biến.
Xử lý: Dựa vào các biến, chương trình sẽ tính toán giá trị kết quả, lưu vào trong các
biến kết quả. TT. Visual Basic.NET
Trang 9
Đầu ra: Kết quả sẽ được hiển thị trong các điều khiển nhãn. Mỗi lần tính toán cần ghi
nhận lại tổng số tiền miễn giảm và tổng số sinh viên đã nhập vào hệ thống.
Chuẩn bị:
Tạo giao diện như trên, viết các khai báo sau trong phần khai báo của Form
‘ Hằng số lưu tỉ lệ miễn giảm (mặc định là 20%)
Const Tilegiam As Single = 0.2F
'Cac bien lưu số lượng sinh viên, tổng số tiền giảm
Dim SoSV As Integer = 0
Dim TongGiam As Decimal = 0.0
Xử lý sự kiện Form_Load()
Ban đầu khi Form được hiển thị button Tính toán được kích hoạt, ngược lại là
Button Xóa. Lý do là button Xóa nhằm xác lập người dùng hệ thống xóa trắng các ô
nhập và các o kết quả mỗi khi muốn nhậpvào người mới. Do đó, button Xóa chỉ được
kích hoạt sau khi ta đã tính toán giá trị của 1 người.
Me.btnTinh.Enabled = True
Me.btnXoa.Enabled = False
Xử lý sự kiện Click chuột vào Button Tính toán:
- Khai báo biến lưu số tín chỉ, số tiền 1 tín chỉ, tổng học phí, số tiền giảm (=
tổng học phí*20%), số tiền phải đóng.
- Đưa các giá trị của biến tổng học phí, số tiền giảm, số tiền phải đóng hiển thị
lên các điều khiển nhãn.
- Đếm tăng số lượng sinh viên, tổng số tiền miễn giảm của các học sinh; đặt các
kết quả này lên các điều khiển nhãn tương ứng.
Private Sub btnTinh_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles btnTinh.Click
‘ Khai báo các biến cục bộ
Dim SoTienGiam As Decimal
Dim SoTinChi As Integer, HocPhi_TC As Decimal
Dim HocPhi As Decimal, SoTien As Decimal
‘ Lưu các giá trị nhập vào biến
SoTinChi = CInt(txtSTC.Text)
HocPhi_TC = CDec(txtHPTC.Text)
‘ Tính toán số tiền
HocPhi = HocPhi_TC * SoTinChi
SoTienGiam = HocPhi * Tilegiam
SoTien = HocPhi – SoTienGiam
' Tinh tong cong
SoSV = SoSV + 1
TongGiam = TongGiam + SoTienGiam
' Dat gia tri vao cac o nhan
Me.lblGiam.Text = FormatCurrency(SoTienGiam, 2)
Me.lblTongHP.Text = FormatCurrency(HocPhi, 2)
Me.lblHPDong.Text = FormatCurrency(SoTien, 2)
Me.lblSoSV.Text = CStr(SoSV)
Me.lblTongGiam.Text = FormatCurrency(TongGiam, 2)
' Dat lai trang thai của Button
Me.btnXoa.Enabled = True
Me.btnTinh.Enabled = False
End Sub TT. Visual Basic.NET
Trang 10
Xử lý sự kiện Click của Button Xóa:
- Xóa trắng các ô nhập và các ô kết quả.
- Đặt lại trạng thái của Button Tính toán và Xóa.
- Ô nhập họ tên nhận được tiêu điểm (sẵn sàng được kích hoạt) .
Private Sub btnXoa_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles btnXoa.Click
Me.txtHPTC.Clear()
Me.txtHT.Clear()
Me.txtSTC.Clear()
Me.lblTongHP.Text = ""
Me.lblHPDong.Text = ""
Me.lblGiam.Text = ""
Me.txtHT.Focus()
Me.btnTinh.Enabled = True
Me.btnXoa.Enabled = False
End Sub
Bẫy lỗi:
Điều gì sẽ xảy ra nếu người dùng hệ thống nhập vào các ô nhập không phải là
các giá trị số?
Để giải quyết ta sử dụng cấu trúc bẫy lỗi Try … Catch bao quanh mã lệnh chỗ
chuyển đổi dữ liệu từ chuỗi sang số và ngược lại.
Chẳng hạn:
Try
SoTinChi = CInt(txtSTC.Text)
HocPhi_TC = CDec(txtHPTC.Text)
HocPhi = HocPhi_TC * SoTinChi
SoTienGiam = HocPhi * Tilegiam
SoTien = HocPhi - SoTienGiam
' Tinh tong cong
SoSV = SoSV + 1
TongGiam = TongGiam + SoTienGiam
' Dat gia tri vao cac o nhan
Me.lblGiam.Text = FormatCurrency(SoTienGiam, 2)
Me.lblTongHP.Text = FormatCurrency(HocPhi, 2)
Me.lblHPDong.Text = FormatCurrency(SoTien, 2)
Me.lblSoSV.Text = CStr(SoSV)
Me.lblTongGiam.Text = FormatCurrency(TongGiam, 2)
' Dat lai trang thai
Me.btnXoa.Enabled = True
Me.btnTinh.Enabled = False
Catch
MessageBox.Show("Học phí hoặc số tín chỉ không hợp lệ!", _
"Dữ liệu lỗi", MessageBoxButtons.OK, MessageBoxIcon.Warning)
End Try
Hãy thêm vào một điều khiển nhãn tính số tiền giảm trung bình của 1 sinh viên, khi
tính toán tính luôn giá trị này và hiển thị kết quả.
Cuối cùng, xử lý cho sự kiện Click vào Button Thoát để chấm dứt chương trình.
TT. Visual Basic.NET
Trang 11
PHẦN 3: LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG & WINDOWS
FORMS
Bài tập này tập trung vào việc thiết kế một lớp để lưu thông tin về các loại sách bán
của một cửa hiệu. Mỗi cuốn sách có 3 thuộc tính: Title (tựa), Quantity (số lượng), Giá
bán (Price).
Tạo một dự án mới kiểu WinForm
Thêm một lớp vào dự án nhờ chọn Project menu-Add Class.
THUỘC TÍNH (PROPERTY)
- Thiết kế lớp có các thuộc tính lưu thông tin: tựa sách, số lượng, giá.
Option Strict On
Public Class BookSale
Private mstrTitle As String
Private mintQuantity As Integer
Private mdecPrice As Decimal
'. . . Property declarations go here
End Class
PHƯƠNG THỨC PROPERTY
Để các thuộc tính trên có thể truy cập từ bên ngoài ta phải định nghĩa các
phương thức Property. Trường hợp tổng quát, các phương thức cho mỗi thuộc tính
đảm bảo cho thuộc tính đó cho phép đọc và ghi dữ liệu (luôn có Set và Get).
Do đó, ta sẽ thêm các phương thức Title, Quantity, Price cho cac thuộc tính tựa,
số lượng, đơn giá. Lưu ý rằng, giá trị của Quantity & Price phải hợp lệ (ta có thể bẫy
bằng cách sử dụng System.Exception). TT. Visual Basic.NET
Trang 12
#Region "Properties"
'. . . Property declarations go here
Property Title() As String
Get
Title = mstrTitle
End Get
Set(ByVal Value As String)
mstrTitle = Value
End Set
End Property
Property Quantity() As Integer
Get
Quantity = mintQuantity
End Get
Set(ByVal Value As Integer)
If Value > 0 Then 'must sell at least one book
mintQuantity = Value
Else
Throw New System.Exception
End If
End Set
End Property
Property Price() As Decimal
Get
Price = mdecPrice
End Get
Set(ByVal Value As Decimal)
If Value >= 0 Then '= sign Allows free book at zero price
mdecPrice = Value
Else
Throw New System.Exception
End If
End Set
End Property
#End Region
Đoạn mã lệnh ở trên, ta có sử dụng cặp #Region … End Region để bao lại
đoạn mã trong Property.
PHƯƠNG THỨC (Method)
Phương thức thể hiện các hoạt động của một lớp. Chẳng hạn khi những quyển
sách được bán, ta cần phải tính giá tiền của chúng với giá tiền = Số lượng * Đơn giá.
Phương thức tính số tiền bán 1 loại sách như sau:
#Region "Methods"
Public Function ExtendedPrice() As Decimal
'Calculate extended price as quantity multiplied by price
Return mintQuantity * mdecPrice
End Function
#End Region
KHỞI TẠO ĐỐI TƯỢNG CỦA LỚP
Có 2 cách khởi tạo đối tượng của một lớp:
- Khai báo đối tượng, sau đó khởi tạo đối tượng ở dòng kế tiếp. TT. Visual Basic.NET
Trang 13
TD: Private mBookSale As BookSale 'Khai báo đối tượng
mBookSale = New BookSale 'Khởi tạo đối tượng
- Khai báo và khởi tạo đối tượng trên cùng một dòng.
TD: Private mBookSale As New BookSale
THIẾT KẾ GIAO DIỆN
- Trên Form ta có một menu File với 2 mục: Calculate (Name: mnuCalculate)
để tính toán giá trị của giá tiền, Exit (Name: mnuExit) dùng để thoát khỏi ứng dụng.
- Khai báo một biến đối tượng BookSale (đặt trong phần Windows Form
Designer generated code).
Private mBookSale As BookSale
- Sự kiện mnuCalculate_Click được xử lý:
Private Sub mnuCalculate_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles mnuCalculate.Click
Try
mBookSale = New BookSale 'Instantiate object
'Store values from textboxes to the properties
'of the new object
mBookSale.Title = txtTitle.Text
mBookSale.Quantity = CType(txtQuantity.Text, Integer)
mBookSale.Price = CType(txtPrice.Text, Decimal)
'Calculate and format result
lblEPrice.Text = FormatCurrency(mBookSale.ExtendedPrice)
Catch ex As Exception
'Catch error if Quantity or Price not numeric
MessageBox.Show("Error in Quantity or Price" & _
ControlChars.NewLine & ex.Message, "Data Entry Error", _
MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
End Try
End Sub
- Việc kết thúc ứng dụng được xử lý bằng câu lệnh End.
SHARED VARIABLE
- Nếu chúng ta muốn tính tổng số sách bán ra và tổng giá tiền đã bán ta cần sử
dụng đến biến Shared.
- Một thành viên được gọi là Shared có nghĩa là thành viên đó được dùng
chung cho tất cả các đối tượng của lớp đó. Bên cạnh đó ta có thể truy cập đến chúng
không cần thông qua các đối tượng của lớp.
txtTitle
txtQuantity
txtPrice
lblEPrice TT. Visual Basic.NET
Trang 14
- Cú pháp khai báo biến Shared:
[Public | Private] Shared VariableName As Datatype
- Chẳng hạn, ta cần khai báo các biến Shared trong lớp BookSale để lưu tổng
số sách bán ra và tổng giá tiền đã bán:
'Hold the SalesTotal property
Private Shared mdecSalesTotal As Decimal
'Hold the SalesCount property
Private Shared mintSalesCount As Integer
- Đồng thời lúc đó ta cũng khai báo 2 thuộc tính cho 2 biến Shared ở trên với để
ý rằng chúng là chỉ đọc (ReadOnly):
Shared ReadOnly Property SalesTotal() As Decimal
Get
SalesTotal = mdecSalesTotal
End Get
End Property
Shared ReadOnly Property SalesCount() As Integer
Get
SalesCount = mintSalesCount
End Get
End Property
- Phương thức tính tổng giá bán được sửa lại như sau:
Public Function ExtendedPrice() As Decimal
Dim decExtendedPrice As Decimal
'Calculate extended price as quantity times price
decExtendedPrice = mintQuantity * mdecPrice
'Add the extended price to the total
'and add 1 to the count of sales made
mdecSalesTotal += decExtendedPrice
mintSalesCount += 1
Return decExtendedPrice
End Function
THIẾT KẾ LẠI FORM
- Thêm mục Summary (Name: mnuSum) vào menu File để tính tổng sách và
tổng số tiền thu được. Sự kiện mnuSum_Click được xử lý:
Private Sub mnuSum_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles mnuSum.Click
'Display sales summary information
Dim strMessage As String
strMessage = "Sales Total: " & _
FormatCurrency(mBookSale.SalesTotal) & _
ControlChars.NewLine & "Sales Count: " & _
mBookSale.SalesCount.ToString
MessageBox.Show(strMessage, "Summary Information", _
MessageBoxButtons.OK, MessageBoxIcon.Information)
End Sub
- Thêm một CheckBox vào Form. Giả sử, đôi lúc cửa hàng sách giảm giá cho
một số khách hàng nào đó, việc giảm giá thể hiện bằng một giá trị Boolean (True nếu
giảm giá, False và ngược lại).
- Giả sử ta cần giảm giá 20% cho một số khách hàng nào đó.
Public Class BookSale
Private mstrTitle As String
Private mintQuantity As Integer
Private mdecPrice As Decimal TT. Visual Basic.NET
Trang 15
'Variables to accumulate sales total and count
Private Shared mdecSalesTotal As Decimal
Private Shared mintSalesCount As Integer
'Variable for the check box and constant for the discount rate
Private mblnDiscount As Boolean
Private Const msngDISCOUNT_RATE As Single = 0.2
- Giá trị Discount = True nếu là giảm giá.
- Property DisCount: gồm 2 phương thức Set & Get
Property Discount() As Boolean
Get
Discount = mblnDiscount
End Get
Set(ByVal Value As Boolean)
mblnDiscount = Value
End Set
End Property
- Hàm tính số tiền giảm: DisCountAmount:
Public Function DiscountAmount() As Decimal
'Calculate discounted price
Dim decDiscountAmount As Decimal
If mblnDiscount Then
decDiscountAmount = CDec(mintQuantity) * mdecPrice * _
CType(msngDISCOUNT_RATE, Decimal)
Else 'No discount given
decDiscountAmount = 0D
End If
Return decDiscountAmount
End Function
- Hàm NetDue: tính số tiền thực sự phải trả, số tiền này = Tổng số tiền – Số tiền
giảm. Lưu ý là khi tính số tiền thực sự phải trả ta cần cập nhật lại các thuộc tính dùng
chung (Shared).
Public Function NetDue() As Decimal
'Calculate discounted price
Dim decNetDue As Decimal
decNetDue = ExtendedPrice() - DiscountAmount()
'Add the new due amount to the total
'and add 1 to the count of sales made
mdecSalesTotal += decNetDue
mintSalesCount += 1
Return decNetDue
End Function
- Hàm ExtendedPrice:
Public Function ExtendedPrice() As Decimal
Dim decExtendedPrice As Decimal
'Calculate extended price as quantity times price
decExtendedPrice = mintQuantity * mdecPrice
Return decExtendedPrice
End Function
- Sự kiện mnuCalculate_Click được xử lý lại:
Try
'Instantiate new booksale class instance
mBookSale = New BookSale
'Store from textboxes to new booksale class instance
mBookSale.Title = txtTitle.Text TT. Visual Basic.NET
Trang 16
mBookSale.Quantity = CType(txtQuantity.Text, Integer)
mBookSale.Price = CType(txtPrice.Text,Decimal)
mBookSale.Discount = chkDis.Checked
'Calculate and display result
lblEPrice.Text = FormatCurrency(mBookSale.ExtendedPrice)
lblDis.Text = FormatCurrency(mBookSale.DiscountAmount)
lblNetDue.Text = FormatCurrency(mBookSale.NetDue)
txtPrice.Text = FormatCurrency(txtPrice.Text)
Catch ex As Exception
'Catch error if Quantity or Price not numeric
MessageBox.Show("Error in Quantity or Price" & _
ControlChars.NewLine & ex.Message, "Data Entry Error", _
MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
End Try
- Thực thi ứng dụng, ta có thể nhận được kết quả:
PHƯƠNG THỨC XÂY DỰNG (CONSTRUCTOR) & HỦY (DESTRUCTOR)
CONSTRUCTOR
- Đây là phương thức được gọi khi đối tượng được khởi tạo, phương thức này
có tên là New và ta có thể Overload phương thức này.
- Mở lại mã lệnh của lớp BookeSale và thêm vào 2 phương thức xây dựng.
Sub New()
'Constructor for class
'Place initialization statements here
End Sub
Sub New(ByVal Title As String, ByVal Quantity As Integer, _
ByVal Price As Decimal, ByVal Discount As Boolean)
'Assign property values
Me.Title = Title
Me.Quantity = Quantity
Me.Price = Price
Me.Discount = Discount
End Sub
- Khởi tạo lại đối tượng mBookSale của lớp BookSale bằng cách sử dụng
phương thức xây dựng có tham số. Điều này được thực hiện bằng cách sửa lại thủ tục
mnuCalculate_Click:
Try TT. Visual Basic.NET
Trang 17
'Instantiate new booksale class instance
mBookSale = New BookSale(txtTitle.Text, CType(txtQuantity.Text, _
Integer), CType(txtPrice.Text, Decimal), chkDis.Checked)
'Calculate and display result
lblEPrice.Text = FormatCurrency(mBookSale.ExtendedPrice)
lblDis.Text = FormatCurrency(mBookSale.DiscountAmount)
lblNetDue.Text = FormatCurrency(mBookSale.NetDue)
txtPrice.Text = FormatCurrency(txtPrice.Text)
Catch ……
- Thực thi chương trình và kiểm tra kết quả.
INHERITANCE (THỪA KẾ)
- Thiết kế lớp StudentBookSale thừa kế từ lớp BookSale. Lớp này thừa kế tất cả
các thành viên của lớp BookSale, vì vậy các thành viên là Private của lớp BookSale
cần được đặt lại là Protected.
- Lớp StudentBookSale có thêm một thuộc tính mang ý nghĩa nếu sinh viên giỏi
thì được giảm giá thêm 15%.
Lớp StudentBookSale:
• Thêm một thuộc tính protected shared mdecDiscountTotal, thuộc tính này
dùng để lưu tổng số tiền giảm (đây là giá trị chỉ đọc Readonly).
• Thêm một hằng msngSTUDENT_DISCOUNT_RATE lưu tỉ lệ giảm là 15%.
• Thêm một thuộc tính Boolean để xác định đó có phải là sinh viên giỏi hay
không?
Public Class StudentBookSale
Inherits BookSale
Protected Shared mdecDiscountTotal As Decimal
Protected mblnStudentDiscount As Boolean
Private Const msngSTUDENT_DISCOUNT_RATE As Single = 0.15
#Region "Properties"
Shared ReadOnly Property DiscountTotal() As Decimal
Get
DiscountTotal = mdecDiscountTotal
End Get
End Property
Property StudentDiscount() As Boolean
Get
StudentDiscount = mblnStudentDiscount
End Get
Set(ByVal Value As Boolean)
mblnStudentDiscount = Value
End Set
End Property
#End Region
End Class
- Mở lại lớp BookSale để sửa đổi lại các thuộc tính là Protected & phương thức
là Overridable.
Protected mstrTitle As String
Protected mintQuantity As Integer
Protected mdecPrice As Decimal
'Hold the SalesTotal property
Protected Shared mdecSalesTotal As Decimal TT. Visual Basic.NET
Trang 18
'Hold the SalesCount property
Protected Shared mintSalesCount As Integer
Protected mblnDiscount As Boolean
Protected Const msngDISCOUNT_RATE As Single = 0.2
Và Public Overridable Function DiscountAmount() As Decimal
- Mở lớp StudentBookSale để thêm vào phương thức DiscountAmount:
Overrides Function DiscountAmount() As Decimal
'Calculate discounted price
Dim decDiscountAmount As Decimal
Dim sngTotalDiscountRate As Single
'Figure out the discount based on the check boxes.
If mblnDiscount Then
sngTotalDiscountRate += msngDISCOUNT_RATE
End If
If mblnStudentDiscount Then
sngTotalDiscountRate += msngSTUDENT_DISCOUNT_RATE
End If
'Compute amount of discount
decDiscountAmount = CType(mintQuantity, Decimal) * mdecPrice * _
CType(sngTotalDiscountRate, Decimal)
Accumulate the amount of discount to the total discount shared variable
mdecDiscountTotal += decDiscountAmount
'Return the amount of discount
Return decDiscountAmount
End Function
- Thêm phương thức xây dựng vào lớp StudentBookSale, phương thức này có 5
tham số trong đó có một tham số xác định đó có phải là sinh viên giỏi hay không?
Sub New()
'Constructor with empty argument list
MyBase.New() 'Call the base class constructor
End Sub
Sub New(ByVal Title As String, ByVal Quantity As Integer, _
ByVal Price As Decimal, ByVal Discount As Boolean, _
ByVal StudentDiscount As Boolean)
'Assign property values
MyBase.New() 'Calls the base class constructor
Me.Title = Title
Me.Quantity = Quantity
Me.Price = Price
Me.Discount = Discount
Me.StudentDiscount = StudentDiscount
End Sub
TT. Visual Basic.NET
Trang 19
XÂY DỰNG LẠI FORM
- Thiết kế Form như sau:
Private Sub mnuCalculate_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles mnuCalculate.Click
Try
'Calculate extended price for sale
'Instantiate correct object and set properties
If chkStu.Checked Then
'This is a student – note the number of arguments in
'the parameter list – there are five of them
mStudentBookSale = _
New StudentBookSale(txtTitle.Text, _
CType(txtQuantity.Text, Integer), _
CType(txtPrice.Text, Decimal), _
chkDis.Checked, chkStu.Checked)
'Calculate and display result
lblEPrice.Text = _
FormatCurrency(mStudentBookSale.ExtendedPrice)
lblDis.Text = _
FormatCurrency(mStudentBookSale.DiscountAmount)
lblNetDue.Text = _
FormatCurrency(mStudentBookSale.NetDue)
txtPrice.Text = FormatCurrency(txtPrice.Text)
Else
'This is not a student – only four arguments in
'the parameter list
mBookSale = New BookSale(txtTitle.Text, _
CType(txtQuantity.Text, Integer), _
CType(txtPrice.Text, Decimal), chkDis.Checked)
'Calculate and display result
lblEPrice.Text = _
FormatCurrency(mBookSale.ExtendedPrice)
lblDis.Text = _ TT. Visual Basic.NET
Trang 20
FormatCurrency(mBookSale.DiscountAmount)
lblNetDue.Text = FormatCurrency(mBookSale.NetDue)
txtPrice.Text = FormatCurrency(txtPrice.Text)
End If
Catch
MessageBox.Show("Error in Quantity or Price", _
"Data Entry Error", MessageBoxButtons.OK, _
MessageBoxIcon.Exclamation)
End Try
End Sub
- Sự kiện mnuSum_Click được xử lý lại để hiển thị giá trị tổng:
Private Sub mnuSum_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles mnuSum.Click
'Display sales summary information
Dim strMessage As String
strMessage = "Sales Total: " & _
FormatCurrency(mBookSale.SalesTotal) & _
ControlChars.NewLine & "Sales Count: " & _
mBookSale.SalesCount.ToString & _
ControlChars.NewLine & _
"Total Student Discounts: " & _
FormatCurrency(mStudentBookSale.DiscountTotal)
MessageBox.Show(strMessage, "Summary Information", _
MessageBoxButtons.OK, MessageBoxIcon.Information)
End Sub
LƯU DỰ ÁN VÀ THỰC THI ỨNG DỤNG TT. Visual Basic.NET
Trang 21
Phần 3
TRUY CẬP CƠ SỞ DỮ LIỆU VỚI
ADO.NET
Trong phần này chúng ta sẽ tìm hiểu cách thức làm việc với ADO.NET. Đây là một
tập hợp các lớp cũng như các giao diện cho phép truy cập dữ liệu trong .NET
Framework. Ở đây ta sẽ sử dụng ADO.NET để nối kết với cơ sở dữ liệu SQL Server,
lấy dữ liệu và hiển thị chúng trên form.
Các bước thực hiện:
1. Trong SQL Server tạo một cơ sở dữ liệu tên là DVDLibrary.
2. Thêm một bảng tên DVDLibrary với cấu trúc như sau (Bảng 4.1):
3. Thêm vài dòng dữ liệu vào bảng.
4. Tạo một ứng dụng WinForrm tên prjDVD.
5. Đổi tên của form chính thành frmDVDCatalog.
6. Thêm một số control vào và sửa đổi một số thuộc tính tương ứng (bảng 4.2) sao
cho ta được giao diện:
TT. Visual Basic.NET
Trang 22
Control Property Value
Form
Name
Text
frmDVDCatalog
DVD Catalog
Label
Name
Text
lblHeading
DVD Catalog
Label
Name
Text
lblDVDCodeNo
DVD Code Number
Label
Name
Text
lblTitle
DVD Title
Label
Name
Text
lblLang
Language
Label
Name
Text
lblPrice
Price
Label
Name
Text
lblDollars
Dollars
GroupBox
Name
Text
grpSubTitles
Subtitles
RadioButton
Name
Text
Checked
radYes
Yes
true
RadioButton
Name
Text
Checked
radNo
No
false
ComboBox
Name
Collection
cboLang
English
Spanish
French
Chinese
Russian
NumericUpDown
Name
Maximum
Minimum
Value
updPrice
150
5
5
TextBox
Name
ReadOnly
Text
txtCodeNo
true
TextBox
Name
Text
txtTitle
Button
Name
Text
btnAddNew
AddNew
Button
Name
Text
btnSave
Save
Button
Name
Text
btnExit
Exit
7. Chuyển sang cửa sổ Code View, tham chiếu đến một số không gian tên:
Imports System.Data
Imports System.Data.SqlClient;
8. Khai báo những biến sau trong phần khai báo của form: TT. Visual Basic.NET
Trang 23
Private conn As SqlConnection
Private commd As SqlCommand
Private sqlstr, lang As String
Private codeno, subtitles As Integer
Dim price As Decimal
9. Viết đoạn mã sau vào phương thức xử lý sự kiện Load của form:
Try
conn = New SqlConnection("Server=.;” & _
”Initial Catalog=DVDLibrary;User
Id=user;pwd=user;")
commd = new SqlCommand("Select * From
DVDLibrary",conn)
conn.Open()
btnSave.Enabled = False
Catch (ex As Exception)
MessageBox.Show(ex.Message + ex.StackTrace)
End Try
10. Khi button AddNew được click, một đối tượng SQLCommand được tạo ra
thực hiện câu truy vấn lấy về mã số lớn nhất của DVD Code No từ bảng from the
DVDLibrary. Nếu bảng rỗng, một ngoại lệ được tạo ra. Vì thws ta phải bẫy lại
ngoại lệ này nhằm kiểm tra khả năng bảng rỗng (lúc đói giá trị của biến codeno
được gán là 0). Sau đó giá trị của codeno tăng 1 để có giá trị hiện hành của
codeno. Kế tiếp các trường của form được xóa trắng nhờ vào việc gọi thực thi
phương thức ResetFields() để một mẩu tin mới được thêm vào và kích hoạt
button Save.
Sự kiện btnAddNew_Click:
//calculate new Code
commd = new SqlCommand("Select max(DVDCodeNo) From DVDLibrary", _
conn)
Try
codeno = CType(commd.ExecuteScalar(), Integer)
btnAddNew.Enabled = False
btnSave.Enabled=True
Catch(ex As Exception)
codeno=0
MessageBox.Show(ex.Message)
End Try
codeno = codeno + 1
txtCodeNo.Text = codeno.ToString()
ResetFields()
11. Sự kiện Click của button btnExit được xử lý để đóng lại nối kết dữ liệu và
kết thúc ứng dụng:
conn.Close()
End
12. Sự kiện btnSave_Click nhằm thêm một dòng dữ liệu mới vào bảng. Bởi vì
đây không phải là một câu truy vấn lấy về dữ liệu mà là một câu truy vấn hành
động nên ta sử dụng phương thức ExecuteNonQuery của lớp SQLCommand: TT. Visual Basic.NET
Trang 24
Try
sqlstr = "Insert Into DVDLibrary Values(" & _
codeno.ToString() & ",'" & txtTitle.Text & "', '" & _
lang + "'," & subtitles.ToString() & _
"," & price.ToString() & ")"
MessageBox.Show(sqlstr)
commd = New SqlCommand(sqlstr,conn)
commd.ExecuteNonQuery()
MessageBox.Show("Record has been add successfully")
ResetFields()
btnExit.Focus()
btnAddNew.Enabled = True
btnSave.Enabled=False
Catch(ex As Exception)
MessageBox.Show(ex.Message + ex.StackTrace)
End Try
13. Sự kiện ValueChanged của NumericUpDown được xử lý:
price = updPrice.Value
14. Sự kiện SelectedIndexChanged của ComboBox được xử lý:
lang = cboLang.SelectedItem.ToString()
15. Sự kiện CheckedChanged của RadioButton được xử lý:
radYes_CheckedChanged
subtitles = 1
radNo_CheckedChanged
subtitles = 0;
16. Đoạn mã cho phương thức ResetFields:
Private Sub ResetFields()
txtTitle.Text = ""
price = updPrice.Value=5
lang=cboLang.Items[0].ToString()
cboLang.Text = ""
radYes.Checked = True
radNo.Checked= False;
btnSave.Enabled=True
End Sub
17. Lưu, biên dịch và thực thi dự án. Một thí dụ mẫu cho việc thêm vào một
mẩu tin như trong hình 4.3:
TT. Visual Basic.NET
Trang 25
Trang 1
Phần 1
LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
VISUAL BASIC.NET
1) Viết chương trình hiển thị câu thông báo “Hello World!!!” lên màn hình.
2) Viết chương trình nhận một chuỗi ký tự từ bàn phím. Kiểm tra chuỗi có đối xứng
hay không? (TD: DBGBD - Chuỗi đối xứng; DBGB - Chuỗi không đối xứng).
3) Bảng dưới đây là các khóa tin học chứng chỉ A, B của khoa Công Nghệ Thông Tin:
TT Khóa học Học Phí Thời gian
1 Chứng chỉ A - Tin Học Văn Phòng 400.000 2 tháng
2 Chứng chỉ B - Visual Basic 350.000 1.5 tháng
3 Chứng chỉ B - Access 450.000 2 tháng
* Ghi chú: Đối tượng là sinh viên được giảm 10%
.
Viết chương trình mô phỏng việc đóng học phí của học viên. Người sử dụng
chương trình đầu tiên sẽ chọn loại chứng chỉ mà họ muốn đăng ký học (nhập từ bàn
phím ký tự A hay B); nếu chọn B, người dùng sẽ phải cho biết họ sẽ đăng ký học lớp
Visual Basic (nhập vào VB) hay Access (nhập vào AC). Sau khi thông tin về khóa học
đã được ghi nhận, một thông tin quan trọng khác là đối tượng đăng ký có phải là sinh
viên hay không (nếu có nhập vào C ngược lại K).
Tính tiền mà học viên phải trả.
Thí dụ:
Bạn muốn đăng ký học chứng chỉ A hay B: B
Bạn học lớp Visual Basic (VB) hay Access (Ac): AC
Bạn có là sinh viên không? C
Số tiền bạn phải trả là: 405000 đồng
4) Tạo lớp Con người với 2 thuộc tính là họ tên và ngày sinh để lấy về hay gán tên
cùng ngày sinh của một người cụ thể. Thiết kế lớp nhân viên kế thừa từ lớp con người,
lớp này có thêm 2 thuộc tính là ngày bắt đầu làm việc và tiền lương mỗi tháng.
Viết thủ tục Main cho phép tạo một đối tượng thuộc lớp nhân viên. Nhập từ bàn
phím các giá trị: họ tên, ngày sinh, ngày bắt đầu làm việc, tiền lương. Hiển thị lại các
kết quả đã nhập.
5) Một cửa hàng sách cần quản lý thông tin về các loại sách sẽ bán của mình. Một số
thông tin cần quản lý là: tên sách, số lượng, giá bán. Hãy thiết kế lớp sách bán cho
phép có những thuộc tính (có chỉ thị truy cập là Public) là các thông tin trên. Ngoài các
thuộc tính lớp nên có phương thức tính tiền dựa vào số lượng sách và giá bán mỗi
quyển. TT. Visual Basic.NET
Trang 2
Thí dụ: Quyển Mật mã của Da Vinci bán cho 1 khách hàng là 20 quyển, giá
bán 1 quyển là 99000đ. Vậy số tiền phải trả là 1.980.000 đ.
Viết thủ tục Main cho phép tạo một đối tượng sách bán và nhập từ bàn phím tên
sách bán, số lượng và giá bán mỗi quyển. Tính tiền phải trả.
6) Hằng năm, đến mùa khai trường; cửa hàng sách bán giảm giá 10% cho đối tượng là
sinh viên học sinh.
Thiết kế lớp sách bán cho sinh viên, lớp này kế thừa từ lớp sách bán ở câu 2;
bên cạnh đó lớp này còn có 1 thành viên kiểu Boolean cho biết đó có phải là sinh viên
hay không? Dĩ nhiên, phương thức tính tiền của lớp dẫn xuất này phải được thiết kế
lại: nếu là sinh viên thì giá bán giảm 10%, ngược lại sách được bán với giá gốc; để ý
rằng phương thức tính tiền của lớp con (sách bán cho sinh viên) sẽ ghi đè phương thức
tính tiền của lớp cơ sở (sách bán).
Viết thủ tục Main cho phép tạo một đối tượng sách bán cho sinh viên và nhập
từ bàn phím tên sách bán, số lượng, giá bán, người mua có là sinh viên hay không?
Tính tiền phải trả.
7) Thiết kế lớp Điểm trong không gian 2 chiều gồm 2 thuộc tính là tọa độ X & tọa độ
Y (2 thuộc tính có chỉ thị truy cập là Public).
- 2 phương thức xây dựng: một không có tham số (gán X, Y là 0), một có tham
số (cặp (X1,Y1) có sẵn để gán cho X,Y).
- Phương thức hiển thị tọa độ của điểm lên màn hình.
- Sử dụng Overload phương thức để tạo 2 phương thức tính khoảng cách từ
điểm hiện thời đến 1 điểm khác, một không tham số (tính khoảng cách đến gốc tọa
độ), một có tham số là một điểm khác (tính khoảng cách đến điểm này).
Viết thủ tục Main cho phép khởi tạo 3 điểm A, B, C và nhập tọa độ 3 điểm từ
bàn phím. Hiển thị tọa độ 3 điểm lên màn hình. Tính độ dài AB, BC, AC. Nếu AB,
BC, AC tạo thành tam giác, hãy tính diện tích tam giác ABC.
Thiết kế lớp điểm trong không gian 3 chiều kế thừa lớp điểm trong không gian 2
chiều ở câu 4, bên cạnh đó lớp mới có thêm thuộc tính là tọa độ trên trục Oz.
- Viết phương thức xây dựng cho lớp điểm trong không gian 3 chiều. Phương
thức này có 3 tham số là tọa độ X, Y, Z trong đó cặp (X, Y) sẽ được dùng để gọi đến
phương thức xây dựng có tham số của lớp điểm trong không gian 2 chiều.
- Sử dụng ghi đè phương thức để viết lại phương thức hiển thị tọa độ của điểm
trong không gian 3 chiều lên màn hình.
- Viết thủ tục Main cho phép nhập từ bàn phím các giá trị (X1,Y1,Z1) và khởi
tạo điểm M trong không gian 3 chiều là các tọa độ này. Gọi phương thức hiển thị để
hiển thị các tọa độ vừa nhập. TT. Visual Basic.NET
Trang 3
Phần 2
ỨNG DỤNG WINDOWS FORMS
PHẦN 1: Làm quen với môi trường VBNET
o Khởi động VBNET - Chọn Start và xác định thư mục Microsoft Visual
Studio.NET.
Màn hình đầu tiên của Visual Studio.NET IDE có dạng:
o Click New Project. Dự án đầu tiên của chúng ta là Visual Basic Project thuộc
kiểu Windows Application như hình dưới:
Xác lập tên dự án: MyName.
Chỉ ra nơi lưu dự án này. Chẳng hạn hình bên dưới là ổ đĩa A: và thư mục tên là
MyName.
Chúng ta không cần tạo thư mục trước. VB.NET sẽ tạo thư mục khi ta Click
chọn nút OK trong cửa sổ tạo dự án mới. TT. Visual Basic.NET
Trang 4
Môi trường phát triển tích hợp (IDE)
o Sau khi tạo dự án mới ta nhận được cửa sổ như hình dưới:
Nếu IDE của ta không như hình trên, ta có thể xác lập lại các thông số mặc định
cho bằng cách chọn Tools/Options/chọn Reset Windows Layout như hình:
TT. Visual Basic.NET
Trang 5
Dự án đầu tiên, cũng với dự án ở bài trên
Thiết kế Form
Đặt các điều khiển Label và Button trên form như hình dưới. Ta có thể thực
hiện bằng cách chọn chúng trong Toolbox và kéo thả lên form hay bằng cách
double_click chúng trong Toolbox.
Thay đổi kích thước của điều khiển và form cho phù hợp
1: Name: frmMyName; Text: MyName Project; Start Position: Center Screen
2: Name: lblMyName; Border Style: Fixed Single
3: Name: btnClickMe; Text: Click Me
4: Name: btnExit; Text: Exit
Start up object (Đối tượng khởi động)
Khi một dự án có nhiều hơn một form, chúng ta cần phải xác lập Start up
object của dự án. Ngoài ra chúng ta cũng nên phải xác lập lại thông số này mỗi khi
chúng ta thay đổi thuộc tính Name của một đối tượng Form. Thử suy nghĩ xem tại sao
ta phải làm như vậy?
2
1
3 4TT. Visual Basic.NET
Trang 6
Xác lập đối tượng khởi động bằng cách nhấp chuột phải vào dự án MyName
trong cửa sổ Solution Explorer (như hình).
Lưu và thực thi dự án
Để lưu dự án, ta chọn File/Save All (lưu tất cả các tập tin hay Save- lưu từng
tập tin).
Có một số cách để thực thi dự án: Chọn mục Debug/Start trên menu hay đơn
giản là bấm phím F5.
Viết mã lệnh
Giả sử khi chương trình được thực thi, mỗi khi người dùng nhấp chọn vào nút
Click Me. Lúc đó tên của ta sẽ xuất hiện trên điều khiển nhãn lblMyName. Hay khi họ
nhấp chọn Exit, chương trình kết thúc.
Khi người dùng nhấp chọn vào nút nhấn, lúc đó ta nói có sự kiện (event) xảy ra,
sự kiện đó là sự kiện Click và đối tượng nhận biết sự kiện đó là nút nhấn tương ứng.
Nếu chúng ta muốn thực thi các thao tác được mô tả ở trên, chúng ta phải viết mã lệnh
tương ứng. Đoạn mã lệnh đó gọi là đáp ứng sự kiện (event handler).
Chú thích trong VBNET
Chú thích giúp cho mã lệnh được rõ ràng, dễ tham chiếu về sau hơn. Điều này
rất có ích trong trường hợp mã lệnh của chương trình khá lớn.
Trong VBNET, việc chú thích được đặt sau từ REM hay sau dấu ‘. Chẳng hạn
như:
REM Programmer: Lam Hoai Bao
' Date Programmed: 12/09/2005
REM Program name: MyName
Để có thể viết được các chú thích trên trong dự án, ta chuyển sang cửa sổ mã
lệnh như trong hình:
TT. Visual Basic.NET
Trang 7
Gán trị cho điều khiển bằng mã lệnh
Sử dụng: Object.Property = Value
Nếu ta muốn gán họ và tên của chúng ta cho điều khiển nhãn lblMyName (giá
trị đó được lưu trữ trong thuộc tính Text), ta sử dụng:
lblMyName.Text = "Lâm Hoài Bảo"
Thực thi phương thức của một điều khiển
Sử dụng: Object.Method(<Các tham số - nếu có>)
Chẳng hạn, để đóng form frmMyName ta sử dụng phương thức Close()
frmMyName.Close()
Đáp ứng sự kiện:
Để có thể đáp ứng sự kiện Click ở trên, trong cửa sổ thiết kế (View Designer),
ta double click lên nút nhấn cần thiết, cửa sổ mã lệnh hiển thị như hình:
Nhấp chọn Form hay Code
Chọn View Code
Chọn View Designer TT. Visual Basic.NET
Trang 8
VBNET tạo ra 1 chương trình con bắt đầu bằng Private Sub và kết thúc bởi End
Sub. Mỗi chương trình con có một tên. Đối với chương trình con dùng để đáp ứng sự
kiện của 1 điều khiển, chương trình con đáp ứng sự kiện sẽ có tên là: Tên điều khiển
+ Tên sự kiện.
Ví dụ: Đối với nút nhấn btnClickMe ở trên, ta có chương trình con
btnClickMe_Click.
Lưu ý: Chương trình con đáp ứng sự kiện có thể có tham số.
Yêu cầu:
9 Viết các chú thích được mô tả như trên.
9 Viết mã lệnh đáp ứng sự kiện Click của các nút nhấn.
9 Lưu dự án và thực thi chương trình.
9 Đóng dự án lại và thoát khỏi Visual Studio.NET.
PHẦN 2: Tính toán học phí sinh viên
Trong phần này chúng ta sẽ tính toán học phí của các sinh viên trong trường đại học và
ghi nhận lại kết quả tổng.
Đầu vào: Người dùng hệ thống nhập dữ liệu vào các ô nhập. Chương trình sẽ lưu các
giá trị dưới dạng các biến.
Xử lý: Dựa vào các biến, chương trình sẽ tính toán giá trị kết quả, lưu vào trong các
biến kết quả. TT. Visual Basic.NET
Trang 9
Đầu ra: Kết quả sẽ được hiển thị trong các điều khiển nhãn. Mỗi lần tính toán cần ghi
nhận lại tổng số tiền miễn giảm và tổng số sinh viên đã nhập vào hệ thống.
Chuẩn bị:
Tạo giao diện như trên, viết các khai báo sau trong phần khai báo của Form
‘ Hằng số lưu tỉ lệ miễn giảm (mặc định là 20%)
Const Tilegiam As Single = 0.2F
'Cac bien lưu số lượng sinh viên, tổng số tiền giảm
Dim SoSV As Integer = 0
Dim TongGiam As Decimal = 0.0
Xử lý sự kiện Form_Load()
Ban đầu khi Form được hiển thị button Tính toán được kích hoạt, ngược lại là
Button Xóa. Lý do là button Xóa nhằm xác lập người dùng hệ thống xóa trắng các ô
nhập và các o kết quả mỗi khi muốn nhậpvào người mới. Do đó, button Xóa chỉ được
kích hoạt sau khi ta đã tính toán giá trị của 1 người.
Me.btnTinh.Enabled = True
Me.btnXoa.Enabled = False
Xử lý sự kiện Click chuột vào Button Tính toán:
- Khai báo biến lưu số tín chỉ, số tiền 1 tín chỉ, tổng học phí, số tiền giảm (=
tổng học phí*20%), số tiền phải đóng.
- Đưa các giá trị của biến tổng học phí, số tiền giảm, số tiền phải đóng hiển thị
lên các điều khiển nhãn.
- Đếm tăng số lượng sinh viên, tổng số tiền miễn giảm của các học sinh; đặt các
kết quả này lên các điều khiển nhãn tương ứng.
Private Sub btnTinh_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles btnTinh.Click
‘ Khai báo các biến cục bộ
Dim SoTienGiam As Decimal
Dim SoTinChi As Integer, HocPhi_TC As Decimal
Dim HocPhi As Decimal, SoTien As Decimal
‘ Lưu các giá trị nhập vào biến
SoTinChi = CInt(txtSTC.Text)
HocPhi_TC = CDec(txtHPTC.Text)
‘ Tính toán số tiền
HocPhi = HocPhi_TC * SoTinChi
SoTienGiam = HocPhi * Tilegiam
SoTien = HocPhi – SoTienGiam
' Tinh tong cong
SoSV = SoSV + 1
TongGiam = TongGiam + SoTienGiam
' Dat gia tri vao cac o nhan
Me.lblGiam.Text = FormatCurrency(SoTienGiam, 2)
Me.lblTongHP.Text = FormatCurrency(HocPhi, 2)
Me.lblHPDong.Text = FormatCurrency(SoTien, 2)
Me.lblSoSV.Text = CStr(SoSV)
Me.lblTongGiam.Text = FormatCurrency(TongGiam, 2)
' Dat lai trang thai của Button
Me.btnXoa.Enabled = True
Me.btnTinh.Enabled = False
End Sub TT. Visual Basic.NET
Trang 10
Xử lý sự kiện Click của Button Xóa:
- Xóa trắng các ô nhập và các ô kết quả.
- Đặt lại trạng thái của Button Tính toán và Xóa.
- Ô nhập họ tên nhận được tiêu điểm (sẵn sàng được kích hoạt) .
Private Sub btnXoa_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles btnXoa.Click
Me.txtHPTC.Clear()
Me.txtHT.Clear()
Me.txtSTC.Clear()
Me.lblTongHP.Text = ""
Me.lblHPDong.Text = ""
Me.lblGiam.Text = ""
Me.txtHT.Focus()
Me.btnTinh.Enabled = True
Me.btnXoa.Enabled = False
End Sub
Bẫy lỗi:
Điều gì sẽ xảy ra nếu người dùng hệ thống nhập vào các ô nhập không phải là
các giá trị số?
Để giải quyết ta sử dụng cấu trúc bẫy lỗi Try … Catch bao quanh mã lệnh chỗ
chuyển đổi dữ liệu từ chuỗi sang số và ngược lại.
Chẳng hạn:
Try
SoTinChi = CInt(txtSTC.Text)
HocPhi_TC = CDec(txtHPTC.Text)
HocPhi = HocPhi_TC * SoTinChi
SoTienGiam = HocPhi * Tilegiam
SoTien = HocPhi - SoTienGiam
' Tinh tong cong
SoSV = SoSV + 1
TongGiam = TongGiam + SoTienGiam
' Dat gia tri vao cac o nhan
Me.lblGiam.Text = FormatCurrency(SoTienGiam, 2)
Me.lblTongHP.Text = FormatCurrency(HocPhi, 2)
Me.lblHPDong.Text = FormatCurrency(SoTien, 2)
Me.lblSoSV.Text = CStr(SoSV)
Me.lblTongGiam.Text = FormatCurrency(TongGiam, 2)
' Dat lai trang thai
Me.btnXoa.Enabled = True
Me.btnTinh.Enabled = False
Catch
MessageBox.Show("Học phí hoặc số tín chỉ không hợp lệ!", _
"Dữ liệu lỗi", MessageBoxButtons.OK, MessageBoxIcon.Warning)
End Try
Hãy thêm vào một điều khiển nhãn tính số tiền giảm trung bình của 1 sinh viên, khi
tính toán tính luôn giá trị này và hiển thị kết quả.
Cuối cùng, xử lý cho sự kiện Click vào Button Thoát để chấm dứt chương trình.
TT. Visual Basic.NET
Trang 11
PHẦN 3: LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG & WINDOWS
FORMS
Bài tập này tập trung vào việc thiết kế một lớp để lưu thông tin về các loại sách bán
của một cửa hiệu. Mỗi cuốn sách có 3 thuộc tính: Title (tựa), Quantity (số lượng), Giá
bán (Price).
Tạo một dự án mới kiểu WinForm
Thêm một lớp vào dự án nhờ chọn Project menu-Add Class.
THUỘC TÍNH (PROPERTY)
- Thiết kế lớp có các thuộc tính lưu thông tin: tựa sách, số lượng, giá.
Option Strict On
Public Class BookSale
Private mstrTitle As String
Private mintQuantity As Integer
Private mdecPrice As Decimal
'. . . Property declarations go here
End Class
PHƯƠNG THỨC PROPERTY
Để các thuộc tính trên có thể truy cập từ bên ngoài ta phải định nghĩa các
phương thức Property. Trường hợp tổng quát, các phương thức cho mỗi thuộc tính
đảm bảo cho thuộc tính đó cho phép đọc và ghi dữ liệu (luôn có Set và Get).
Do đó, ta sẽ thêm các phương thức Title, Quantity, Price cho cac thuộc tính tựa,
số lượng, đơn giá. Lưu ý rằng, giá trị của Quantity & Price phải hợp lệ (ta có thể bẫy
bằng cách sử dụng System.Exception). TT. Visual Basic.NET
Trang 12
#Region "Properties"
'. . . Property declarations go here
Property Title() As String
Get
Title = mstrTitle
End Get
Set(ByVal Value As String)
mstrTitle = Value
End Set
End Property
Property Quantity() As Integer
Get
Quantity = mintQuantity
End Get
Set(ByVal Value As Integer)
If Value > 0 Then 'must sell at least one book
mintQuantity = Value
Else
Throw New System.Exception
End If
End Set
End Property
Property Price() As Decimal
Get
Price = mdecPrice
End Get
Set(ByVal Value As Decimal)
If Value >= 0 Then '= sign Allows free book at zero price
mdecPrice = Value
Else
Throw New System.Exception
End If
End Set
End Property
#End Region
Đoạn mã lệnh ở trên, ta có sử dụng cặp #Region … End Region để bao lại
đoạn mã trong Property.
PHƯƠNG THỨC (Method)
Phương thức thể hiện các hoạt động của một lớp. Chẳng hạn khi những quyển
sách được bán, ta cần phải tính giá tiền của chúng với giá tiền = Số lượng * Đơn giá.
Phương thức tính số tiền bán 1 loại sách như sau:
#Region "Methods"
Public Function ExtendedPrice() As Decimal
'Calculate extended price as quantity multiplied by price
Return mintQuantity * mdecPrice
End Function
#End Region
KHỞI TẠO ĐỐI TƯỢNG CỦA LỚP
Có 2 cách khởi tạo đối tượng của một lớp:
- Khai báo đối tượng, sau đó khởi tạo đối tượng ở dòng kế tiếp. TT. Visual Basic.NET
Trang 13
TD: Private mBookSale As BookSale 'Khai báo đối tượng
mBookSale = New BookSale 'Khởi tạo đối tượng
- Khai báo và khởi tạo đối tượng trên cùng một dòng.
TD: Private mBookSale As New BookSale
THIẾT KẾ GIAO DIỆN
- Trên Form ta có một menu File với 2 mục: Calculate (Name: mnuCalculate)
để tính toán giá trị của giá tiền, Exit (Name: mnuExit) dùng để thoát khỏi ứng dụng.
- Khai báo một biến đối tượng BookSale (đặt trong phần Windows Form
Designer generated code).
Private mBookSale As BookSale
- Sự kiện mnuCalculate_Click được xử lý:
Private Sub mnuCalculate_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles mnuCalculate.Click
Try
mBookSale = New BookSale 'Instantiate object
'Store values from textboxes to the properties
'of the new object
mBookSale.Title = txtTitle.Text
mBookSale.Quantity = CType(txtQuantity.Text, Integer)
mBookSale.Price = CType(txtPrice.Text, Decimal)
'Calculate and format result
lblEPrice.Text = FormatCurrency(mBookSale.ExtendedPrice)
Catch ex As Exception
'Catch error if Quantity or Price not numeric
MessageBox.Show("Error in Quantity or Price" & _
ControlChars.NewLine & ex.Message, "Data Entry Error", _
MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
End Try
End Sub
- Việc kết thúc ứng dụng được xử lý bằng câu lệnh End.
SHARED VARIABLE
- Nếu chúng ta muốn tính tổng số sách bán ra và tổng giá tiền đã bán ta cần sử
dụng đến biến Shared.
- Một thành viên được gọi là Shared có nghĩa là thành viên đó được dùng
chung cho tất cả các đối tượng của lớp đó. Bên cạnh đó ta có thể truy cập đến chúng
không cần thông qua các đối tượng của lớp.
txtTitle
txtQuantity
txtPrice
lblEPrice TT. Visual Basic.NET
Trang 14
- Cú pháp khai báo biến Shared:
[Public | Private] Shared VariableName As Datatype
- Chẳng hạn, ta cần khai báo các biến Shared trong lớp BookSale để lưu tổng
số sách bán ra và tổng giá tiền đã bán:
'Hold the SalesTotal property
Private Shared mdecSalesTotal As Decimal
'Hold the SalesCount property
Private Shared mintSalesCount As Integer
- Đồng thời lúc đó ta cũng khai báo 2 thuộc tính cho 2 biến Shared ở trên với để
ý rằng chúng là chỉ đọc (ReadOnly):
Shared ReadOnly Property SalesTotal() As Decimal
Get
SalesTotal = mdecSalesTotal
End Get
End Property
Shared ReadOnly Property SalesCount() As Integer
Get
SalesCount = mintSalesCount
End Get
End Property
- Phương thức tính tổng giá bán được sửa lại như sau:
Public Function ExtendedPrice() As Decimal
Dim decExtendedPrice As Decimal
'Calculate extended price as quantity times price
decExtendedPrice = mintQuantity * mdecPrice
'Add the extended price to the total
'and add 1 to the count of sales made
mdecSalesTotal += decExtendedPrice
mintSalesCount += 1
Return decExtendedPrice
End Function
THIẾT KẾ LẠI FORM
- Thêm mục Summary (Name: mnuSum) vào menu File để tính tổng sách và
tổng số tiền thu được. Sự kiện mnuSum_Click được xử lý:
Private Sub mnuSum_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles mnuSum.Click
'Display sales summary information
Dim strMessage As String
strMessage = "Sales Total: " & _
FormatCurrency(mBookSale.SalesTotal) & _
ControlChars.NewLine & "Sales Count: " & _
mBookSale.SalesCount.ToString
MessageBox.Show(strMessage, "Summary Information", _
MessageBoxButtons.OK, MessageBoxIcon.Information)
End Sub
- Thêm một CheckBox vào Form. Giả sử, đôi lúc cửa hàng sách giảm giá cho
một số khách hàng nào đó, việc giảm giá thể hiện bằng một giá trị Boolean (True nếu
giảm giá, False và ngược lại).
- Giả sử ta cần giảm giá 20% cho một số khách hàng nào đó.
Public Class BookSale
Private mstrTitle As String
Private mintQuantity As Integer
Private mdecPrice As Decimal TT. Visual Basic.NET
Trang 15
'Variables to accumulate sales total and count
Private Shared mdecSalesTotal As Decimal
Private Shared mintSalesCount As Integer
'Variable for the check box and constant for the discount rate
Private mblnDiscount As Boolean
Private Const msngDISCOUNT_RATE As Single = 0.2
- Giá trị Discount = True nếu là giảm giá.
- Property DisCount: gồm 2 phương thức Set & Get
Property Discount() As Boolean
Get
Discount = mblnDiscount
End Get
Set(ByVal Value As Boolean)
mblnDiscount = Value
End Set
End Property
- Hàm tính số tiền giảm: DisCountAmount:
Public Function DiscountAmount() As Decimal
'Calculate discounted price
Dim decDiscountAmount As Decimal
If mblnDiscount Then
decDiscountAmount = CDec(mintQuantity) * mdecPrice * _
CType(msngDISCOUNT_RATE, Decimal)
Else 'No discount given
decDiscountAmount = 0D
End If
Return decDiscountAmount
End Function
- Hàm NetDue: tính số tiền thực sự phải trả, số tiền này = Tổng số tiền – Số tiền
giảm. Lưu ý là khi tính số tiền thực sự phải trả ta cần cập nhật lại các thuộc tính dùng
chung (Shared).
Public Function NetDue() As Decimal
'Calculate discounted price
Dim decNetDue As Decimal
decNetDue = ExtendedPrice() - DiscountAmount()
'Add the new due amount to the total
'and add 1 to the count of sales made
mdecSalesTotal += decNetDue
mintSalesCount += 1
Return decNetDue
End Function
- Hàm ExtendedPrice:
Public Function ExtendedPrice() As Decimal
Dim decExtendedPrice As Decimal
'Calculate extended price as quantity times price
decExtendedPrice = mintQuantity * mdecPrice
Return decExtendedPrice
End Function
- Sự kiện mnuCalculate_Click được xử lý lại:
Try
'Instantiate new booksale class instance
mBookSale = New BookSale
'Store from textboxes to new booksale class instance
mBookSale.Title = txtTitle.Text TT. Visual Basic.NET
Trang 16
mBookSale.Quantity = CType(txtQuantity.Text, Integer)
mBookSale.Price = CType(txtPrice.Text,Decimal)
mBookSale.Discount = chkDis.Checked
'Calculate and display result
lblEPrice.Text = FormatCurrency(mBookSale.ExtendedPrice)
lblDis.Text = FormatCurrency(mBookSale.DiscountAmount)
lblNetDue.Text = FormatCurrency(mBookSale.NetDue)
txtPrice.Text = FormatCurrency(txtPrice.Text)
Catch ex As Exception
'Catch error if Quantity or Price not numeric
MessageBox.Show("Error in Quantity or Price" & _
ControlChars.NewLine & ex.Message, "Data Entry Error", _
MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
End Try
- Thực thi ứng dụng, ta có thể nhận được kết quả:
PHƯƠNG THỨC XÂY DỰNG (CONSTRUCTOR) & HỦY (DESTRUCTOR)
CONSTRUCTOR
- Đây là phương thức được gọi khi đối tượng được khởi tạo, phương thức này
có tên là New và ta có thể Overload phương thức này.
- Mở lại mã lệnh của lớp BookeSale và thêm vào 2 phương thức xây dựng.
Sub New()
'Constructor for class
'Place initialization statements here
End Sub
Sub New(ByVal Title As String, ByVal Quantity As Integer, _
ByVal Price As Decimal, ByVal Discount As Boolean)
'Assign property values
Me.Title = Title
Me.Quantity = Quantity
Me.Price = Price
Me.Discount = Discount
End Sub
- Khởi tạo lại đối tượng mBookSale của lớp BookSale bằng cách sử dụng
phương thức xây dựng có tham số. Điều này được thực hiện bằng cách sửa lại thủ tục
mnuCalculate_Click:
Try TT. Visual Basic.NET
Trang 17
'Instantiate new booksale class instance
mBookSale = New BookSale(txtTitle.Text, CType(txtQuantity.Text, _
Integer), CType(txtPrice.Text, Decimal), chkDis.Checked)
'Calculate and display result
lblEPrice.Text = FormatCurrency(mBookSale.ExtendedPrice)
lblDis.Text = FormatCurrency(mBookSale.DiscountAmount)
lblNetDue.Text = FormatCurrency(mBookSale.NetDue)
txtPrice.Text = FormatCurrency(txtPrice.Text)
Catch ……
- Thực thi chương trình và kiểm tra kết quả.
INHERITANCE (THỪA KẾ)
- Thiết kế lớp StudentBookSale thừa kế từ lớp BookSale. Lớp này thừa kế tất cả
các thành viên của lớp BookSale, vì vậy các thành viên là Private của lớp BookSale
cần được đặt lại là Protected.
- Lớp StudentBookSale có thêm một thuộc tính mang ý nghĩa nếu sinh viên giỏi
thì được giảm giá thêm 15%.
Lớp StudentBookSale:
• Thêm một thuộc tính protected shared mdecDiscountTotal, thuộc tính này
dùng để lưu tổng số tiền giảm (đây là giá trị chỉ đọc Readonly).
• Thêm một hằng msngSTUDENT_DISCOUNT_RATE lưu tỉ lệ giảm là 15%.
• Thêm một thuộc tính Boolean để xác định đó có phải là sinh viên giỏi hay
không?
Public Class StudentBookSale
Inherits BookSale
Protected Shared mdecDiscountTotal As Decimal
Protected mblnStudentDiscount As Boolean
Private Const msngSTUDENT_DISCOUNT_RATE As Single = 0.15
#Region "Properties"
Shared ReadOnly Property DiscountTotal() As Decimal
Get
DiscountTotal = mdecDiscountTotal
End Get
End Property
Property StudentDiscount() As Boolean
Get
StudentDiscount = mblnStudentDiscount
End Get
Set(ByVal Value As Boolean)
mblnStudentDiscount = Value
End Set
End Property
#End Region
End Class
- Mở lại lớp BookSale để sửa đổi lại các thuộc tính là Protected & phương thức
là Overridable.
Protected mstrTitle As String
Protected mintQuantity As Integer
Protected mdecPrice As Decimal
'Hold the SalesTotal property
Protected Shared mdecSalesTotal As Decimal TT. Visual Basic.NET
Trang 18
'Hold the SalesCount property
Protected Shared mintSalesCount As Integer
Protected mblnDiscount As Boolean
Protected Const msngDISCOUNT_RATE As Single = 0.2
Và Public Overridable Function DiscountAmount() As Decimal
- Mở lớp StudentBookSale để thêm vào phương thức DiscountAmount:
Overrides Function DiscountAmount() As Decimal
'Calculate discounted price
Dim decDiscountAmount As Decimal
Dim sngTotalDiscountRate As Single
'Figure out the discount based on the check boxes.
If mblnDiscount Then
sngTotalDiscountRate += msngDISCOUNT_RATE
End If
If mblnStudentDiscount Then
sngTotalDiscountRate += msngSTUDENT_DISCOUNT_RATE
End If
'Compute amount of discount
decDiscountAmount = CType(mintQuantity, Decimal) * mdecPrice * _
CType(sngTotalDiscountRate, Decimal)
Accumulate the amount of discount to the total discount shared variable
mdecDiscountTotal += decDiscountAmount
'Return the amount of discount
Return decDiscountAmount
End Function
- Thêm phương thức xây dựng vào lớp StudentBookSale, phương thức này có 5
tham số trong đó có một tham số xác định đó có phải là sinh viên giỏi hay không?
Sub New()
'Constructor with empty argument list
MyBase.New() 'Call the base class constructor
End Sub
Sub New(ByVal Title As String, ByVal Quantity As Integer, _
ByVal Price As Decimal, ByVal Discount As Boolean, _
ByVal StudentDiscount As Boolean)
'Assign property values
MyBase.New() 'Calls the base class constructor
Me.Title = Title
Me.Quantity = Quantity
Me.Price = Price
Me.Discount = Discount
Me.StudentDiscount = StudentDiscount
End Sub
TT. Visual Basic.NET
Trang 19
XÂY DỰNG LẠI FORM
- Thiết kế Form như sau:
Private Sub mnuCalculate_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles mnuCalculate.Click
Try
'Calculate extended price for sale
'Instantiate correct object and set properties
If chkStu.Checked Then
'This is a student – note the number of arguments in
'the parameter list – there are five of them
mStudentBookSale = _
New StudentBookSale(txtTitle.Text, _
CType(txtQuantity.Text, Integer), _
CType(txtPrice.Text, Decimal), _
chkDis.Checked, chkStu.Checked)
'Calculate and display result
lblEPrice.Text = _
FormatCurrency(mStudentBookSale.ExtendedPrice)
lblDis.Text = _
FormatCurrency(mStudentBookSale.DiscountAmount)
lblNetDue.Text = _
FormatCurrency(mStudentBookSale.NetDue)
txtPrice.Text = FormatCurrency(txtPrice.Text)
Else
'This is not a student – only four arguments in
'the parameter list
mBookSale = New BookSale(txtTitle.Text, _
CType(txtQuantity.Text, Integer), _
CType(txtPrice.Text, Decimal), chkDis.Checked)
'Calculate and display result
lblEPrice.Text = _
FormatCurrency(mBookSale.ExtendedPrice)
lblDis.Text = _ TT. Visual Basic.NET
Trang 20
FormatCurrency(mBookSale.DiscountAmount)
lblNetDue.Text = FormatCurrency(mBookSale.NetDue)
txtPrice.Text = FormatCurrency(txtPrice.Text)
End If
Catch
MessageBox.Show("Error in Quantity or Price", _
"Data Entry Error", MessageBoxButtons.OK, _
MessageBoxIcon.Exclamation)
End Try
End Sub
- Sự kiện mnuSum_Click được xử lý lại để hiển thị giá trị tổng:
Private Sub mnuSum_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles mnuSum.Click
'Display sales summary information
Dim strMessage As String
strMessage = "Sales Total: " & _
FormatCurrency(mBookSale.SalesTotal) & _
ControlChars.NewLine & "Sales Count: " & _
mBookSale.SalesCount.ToString & _
ControlChars.NewLine & _
"Total Student Discounts: " & _
FormatCurrency(mStudentBookSale.DiscountTotal)
MessageBox.Show(strMessage, "Summary Information", _
MessageBoxButtons.OK, MessageBoxIcon.Information)
End Sub
LƯU DỰ ÁN VÀ THỰC THI ỨNG DỤNG TT. Visual Basic.NET
Trang 21
Phần 3
TRUY CẬP CƠ SỞ DỮ LIỆU VỚI
ADO.NET
Trong phần này chúng ta sẽ tìm hiểu cách thức làm việc với ADO.NET. Đây là một
tập hợp các lớp cũng như các giao diện cho phép truy cập dữ liệu trong .NET
Framework. Ở đây ta sẽ sử dụng ADO.NET để nối kết với cơ sở dữ liệu SQL Server,
lấy dữ liệu và hiển thị chúng trên form.
Các bước thực hiện:
1. Trong SQL Server tạo một cơ sở dữ liệu tên là DVDLibrary.
2. Thêm một bảng tên DVDLibrary với cấu trúc như sau (Bảng 4.1):
3. Thêm vài dòng dữ liệu vào bảng.
4. Tạo một ứng dụng WinForrm tên prjDVD.
5. Đổi tên của form chính thành frmDVDCatalog.
6. Thêm một số control vào và sửa đổi một số thuộc tính tương ứng (bảng 4.2) sao
cho ta được giao diện:
TT. Visual Basic.NET
Trang 22
Control Property Value
Form
Name
Text
frmDVDCatalog
DVD Catalog
Label
Name
Text
lblHeading
DVD Catalog
Label
Name
Text
lblDVDCodeNo
DVD Code Number
Label
Name
Text
lblTitle
DVD Title
Label
Name
Text
lblLang
Language
Label
Name
Text
lblPrice
Price
Label
Name
Text
lblDollars
Dollars
GroupBox
Name
Text
grpSubTitles
Subtitles
RadioButton
Name
Text
Checked
radYes
Yes
true
RadioButton
Name
Text
Checked
radNo
No
false
ComboBox
Name
Collection
cboLang
English
Spanish
French
Chinese
Russian
NumericUpDown
Name
Maximum
Minimum
Value
updPrice
150
5
5
TextBox
Name
ReadOnly
Text
txtCodeNo
true
TextBox
Name
Text
txtTitle
Button
Name
Text
btnAddNew
AddNew
Button
Name
Text
btnSave
Save
Button
Name
Text
btnExit
Exit
7. Chuyển sang cửa sổ Code View, tham chiếu đến một số không gian tên:
Imports System.Data
Imports System.Data.SqlClient;
8. Khai báo những biến sau trong phần khai báo của form: TT. Visual Basic.NET
Trang 23
Private conn As SqlConnection
Private commd As SqlCommand
Private sqlstr, lang As String
Private codeno, subtitles As Integer
Dim price As Decimal
9. Viết đoạn mã sau vào phương thức xử lý sự kiện Load của form:
Try
conn = New SqlConnection("Server=.;” & _
”Initial Catalog=DVDLibrary;User
Id=user;pwd=user;")
commd = new SqlCommand("Select * From
DVDLibrary",conn)
conn.Open()
btnSave.Enabled = False
Catch (ex As Exception)
MessageBox.Show(ex.Message + ex.StackTrace)
End Try
10. Khi button AddNew được click, một đối tượng SQLCommand được tạo ra
thực hiện câu truy vấn lấy về mã số lớn nhất của DVD Code No từ bảng from the
DVDLibrary. Nếu bảng rỗng, một ngoại lệ được tạo ra. Vì thws ta phải bẫy lại
ngoại lệ này nhằm kiểm tra khả năng bảng rỗng (lúc đói giá trị của biến codeno
được gán là 0). Sau đó giá trị của codeno tăng 1 để có giá trị hiện hành của
codeno. Kế tiếp các trường của form được xóa trắng nhờ vào việc gọi thực thi
phương thức ResetFields() để một mẩu tin mới được thêm vào và kích hoạt
button Save.
Sự kiện btnAddNew_Click:
//calculate new Code
commd = new SqlCommand("Select max(DVDCodeNo) From DVDLibrary", _
conn)
Try
codeno = CType(commd.ExecuteScalar(), Integer)
btnAddNew.Enabled = False
btnSave.Enabled=True
Catch(ex As Exception)
codeno=0
MessageBox.Show(ex.Message)
End Try
codeno = codeno + 1
txtCodeNo.Text = codeno.ToString()
ResetFields()
11. Sự kiện Click của button btnExit được xử lý để đóng lại nối kết dữ liệu và
kết thúc ứng dụng:
conn.Close()
End
12. Sự kiện btnSave_Click nhằm thêm một dòng dữ liệu mới vào bảng. Bởi vì
đây không phải là một câu truy vấn lấy về dữ liệu mà là một câu truy vấn hành
động nên ta sử dụng phương thức ExecuteNonQuery của lớp SQLCommand: TT. Visual Basic.NET
Trang 24
Try
sqlstr = "Insert Into DVDLibrary Values(" & _
codeno.ToString() & ",'" & txtTitle.Text & "', '" & _
lang + "'," & subtitles.ToString() & _
"," & price.ToString() & ")"
MessageBox.Show(sqlstr)
commd = New SqlCommand(sqlstr,conn)
commd.ExecuteNonQuery()
MessageBox.Show("Record has been add successfully")
ResetFields()
btnExit.Focus()
btnAddNew.Enabled = True
btnSave.Enabled=False
Catch(ex As Exception)
MessageBox.Show(ex.Message + ex.StackTrace)
End Try
13. Sự kiện ValueChanged của NumericUpDown được xử lý:
price = updPrice.Value
14. Sự kiện SelectedIndexChanged của ComboBox được xử lý:
lang = cboLang.SelectedItem.ToString()
15. Sự kiện CheckedChanged của RadioButton được xử lý:
radYes_CheckedChanged
subtitles = 1
radNo_CheckedChanged
subtitles = 0;
16. Đoạn mã cho phương thức ResetFields:
Private Sub ResetFields()
txtTitle.Text = ""
price = updPrice.Value=5
lang=cboLang.Items[0].ToString()
cboLang.Text = ""
radYes.Checked = True
radNo.Checked= False;
btnSave.Enabled=True
End Sub
17. Lưu, biên dịch và thực thi dự án. Một thí dụ mẫu cho việc thêm vào một
mẩu tin như trong hình 4.3:
TT. Visual Basic.NET
Trang 25

markdown:
TT. Visual Basic.NET
Trang 1
Phần 1
LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
VISUAL BASIC.NET
1) Viết chương trình hiển thị câu thông báo “Hello World!!!” lên màn hình.
2) Viết chương trình nhận một chuỗi ký tự từ bàn phím. Kiểm tra chuỗi có đối xứng
hay không? (TD: DBGBD - Chuỗi đối xứng; DBGB - Chuỗi không đối xứng).
3) Bảng dưới đây là các khóa tin học chứng chỉ A, B của khoa Công Nghệ Thông Tin:
TT Khóa học Học Phí Thời gian
1 Chứng chỉ A - Tin Học Văn Phòng 400.000 2 tháng
2 Chứng chỉ B - Visual Basic 350.000 1.5 tháng
3 Chứng chỉ B - Access 450.000 2 tháng
* Ghi chú: Đối tượng là sinh viên được giảm 10%
.
Viết chương trình mô phỏng việc đóng học phí của học viên. Người sử dụng
chương trình đầu tiên sẽ chọn loại chứng chỉ mà họ muốn đăng ký học (nhập từ bàn
phím ký tự A hay B); nếu chọn B, người dùng sẽ phải cho biết họ sẽ đăng ký học lớp
Visual Basic (nhập vào VB) hay Access (nhập vào AC). Sau khi thông tin về khóa học
đã được ghi nhận, một thông tin quan trọng khác là đối tượng đăng ký có phải là sinh
viên hay không (nếu có nhập vào C ngược lại K).
Tính tiền mà học viên phải trả.
Thí dụ:
Bạn muốn đăng ký học chứng chỉ A hay B: B
Bạn học lớp Visual Basic (VB) hay Access (Ac): AC
Bạn có là sinh viên không? C
Số tiền bạn phải trả là: 405000 đồng
4) Tạo lớp Con người với 2 thuộc tính là họ tên và ngày sinh để lấy về hay gán tên
cùng ngày sinh của một người cụ thể. Thiết kế lớp nhân viên kế thừa từ lớp con người,
lớp này có thêm 2 thuộc tính là ngày bắt đầu làm việc và tiền lương mỗi tháng.
Viết thủ tục Main cho phép tạo một đối tượng thuộc lớp nhân viên. Nhập từ bàn
phím các giá trị: họ tên, ngày sinh, ngày bắt đầu làm việc, tiền lương. Hiển thị lại các
kết quả đã nhập.
5) Một cửa hàng sách cần quản lý thông tin về các loại sách sẽ bán của mình. Một số
thông tin cần quản lý là: tên sách, số lượng, giá bán. Hãy thiết kế lớp sách bán cho
phép có những thuộc tính (có chỉ thị truy cập là Public) là các thông tin trên. Ngoài các
thuộc tính lớp nên có phương thức tính tiền dựa vào số lượng sách và giá bán mỗi
quyển. TT. Visual Basic.NET
Trang 2
Thí dụ: Quyển Mật mã của Da Vinci bán cho 1 khách hàng là 20 quyển, giá
bán 1 quyển là 99000đ. Vậy số tiền phải trả là 1.980.000 đ.
Viết thủ tục Main cho phép tạo một đối tượng sách bán và nhập từ bàn phím tên
sách bán, số lượng và giá bán mỗi quyển. Tính tiền phải trả.
6) Hằng năm, đến mùa khai trường; cửa hàng sách bán giảm giá 10% cho đối tượng là
sinh viên học sinh.
Thiết kế lớp sách bán cho sinh viên, lớp này kế thừa từ lớp sách bán ở câu 2;
bên cạnh đó lớp này còn có 1 thành viên kiểu Boolean cho biết đó có phải là sinh viên
hay không? Dĩ nhiên, phương thức tính tiền của lớp dẫn xuất này phải được thiết kế
lại: nếu là sinh viên thì giá bán giảm 10%, ngược lại sách được bán với giá gốc; để ý
rằng phương thức tính tiền của lớp con (sách bán cho sinh viên) sẽ ghi đè phương thức
tính tiền của lớp cơ sở (sách bán).
Viết thủ tục Main cho phép tạo một đối tượng sách bán cho sinh viên và nhập
từ bàn phím tên sách bán, số lượng, giá bán, người mua có là sinh viên hay không?
Tính tiền phải trả.
7) Thiết kế lớp Điểm trong không gian 2 chiều gồm 2 thuộc tính là tọa độ X & tọa độ
Y (2 thuộc tính có chỉ thị truy cập là Public).
- 2 phương thức xây dựng: một không có tham số (gán X, Y là 0), một có tham
số (cặp (X1,Y1) có sẵn để gán cho X,Y).
- Phương thức hiển thị tọa độ của điểm lên màn hình.
- Sử dụng Overload phương thức để tạo 2 phương thức tính khoảng cách từ
điểm hiện thời đến 1 điểm khác, một không tham số (tính khoảng cách đến gốc tọa
độ), một có tham số là một điểm khác (tính khoảng cách đến điểm này).
Viết thủ tục Main cho phép khởi tạo 3 điểm A, B, C và nhập tọa độ 3 điểm từ
bàn phím. Hiển thị tọa độ 3 điểm lên màn hình. Tính độ dài AB, BC, AC. Nếu AB,
BC, AC tạo thành tam giác, hãy tính diện tích tam giác ABC.
Thiết kế lớp điểm trong không gian 3 chiều kế thừa lớp điểm trong không gian 2
chiều ở câu 4, bên cạnh đó lớp mới có thêm thuộc tính là tọa độ trên trục Oz.
- Viết phương thức xây dựng cho lớp điểm trong không gian 3 chiều. Phương
thức này có 3 tham số là tọa độ X, Y, Z trong đó cặp (X, Y) sẽ được dùng để gọi đến
phương thức xây dựng có tham số của lớp điểm trong không gian 2 chiều.
- Sử dụng ghi đè phương thức để viết lại phương thức hiển thị tọa độ của điểm
trong không gian 3 chiều lên màn hình.
- Viết thủ tục Main cho phép nhập từ bàn phím các giá trị (X1,Y1,Z1) và khởi
tạo điểm M trong không gian 3 chiều là các tọa độ này. Gọi phương thức hiển thị để
hiển thị các tọa độ vừa nhập. TT. Visual Basic.NET
Trang 3
Phần 2
ỨNG DỤNG WINDOWS FORMS
PHẦN 1: Làm quen với môi trường VBNET
o Khởi động VBNET - Chọn Start và xác định thư mục Microsoft Visual
Studio.NET.
Màn hình đầu tiên của Visual Studio.NET IDE có dạng:
o Click New Project. Dự án đầu tiên của chúng ta là Visual Basic Project thuộc
kiểu Windows Application như hình dưới:
Xác lập tên dự án: MyName.
Chỉ ra nơi lưu dự án này. Chẳng hạn hình bên dưới là ổ đĩa A: và thư mục tên là
MyName.
Chúng ta không cần tạo thư mục trước. VB.NET sẽ tạo thư mục khi ta Click
chọn nút OK trong cửa sổ tạo dự án mới. TT. Visual Basic.NET
Trang 4
Môi trường phát triển tích hợp (IDE)
o Sau khi tạo dự án mới ta nhận được cửa sổ như hình dưới:
Nếu IDE của ta không như hình trên, ta có thể xác lập lại các thông số mặc định
cho bằng cách chọn Tools/Options/chọn Reset Windows Layout như hình:
TT. Visual Basic.NET
Trang 5
Dự án đầu tiên, cũng với dự án ở bài trên
Thiết kế Form
Đặt các điều khiển Label và Button trên form như hình dưới. Ta có thể thực
hiện bằng cách chọn chúng trong Toolbox và kéo thả lên form hay bằng cách
double_click chúng trong Toolbox.
Thay đổi kích thước của điều khiển và form cho phù hợp
1: Name: frmMyName; Text: MyName Project; Start Position: Center Screen
2: Name: lblMyName; Border Style: Fixed Single
3: Name: btnClickMe; Text: Click Me
4: Name: btnExit; Text: Exit
Start up object (Đối tượng khởi động)
Khi một dự án có nhiều hơn một form, chúng ta cần phải xác lập Start up
object của dự án. Ngoài ra chúng ta cũng nên phải xác lập lại thông số này mỗi khi
chúng ta thay đổi thuộc tính Name của một đối tượng Form. Thử suy nghĩ xem tại sao
ta phải làm như vậy?
2
1
3 4TT. Visual Basic.NET
Trang 6
Xác lập đối tượng khởi động bằng cách nhấp chuột phải vào dự án MyName
trong cửa sổ Solution Explorer (như hình).
Lưu và thực thi dự án
Để lưu dự án, ta chọn File/Save All (lưu tất cả các tập tin hay Save- lưu từng
tập tin).
Có một số cách để thực thi dự án: Chọn mục Debug/Start trên menu hay đơn
giản là bấm phím F5.
Viết mã lệnh
Giả sử khi chương trình được thực thi, mỗi khi người dùng nhấp chọn vào nút
Click Me. Lúc đó tên của ta sẽ xuất hiện trên điều khiển nhãn lblMyName. Hay khi họ
nhấp chọn Exit, chương trình kết thúc.
Khi người dùng nhấp chọn vào nút nhấn, lúc đó ta nói có sự kiện (event) xảy ra,
sự kiện đó là sự kiện Click và đối tượng nhận biết sự kiện đó là nút nhấn tương ứng.
Nếu chúng ta muốn thực thi các thao tác được mô tả ở trên, chúng ta phải viết mã lệnh
tương ứng. Đoạn mã lệnh đó gọi là đáp ứng sự kiện (event handler).
Chú thích trong VBNET
Chú thích giúp cho mã lệnh được rõ ràng, dễ tham chiếu về sau hơn. Điều này
rất có ích trong trường hợp mã lệnh của chương trình khá lớn.
Trong VBNET, việc chú thích được đặt sau từ REM hay sau dấu ‘. Chẳng hạn
như:
REM Programmer: Lam Hoai Bao
' Date Programmed: 12/09/2005
REM Program name: MyName
Để có thể viết được các chú thích trên trong dự án, ta chuyển sang cửa sổ mã
lệnh như trong hình:
TT. Visual Basic.NET
Trang 7
Gán trị cho điều khiển bằng mã lệnh
Sử dụng: Object.Property = Value
Nếu ta muốn gán họ và tên của chúng ta cho điều khiển nhãn lblMyName (giá
trị đó được lưu trữ trong thuộc tính Text), ta sử dụng:
lblMyName.Text = "Lâm Hoài Bảo"
Thực thi phương thức của một điều khiển
Sử dụng: Object.Method(<Các tham số - nếu có>)
Chẳng hạn, để đóng form frmMyName ta sử dụng phương thức Close()
frmMyName.Close()
Đáp ứng sự kiện:
Để có thể đáp ứng sự kiện Click ở trên, trong cửa sổ thiết kế (View Designer),
ta double click lên nút nhấn cần thiết, cửa sổ mã lệnh hiển thị như hình:
Nhấp chọn Form hay Code
Chọn View Code
Chọn View Designer TT. Visual Basic.NET
Trang 8
VBNET tạo ra 1 chương trình con bắt đầu bằng Private Sub và kết thúc bởi End
Sub. Mỗi chương trình con có một tên. Đối với chương trình con dùng để đáp ứng sự
kiện của 1 điều khiển, chương trình con đáp ứng sự kiện sẽ có tên là: Tên điều khiển
+ Tên sự kiện.
Ví dụ: Đối với nút nhấn btnClickMe ở trên, ta có chương trình con
btnClickMe_Click.
Lưu ý: Chương trình con đáp ứng sự kiện có thể có tham số.
Yêu cầu:
9 Viết các chú thích được mô tả như trên.
9 Viết mã lệnh đáp ứng sự kiện Click của các nút nhấn.
9 Lưu dự án và thực thi chương trình.
9 Đóng dự án lại và thoát khỏi Visual Studio.NET.
PHẦN 2: Tính toán học phí sinh viên
Trong phần này chúng ta sẽ tính toán học phí của các sinh viên trong trường đại học và
ghi nhận lại kết quả tổng.
Đầu vào: Người dùng hệ thống nhập dữ liệu vào các ô nhập. Chương trình sẽ lưu các
giá trị dưới dạng các biến.
Xử lý: Dựa vào các biến, chương trình sẽ tính toán giá trị kết quả, lưu vào trong các
biến kết quả. TT. Visual Basic.NET
Trang 9
Đầu ra: Kết quả sẽ được hiển thị trong các điều khiển nhãn. Mỗi lần tính toán cần ghi
nhận lại tổng số tiền miễn giảm và tổng số sinh viên đã nhập vào hệ thống.
Chuẩn bị:
Tạo giao diện như trên, viết các khai báo sau trong phần khai báo của Form
‘ Hằng số lưu tỉ lệ miễn giảm (mặc định là 20%)
Const Tilegiam As Single = 0.2F
'Cac bien lưu số lượng sinh viên, tổng số tiền giảm
Dim SoSV As Integer = 0
Dim TongGiam As Decimal = 0.0
Xử lý sự kiện Form_Load()
Ban đầu khi Form được hiển thị button Tính toán được kích hoạt, ngược lại là
Button Xóa. Lý do là button Xóa nhằm xác lập người dùng hệ thống xóa trắng các ô
nhập và các o kết quả mỗi khi muốn nhậpvào người mới. Do đó, button Xóa chỉ được
kích hoạt sau khi ta đã tính toán giá trị của 1 người.
Me.btnTinh.Enabled = True
Me.btnXoa.Enabled = False
Xử lý sự kiện Click chuột vào Button Tính toán:
- Khai báo biến lưu số tín chỉ, số tiền 1 tín chỉ, tổng học phí, số tiền giảm (=
tổng học phí*20%), số tiền phải đóng.
- Đưa các giá trị của biến tổng học phí, số tiền giảm, số tiền phải đóng hiển thị
lên các điều khiển nhãn.
- Đếm tăng số lượng sinh viên, tổng số tiền miễn giảm của các học sinh; đặt các
kết quả này lên các điều khiển nhãn tương ứng.
Private Sub btnTinh_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles btnTinh.Click
‘ Khai báo các biến cục bộ
Dim SoTienGiam As Decimal
Dim SoTinChi As Integer, HocPhi_TC As Decimal
Dim HocPhi As Decimal, SoTien As Decimal
‘ Lưu các giá trị nhập vào biến
SoTinChi = CInt(txtSTC.Text)
HocPhi_TC = CDec(txtHPTC.Text)
‘ Tính toán số tiền
HocPhi = HocPhi_TC * SoTinChi
SoTienGiam = HocPhi * Tilegiam
SoTien = HocPhi – SoTienGiam
' Tinh tong cong
SoSV = SoSV + 1
TongGiam = TongGiam + SoTienGiam
' Dat gia tri vao cac o nhan
Me.lblGiam.Text = FormatCurrency(SoTienGiam, 2)
Me.lblTongHP.Text = FormatCurrency(HocPhi, 2)
Me.lblHPDong.Text = FormatCurrency(SoTien, 2)
Me.lblSoSV.Text = CStr(SoSV)
Me.lblTongGiam.Text = FormatCurrency(TongGiam, 2)
' Dat lai trang thai của Button
Me.btnXoa.Enabled = True
Me.btnTinh.Enabled = False
End Sub TT. Visual Basic.NET
Trang 10
Xử lý sự kiện Click của Button Xóa:
- Xóa trắng các ô nhập và các ô kết quả.
- Đặt lại trạng thái của Button Tính toán và Xóa.
- Ô nhập họ tên nhận được tiêu điểm (sẵn sàng được kích hoạt) .
Private Sub btnXoa_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles btnXoa.Click
Me.txtHPTC.Clear()
Me.txtHT.Clear()
Me.txtSTC.Clear()
Me.lblTongHP.Text = ""
Me.lblHPDong.Text = ""
Me.lblGiam.Text = ""
Me.txtHT.Focus()
Me.btnTinh.Enabled = True
Me.btnXoa.Enabled = False
End Sub
Bẫy lỗi:
Điều gì sẽ xảy ra nếu người dùng hệ thống nhập vào các ô nhập không phải là
các giá trị số?
Để giải quyết ta sử dụng cấu trúc bẫy lỗi Try … Catch bao quanh mã lệnh chỗ
chuyển đổi dữ liệu từ chuỗi sang số và ngược lại.
Chẳng hạn:
Try
SoTinChi = CInt(txtSTC.Text)
HocPhi_TC = CDec(txtHPTC.Text)
HocPhi = HocPhi_TC * SoTinChi
SoTienGiam = HocPhi * Tilegiam
SoTien = HocPhi - SoTienGiam
' Tinh tong cong
SoSV = SoSV + 1
TongGiam = TongGiam + SoTienGiam
' Dat gia tri vao cac o nhan
Me.lblGiam.Text = FormatCurrency(SoTienGiam, 2)
Me.lblTongHP.Text = FormatCurrency(HocPhi, 2)
Me.lblHPDong.Text = FormatCurrency(SoTien, 2)
Me.lblSoSV.Text = CStr(SoSV)
Me.lblTongGiam.Text = FormatCurrency(TongGiam, 2)
' Dat lai trang thai
Me.btnXoa.Enabled = True
Me.btnTinh.Enabled = False
Catch
MessageBox.Show("Học phí hoặc số tín chỉ không hợp lệ!", _
"Dữ liệu lỗi", MessageBoxButtons.OK, MessageBoxIcon.Warning)
End Try
Hãy thêm vào một điều khiển nhãn tính số tiền giảm trung bình của 1 sinh viên, khi
tính toán tính luôn giá trị này và hiển thị kết quả.
Cuối cùng, xử lý cho sự kiện Click vào Button Thoát để chấm dứt chương trình.
TT. Visual Basic.NET
Trang 11
PHẦN 3: LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG & WINDOWS
FORMS
Bài tập này tập trung vào việc thiết kế một lớp để lưu thông tin về các loại sách bán
của một cửa hiệu. Mỗi cuốn sách có 3 thuộc tính: Title (tựa), Quantity (số lượng), Giá
bán (Price).
Tạo một dự án mới kiểu WinForm
Thêm một lớp vào dự án nhờ chọn Project menu-Add Class.
THUỘC TÍNH (PROPERTY)
- Thiết kế lớp có các thuộc tính lưu thông tin: tựa sách, số lượng, giá.
Option Strict On
Public Class BookSale
Private mstrTitle As String
Private mintQuantity As Integer
Private mdecPrice As Decimal
'. . . Property declarations go here
End Class
PHƯƠNG THỨC PROPERTY
Để các thuộc tính trên có thể truy cập từ bên ngoài ta phải định nghĩa các
phương thức Property. Trường hợp tổng quát, các phương thức cho mỗi thuộc tính
đảm bảo cho thuộc tính đó cho phép đọc và ghi dữ liệu (luôn có Set và Get).
Do đó, ta sẽ thêm các phương thức Title, Quantity, Price cho cac thuộc tính tựa,
số lượng, đơn giá. Lưu ý rằng, giá trị của Quantity & Price phải hợp lệ (ta có thể bẫy
bằng cách sử dụng System.Exception). TT. Visual Basic.NET
Trang 12
#Region "Properties"
'. . . Property declarations go here
Property Title() As String
Get
Title = mstrTitle
End Get
Set(ByVal Value As String)
mstrTitle = Value
End Set
End Property
Property Quantity() As Integer
Get
Quantity = mintQuantity
End Get
Set(ByVal Value As Integer)
If Value > 0 Then 'must sell at least one book
mintQuantity = Value
Else
Throw New System.Exception
End If
End Set
End Property
Property Price() As Decimal
Get
Price = mdecPrice
End Get
Set(ByVal Value As Decimal)
If Value >= 0 Then '= sign Allows free book at zero price
mdecPrice = Value
Else
Throw New System.Exception
End If
End Set
End Property
#End Region
Đoạn mã lệnh ở trên, ta có sử dụng cặp #Region … End Region để bao lại
đoạn mã trong Property.
PHƯƠNG THỨC (Method)
Phương thức thể hiện các hoạt động của một lớp. Chẳng hạn khi những quyển
sách được bán, ta cần phải tính giá tiền của chúng với giá tiền = Số lượng * Đơn giá.
Phương thức tính số tiền bán 1 loại sách như sau:
#Region "Methods"
Public Function ExtendedPrice() As Decimal
'Calculate extended price as quantity multiplied by price
Return mintQuantity * mdecPrice
End Function
#End Region
KHỞI TẠO ĐỐI TƯỢNG CỦA LỚP
Có 2 cách khởi tạo đối tượng của một lớp:
- Khai báo đối tượng, sau đó khởi tạo đối tượng ở dòng kế tiếp. TT. Visual Basic.NET
Trang 13
TD: Private mBookSale As BookSale 'Khai báo đối tượng
mBookSale = New BookSale 'Khởi tạo đối tượng
- Khai báo và khởi tạo đối tượng trên cùng một dòng.
TD: Private mBookSale As New BookSale
THIẾT KẾ GIAO DIỆN
- Trên Form ta có một menu File với 2 mục: Calculate (Name: mnuCalculate)
để tính toán giá trị của giá tiền, Exit (Name: mnuExit) dùng để thoát khỏi ứng dụng.
- Khai báo một biến đối tượng BookSale (đặt trong phần Windows Form
Designer generated code).
Private mBookSale As BookSale
- Sự kiện mnuCalculate_Click được xử lý:
Private Sub mnuCalculate_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles mnuCalculate.Click
Try
mBookSale = New BookSale 'Instantiate object
'Store values from textboxes to the properties
'of the new object
mBookSale.Title = txtTitle.Text
mBookSale.Quantity = CType(txtQuantity.Text, Integer)
mBookSale.Price = CType(txtPrice.Text, Decimal)
'Calculate and format result
lblEPrice.Text = FormatCurrency(mBookSale.ExtendedPrice)
Catch ex As Exception
'Catch error if Quantity or Price not numeric
MessageBox.Show("Error in Quantity or Price" & _
ControlChars.NewLine & ex.Message, "Data Entry Error", _
MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
End Try
End Sub
- Việc kết thúc ứng dụng được xử lý bằng câu lệnh End.
SHARED VARIABLE
- Nếu chúng ta muốn tính tổng số sách bán ra và tổng giá tiền đã bán ta cần sử
dụng đến biến Shared.
- Một thành viên được gọi là Shared có nghĩa là thành viên đó được dùng
chung cho tất cả các đối tượng của lớp đó. Bên cạnh đó ta có thể truy cập đến chúng
không cần thông qua các đối tượng của lớp.
txtTitle
txtQuantity
txtPrice
lblEPrice TT. Visual Basic.NET
Trang 14
- Cú pháp khai báo biến Shared:
[Public | Private] Shared VariableName As Datatype
- Chẳng hạn, ta cần khai báo các biến Shared trong lớp BookSale để lưu tổng
số sách bán ra và tổng giá tiền đã bán:
'Hold the SalesTotal property
Private Shared mdecSalesTotal As Decimal
'Hold the SalesCount property
Private Shared mintSalesCount As Integer
- Đồng thời lúc đó ta cũng khai báo 2 thuộc tính cho 2 biến Shared ở trên với để
ý rằng chúng là chỉ đọc (ReadOnly):
Shared ReadOnly Property SalesTotal() As Decimal
Get
SalesTotal = mdecSalesTotal
End Get
End Property
Shared ReadOnly Property SalesCount() As Integer
Get
SalesCount = mintSalesCount
End Get
End Property
- Phương thức tính tổng giá bán được sửa lại như sau:
Public Function ExtendedPrice() As Decimal
Dim decExtendedPrice As Decimal
'Calculate extended price as quantity times price
decExtendedPrice = mintQuantity * mdecPrice
'Add the extended price to the total
'and add 1 to the count of sales made
mdecSalesTotal += decExtendedPrice
mintSalesCount += 1
Return decExtendedPrice
End Function
THIẾT KẾ LẠI FORM
- Thêm mục Summary (Name: mnuSum) vào menu File để tính tổng sách và
tổng số tiền thu được. Sự kiện mnuSum_Click được xử lý:
Private Sub mnuSum_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles mnuSum.Click
'Display sales summary information
Dim strMessage As String
strMessage = "Sales Total: " & _
FormatCurrency(mBookSale.SalesTotal) & _
ControlChars.NewLine & "Sales Count: " & _
mBookSale.SalesCount.ToString
MessageBox.Show(strMessage, "Summary Information", _
MessageBoxButtons.OK, MessageBoxIcon.Information)
End Sub
- Thêm một CheckBox vào Form. Giả sử, đôi lúc cửa hàng sách giảm giá cho
một số khách hàng nào đó, việc giảm giá thể hiện bằng một giá trị Boolean (True nếu
giảm giá, False và ngược lại).
- Giả sử ta cần giảm giá 20% cho một số khách hàng nào đó.
Public Class BookSale
Private mstrTitle As String
Private mintQuantity As Integer
Private mdecPrice As Decimal TT. Visual Basic.NET
Trang 15
'Variables to accumulate sales total and count
Private Shared mdecSalesTotal As Decimal
Private Shared mintSalesCount As Integer
'Variable for the check box and constant for the discount rate
Private mblnDiscount As Boolean
Private Const msngDISCOUNT_RATE As Single = 0.2
- Giá trị Discount = True nếu là giảm giá.
- Property DisCount: gồm 2 phương thức Set & Get
Property Discount() As Boolean
Get
Discount = mblnDiscount
End Get
Set(ByVal Value As Boolean)
mblnDiscount = Value
End Set
End Property
- Hàm tính số tiền giảm: DisCountAmount:
Public Function DiscountAmount() As Decimal
'Calculate discounted price
Dim decDiscountAmount As Decimal
If mblnDiscount Then
decDiscountAmount = CDec(mintQuantity) * mdecPrice * _
CType(msngDISCOUNT_RATE, Decimal)
Else 'No discount given
decDiscountAmount = 0D
End If
Return decDiscountAmount
End Function
- Hàm NetDue: tính số tiền thực sự phải trả, số tiền này = Tổng số tiền – Số tiền
giảm. Lưu ý là khi tính số tiền thực sự phải trả ta cần cập nhật lại các thuộc tính dùng
chung (Shared).
Public Function NetDue() As Decimal
'Calculate discounted price
Dim decNetDue As Decimal
decNetDue = ExtendedPrice() - DiscountAmount()
'Add the new due amount to the total
'and add 1 to the count of sales made
mdecSalesTotal += decNetDue
mintSalesCount += 1
Return decNetDue
End Function
- Hàm ExtendedPrice:
Public Function ExtendedPrice() As Decimal
Dim decExtendedPrice As Decimal
'Calculate extended price as quantity times price
decExtendedPrice = mintQuantity * mdecPrice
Return decExtendedPrice
End Function
- Sự kiện mnuCalculate_Click được xử lý lại:
Try
'Instantiate new booksale class instance
mBookSale = New BookSale
'Store from textboxes to new booksale class instance
mBookSale.Title = txtTitle.Text TT. Visual Basic.NET
Trang 16
mBookSale.Quantity = CType(txtQuantity.Text, Integer)
mBookSale.Price = CType(txtPrice.Text,Decimal)
mBookSale.Discount = chkDis.Checked
'Calculate and display result
lblEPrice.Text = FormatCurrency(mBookSale.ExtendedPrice)
lblDis.Text = FormatCurrency(mBookSale.DiscountAmount)
lblNetDue.Text = FormatCurrency(mBookSale.NetDue)
txtPrice.Text = FormatCurrency(txtPrice.Text)
Catch ex As Exception
'Catch error if Quantity or Price not numeric
MessageBox.Show("Error in Quantity or Price" & _
ControlChars.NewLine & ex.Message, "Data Entry Error", _
MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
End Try
- Thực thi ứng dụng, ta có thể nhận được kết quả:
PHƯƠNG THỨC XÂY DỰNG (CONSTRUCTOR) & HỦY (DESTRUCTOR)
CONSTRUCTOR
- Đây là phương thức được gọi khi đối tượng được khởi tạo, phương thức này
có tên là New và ta có thể Overload phương thức này.
- Mở lại mã lệnh của lớp BookeSale và thêm vào 2 phương thức xây dựng.
Sub New()
'Constructor for class
'Place initialization statements here
End Sub
Sub New(ByVal Title As String, ByVal Quantity As Integer, _
ByVal Price As Decimal, ByVal Discount As Boolean)
'Assign property values
Me.Title = Title
Me.Quantity = Quantity
Me.Price = Price
Me.Discount = Discount
End Sub
- Khởi tạo lại đối tượng mBookSale của lớp BookSale bằng cách sử dụng
phương thức xây dựng có tham số. Điều này được thực hiện bằng cách sửa lại thủ tục
mnuCalculate_Click:
Try TT. Visual Basic.NET
Trang 17
'Instantiate new booksale class instance
mBookSale = New BookSale(txtTitle.Text, CType(txtQuantity.Text, _
Integer), CType(txtPrice.Text, Decimal), chkDis.Checked)
'Calculate and display result
lblEPrice.Text = FormatCurrency(mBookSale.ExtendedPrice)
lblDis.Text = FormatCurrency(mBookSale.DiscountAmount)
lblNetDue.Text = FormatCurrency(mBookSale.NetDue)
txtPrice.Text = FormatCurrency(txtPrice.Text)
Catch ……
- Thực thi chương trình và kiểm tra kết quả.
INHERITANCE (THỪA KẾ)
- Thiết kế lớp StudentBookSale thừa kế từ lớp BookSale. Lớp này thừa kế tất cả
các thành viên của lớp BookSale, vì vậy các thành viên là Private của lớp BookSale
cần được đặt lại là Protected.
- Lớp StudentBookSale có thêm một thuộc tính mang ý nghĩa nếu sinh viên giỏi
thì được giảm giá thêm 15%.
Lớp StudentBookSale:
• Thêm một thuộc tính protected shared mdecDiscountTotal, thuộc tính này
dùng để lưu tổng số tiền giảm (đây là giá trị chỉ đọc Readonly).
• Thêm một hằng msngSTUDENT_DISCOUNT_RATE lưu tỉ lệ giảm là 15%.
• Thêm một thuộc tính Boolean để xác định đó có phải là sinh viên giỏi hay
không?
Public Class StudentBookSale
Inherits BookSale
Protected Shared mdecDiscountTotal As Decimal
Protected mblnStudentDiscount As Boolean
Private Const msngSTUDENT_DISCOUNT_RATE As Single = 0.15
#Region "Properties"
Shared ReadOnly Property DiscountTotal() As Decimal
Get
DiscountTotal = mdecDiscountTotal
End Get
End Property
Property StudentDiscount() As Boolean
Get
StudentDiscount = mblnStudentDiscount
End Get
Set(ByVal Value As Boolean)
mblnStudentDiscount = Value
End Set
End Property
#End Region
End Class
- Mở lại lớp BookSale để sửa đổi lại các thuộc tính là Protected & phương thức
là Overridable.
Protected mstrTitle As String
Protected mintQuantity As Integer
Protected mdecPrice As Decimal
'Hold the SalesTotal property
Protected Shared mdecSalesTotal As Decimal TT. Visual Basic.NET
Trang 18
'Hold the SalesCount property
Protected Shared mintSalesCount As Integer
Protected mblnDiscount As Boolean
Protected Const msngDISCOUNT_RATE As Single = 0.2
Và Public Overridable Function DiscountAmount() As Decimal
- Mở lớp StudentBookSale để thêm vào phương thức DiscountAmount:
Overrides Function DiscountAmount() As Decimal
'Calculate discounted price
Dim decDiscountAmount As Decimal
Dim sngTotalDiscountRate As Single
'Figure out the discount based on the check boxes.
If mblnDiscount Then
sngTotalDiscountRate += msngDISCOUNT_RATE
End If
If mblnStudentDiscount Then
sngTotalDiscountRate += msngSTUDENT_DISCOUNT_RATE
End If
'Compute amount of discount
decDiscountAmount = CType(mintQuantity, Decimal) * mdecPrice * _
CType(sngTotalDiscountRate, Decimal)
Accumulate the amount of discount to the total discount shared variable
mdecDiscountTotal += decDiscountAmount
'Return the amount of discount
Return decDiscountAmount
End Function
- Thêm phương thức xây dựng vào lớp StudentBookSale, phương thức này có 5
tham số trong đó có một tham số xác định đó có phải là sinh viên giỏi hay không?
Sub New()
'Constructor with empty argument list
MyBase.New() 'Call the base class constructor
End Sub
Sub New(ByVal Title As String, ByVal Quantity As Integer, _
ByVal Price As Decimal, ByVal Discount As Boolean, _
ByVal StudentDiscount As Boolean)
'Assign property values
MyBase.New() 'Calls the base class constructor
Me.Title = Title
Me.Quantity = Quantity
Me.Price = Price
Me.Discount = Discount
Me.StudentDiscount = StudentDiscount
End Sub
TT. Visual Basic.NET
Trang 19
XÂY DỰNG LẠI FORM
- Thiết kế Form như sau:
Private Sub mnuCalculate_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles mnuCalculate.Click
Try
'Calculate extended price for sale
'Instantiate correct object and set properties
If chkStu.Checked Then
'This is a student – note the number of arguments in
'the parameter list – there are five of them
mStudentBookSale = _
New StudentBookSale(txtTitle.Text, _
CType(txtQuantity.Text, Integer), _
CType(txtPrice.Text, Decimal), _
chkDis.Checked, chkStu.Checked)
'Calculate and display result
lblEPrice.Text = _
FormatCurrency(mStudentBookSale.ExtendedPrice)
lblDis.Text = _
FormatCurrency(mStudentBookSale.DiscountAmount)
lblNetDue.Text = _
FormatCurrency(mStudentBookSale.NetDue)
txtPrice.Text = FormatCurrency(txtPrice.Text)
Else
'This is not a student – only four arguments in
'the parameter list
mBookSale = New BookSale(txtTitle.Text, _
CType(txtQuantity.Text, Integer), _
CType(txtPrice.Text, Decimal), chkDis.Checked)
'Calculate and display result
lblEPrice.Text = _
FormatCurrency(mBookSale.ExtendedPrice)
lblDis.Text = _ TT. Visual Basic.NET
Trang 20
FormatCurrency(mBookSale.DiscountAmount)
lblNetDue.Text = FormatCurrency(mBookSale.NetDue)
txtPrice.Text = FormatCurrency(txtPrice.Text)
End If
Catch
MessageBox.Show("Error in Quantity or Price", _
"Data Entry Error", MessageBoxButtons.OK, _
MessageBoxIcon.Exclamation)
End Try
End Sub
- Sự kiện mnuSum_Click được xử lý lại để hiển thị giá trị tổng:
Private Sub mnuSum_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles mnuSum.Click
'Display sales summary information
Dim strMessage As String
strMessage = "Sales Total: " & _
FormatCurrency(mBookSale.SalesTotal) & _
ControlChars.NewLine & "Sales Count: " & _
mBookSale.SalesCount.ToString & _
ControlChars.NewLine & _
"Total Student Discounts: " & _
FormatCurrency(mStudentBookSale.DiscountTotal)
MessageBox.Show(strMessage, "Summary Information", _
MessageBoxButtons.OK, MessageBoxIcon.Information)
End Sub
LƯU DỰ ÁN VÀ THỰC THI ỨNG DỤNG TT. Visual Basic.NET
Trang 21
Phần 3
TRUY CẬP CƠ SỞ DỮ LIỆU VỚI
ADO.NET
Trong phần này chúng ta sẽ tìm hiểu cách thức làm việc với ADO.NET. Đây là một
tập hợp các lớp cũng như các giao diện cho phép truy cập dữ liệu trong .NET
Framework. Ở đây ta sẽ sử dụng ADO.NET để nối kết với cơ sở dữ liệu SQL Server,
lấy dữ liệu và hiển thị chúng trên form.
Các bước thực hiện:
1. Trong SQL Server tạo một cơ sở dữ liệu tên là DVDLibrary.
2. Thêm một bảng tên DVDLibrary với cấu trúc như sau (Bảng 4.1):
3. Thêm vài dòng dữ liệu vào bảng.
4. Tạo một ứng dụng WinForrm tên prjDVD.
5. Đổi tên của form chính thành frmDVDCatalog.
6. Thêm một số control vào và sửa đổi một số thuộc tính tương ứng (bảng 4.2) sao
cho ta được giao diện:
TT. Visual Basic.NET
Trang 22
Control Property Value
Form
Name
Text
frmDVDCatalog
DVD Catalog
Label
Name
Text
lblHeading
DVD Catalog
Label
Name
Text
lblDVDCodeNo
DVD Code Number
Label
Name
Text
lblTitle
DVD Title
Label
Name
Text
lblLang
Language
Label
Name
Text
lblPrice
Price
Label
Name
Text
lblDollars
Dollars
GroupBox
Name
Text
grpSubTitles
Subtitles
RadioButton
Name
Text
Checked
radYes
Yes
true
RadioButton
Name
Text
Checked
radNo
No
false
ComboBox
Name
Collection
cboLang
English
Spanish
French
Chinese
Russian
NumericUpDown
Name
Maximum
Minimum
Value
updPrice
150
5
5
TextBox
Name
ReadOnly
Text
txtCodeNo
true
TextBox
Name
Text
txtTitle
Button
Name
Text
btnAddNew
AddNew
Button
Name
Text
btnSave
Save
Button
Name
Text
btnExit
Exit
7. Chuyển sang cửa sổ Code View, tham chiếu đến một số không gian tên:
Imports System.Data
Imports System.Data.SqlClient;
8. Khai báo những biến sau trong phần khai báo của form: TT. Visual Basic.NET
Trang 23
Private conn As SqlConnection
Private commd As SqlCommand
Private sqlstr, lang As String
Private codeno, subtitles As Integer
Dim price As Decimal
9. Viết đoạn mã sau vào phương thức xử lý sự kiện Load của form:
Try
conn = New SqlConnection("Server=.;” & _
”Initial Catalog=DVDLibrary;User
Id=user;pwd=user;")
commd = new SqlCommand("Select * From
DVDLibrary",conn)
conn.Open()
btnSave.Enabled = False
Catch (ex As Exception)
MessageBox.Show(ex.Message + ex.StackTrace)
End Try
10. Khi button AddNew được click, một đối tượng SQLCommand được tạo ra
thực hiện câu truy vấn lấy về mã số lớn nhất của DVD Code No từ bảng from the
DVDLibrary. Nếu bảng rỗng, một ngoại lệ được tạo ra. Vì thws ta phải bẫy lại
ngoại lệ này nhằm kiểm tra khả năng bảng rỗng (lúc đói giá trị của biến codeno
được gán là 0). Sau đó giá trị của codeno tăng 1 để có giá trị hiện hành của
codeno. Kế tiếp các trường của form được xóa trắng nhờ vào việc gọi thực thi
phương thức ResetFields() để một mẩu tin mới được thêm vào và kích hoạt
button Save.
Sự kiện btnAddNew_Click:
//calculate new Code
commd = new SqlCommand("Select max(DVDCodeNo) From DVDLibrary", _
conn)
Try
codeno = CType(commd.ExecuteScalar(), Integer)
btnAddNew.Enabled = False
btnSave.Enabled=True
Catch(ex As Exception)
codeno=0
MessageBox.Show(ex.Message)
End Try
codeno = codeno + 1
txtCodeNo.Text = codeno.ToString()
ResetFields()
11. Sự kiện Click của button btnExit được xử lý để đóng lại nối kết dữ liệu và
kết thúc ứng dụng:
conn.Close()
End
12. Sự kiện btnSave_Click nhằm thêm một dòng dữ liệu mới vào bảng. Bởi vì
đây không phải là một câu truy vấn lấy về dữ liệu mà là một câu truy vấn hành
động nên ta sử dụng phương thức ExecuteNonQuery của lớp SQLCommand: TT. Visual Basic.NET
Trang 24
Try
sqlstr = "Insert Into DVDLibrary Values(" & _
codeno.ToString() & ",'" & txtTitle.Text & "', '" & _
lang + "'," & subtitles.ToString() & _
"," & price.ToString() & ")"
MessageBox.Show(sqlstr)
commd = New SqlCommand(sqlstr,conn)
commd.ExecuteNonQuery()
MessageBox.Show("Record has been add successfully")
ResetFields()
btnExit.Focus()
btnAddNew.Enabled = True
btnSave.Enabled=False
Catch(ex As Exception)
MessageBox.Show(ex.Message + ex.StackTrace)
End Try
13. Sự kiện ValueChanged của NumericUpDown được xử lý:
price = updPrice.Value
14. Sự kiện SelectedIndexChanged của ComboBox được xử lý:
lang = cboLang.SelectedItem.ToString()
15. Sự kiện CheckedChanged của RadioButton được xử lý:
radYes_CheckedChanged
subtitles = 1
radNo_CheckedChanged
subtitles = 0;
16. Đoạn mã cho phương thức ResetFields:
Private Sub ResetFields()
txtTitle.Text = ""
price = updPrice.Value=5
lang=cboLang.Items[0].ToString()
cboLang.Text = ""
radYes.Checked = True
radNo.Checked= False;
btnSave.Enabled=True
End Sub
17. Lưu, biên dịch và thực thi dự án. Một thí dụ mẫu cho việc thêm vào một
mẩu tin như trong hình 4.3:
TT. Visual Basic.NET
Trang 25
Trang 1
Phần 1
LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
VISUAL BASIC.NET
1) Viết chương trình hiển thị câu thông báo “Hello World!!!” lên màn hình.
2) Viết chương trình nhận một chuỗi ký tự từ bàn phím. Kiểm tra chuỗi có đối xứng
hay không? (TD: DBGBD - Chuỗi đối xứng; DBGB - Chuỗi không đối xứng).
3) Bảng dưới đây là các khóa tin học chứng chỉ A, B của khoa Công Nghệ Thông Tin:
TT Khóa học Học Phí Thời gian
1 Chứng chỉ A - Tin Học Văn Phòng 400.000 2 tháng
2 Chứng chỉ B - Visual Basic 350.000 1.5 tháng
3 Chứng chỉ B - Access 450.000 2 tháng
* Ghi chú: Đối tượng là sinh viên được giảm 10%
.
Viết chương trình mô phỏng việc đóng học phí của học viên. Người sử dụng
chương trình đầu tiên sẽ chọn loại chứng chỉ mà họ muốn đăng ký học (nhập từ bàn
phím ký tự A hay B); nếu chọn B, người dùng sẽ phải cho biết họ sẽ đăng ký học lớp
Visual Basic (nhập vào VB) hay Access (nhập vào AC). Sau khi thông tin về khóa học
đã được ghi nhận, một thông tin quan trọng khác là đối tượng đăng ký có phải là sinh
viên hay không (nếu có nhập vào C ngược lại K).
Tính tiền mà học viên phải trả.
Thí dụ:
Bạn muốn đăng ký học chứng chỉ A hay B: B
Bạn học lớp Visual Basic (VB) hay Access (Ac): AC
Bạn có là sinh viên không? C
Số tiền bạn phải trả là: 405000 đồng
4) Tạo lớp Con người với 2 thuộc tính là họ tên và ngày sinh để lấy về hay gán tên
cùng ngày sinh của một người cụ thể. Thiết kế lớp nhân viên kế thừa từ lớp con người,
lớp này có thêm 2 thuộc tính là ngày bắt đầu làm việc và tiền lương mỗi tháng.
Viết thủ tục Main cho phép tạo một đối tượng thuộc lớp nhân viên. Nhập từ bàn
phím các giá trị: họ tên, ngày sinh, ngày bắt đầu làm việc, tiền lương. Hiển thị lại các
kết quả đã nhập.
5) Một cửa hàng sách cần quản lý thông tin về các loại sách sẽ bán của mình. Một số
thông tin cần quản lý là: tên sách, số lượng, giá bán. Hãy thiết kế lớp sách bán cho
phép có những thuộc tính (có chỉ thị truy cập là Public) là các thông tin trên. Ngoài các
thuộc tính lớp nên có phương thức tính tiền dựa vào số lượng sách và giá bán mỗi
quyển. TT. Visual Basic.NET
Trang 2
Thí dụ: Quyển Mật mã của Da Vinci bán cho 1 khách hàng là 20 quyển, giá
bán 1 quyển là 99000đ. Vậy số tiền phải trả là 1.980.000 đ.
Viết thủ tục Main cho phép tạo một đối tượng sách bán và nhập từ bàn phím tên
sách bán, số lượng và giá bán mỗi quyển. Tính tiền phải trả.
6) Hằng năm, đến mùa khai trường; cửa hàng sách bán giảm giá 10% cho đối tượng là
sinh viên học sinh.
Thiết kế lớp sách bán cho sinh viên, lớp này kế thừa từ lớp sách bán ở câu 2;
bên cạnh đó lớp này còn có 1 thành viên kiểu Boolean cho biết đó có phải là sinh viên
hay không? Dĩ nhiên, phương thức tính tiền của lớp dẫn xuất này phải được thiết kế
lại: nếu là sinh viên thì giá bán giảm 10%, ngược lại sách được bán với giá gốc; để ý
rằng phương thức tính tiền của lớp con (sách bán cho sinh viên) sẽ ghi đè phương thức
tính tiền của lớp cơ sở (sách bán).
Viết thủ tục Main cho phép tạo một đối tượng sách bán cho sinh viên và nhập
từ bàn phím tên sách bán, số lượng, giá bán, người mua có là sinh viên hay không?
Tính tiền phải trả.
7) Thiết kế lớp Điểm trong không gian 2 chiều gồm 2 thuộc tính là tọa độ X & tọa độ
Y (2 thuộc tính có chỉ thị truy cập là Public).
- 2 phương thức xây dựng: một không có tham số (gán X, Y là 0), một có tham
số (cặp (X1,Y1) có sẵn để gán cho X,Y).
- Phương thức hiển thị tọa độ của điểm lên màn hình.
- Sử dụng Overload phương thức để tạo 2 phương thức tính khoảng cách từ
điểm hiện thời đến 1 điểm khác, một không tham số (tính khoảng cách đến gốc tọa
độ), một có tham số là một điểm khác (tính khoảng cách đến điểm này).
Viết thủ tục Main cho phép khởi tạo 3 điểm A, B, C và nhập tọa độ 3 điểm từ
bàn phím. Hiển thị tọa độ 3 điểm lên màn hình. Tính độ dài AB, BC, AC. Nếu AB,
BC, AC tạo thành tam giác, hãy tính diện tích tam giác ABC.
![ Cool](https://illiweb.com/fa/i/smiles/icon_cool.gif)
chiều ở câu 4, bên cạnh đó lớp mới có thêm thuộc tính là tọa độ trên trục Oz.
- Viết phương thức xây dựng cho lớp điểm trong không gian 3 chiều. Phương
thức này có 3 tham số là tọa độ X, Y, Z trong đó cặp (X, Y) sẽ được dùng để gọi đến
phương thức xây dựng có tham số của lớp điểm trong không gian 2 chiều.
- Sử dụng ghi đè phương thức để viết lại phương thức hiển thị tọa độ của điểm
trong không gian 3 chiều lên màn hình.
- Viết thủ tục Main cho phép nhập từ bàn phím các giá trị (X1,Y1,Z1) và khởi
tạo điểm M trong không gian 3 chiều là các tọa độ này. Gọi phương thức hiển thị để
hiển thị các tọa độ vừa nhập. TT. Visual Basic.NET
Trang 3
Phần 2
ỨNG DỤNG WINDOWS FORMS
PHẦN 1: Làm quen với môi trường VBNET
o Khởi động VBNET - Chọn Start và xác định thư mục Microsoft Visual
Studio.NET.
Màn hình đầu tiên của Visual Studio.NET IDE có dạng:
o Click New Project. Dự án đầu tiên của chúng ta là Visual Basic Project thuộc
kiểu Windows Application như hình dưới:
Xác lập tên dự án: MyName.
Chỉ ra nơi lưu dự án này. Chẳng hạn hình bên dưới là ổ đĩa A: và thư mục tên là
MyName.
Chúng ta không cần tạo thư mục trước. VB.NET sẽ tạo thư mục khi ta Click
chọn nút OK trong cửa sổ tạo dự án mới. TT. Visual Basic.NET
Trang 4
Môi trường phát triển tích hợp (IDE)
o Sau khi tạo dự án mới ta nhận được cửa sổ như hình dưới:
Nếu IDE của ta không như hình trên, ta có thể xác lập lại các thông số mặc định
cho bằng cách chọn Tools/Options/chọn Reset Windows Layout như hình:
TT. Visual Basic.NET
Trang 5
Dự án đầu tiên, cũng với dự án ở bài trên
Thiết kế Form
Đặt các điều khiển Label và Button trên form như hình dưới. Ta có thể thực
hiện bằng cách chọn chúng trong Toolbox và kéo thả lên form hay bằng cách
double_click chúng trong Toolbox.
Thay đổi kích thước của điều khiển và form cho phù hợp
1: Name: frmMyName; Text: MyName Project; Start Position: Center Screen
2: Name: lblMyName; Border Style: Fixed Single
3: Name: btnClickMe; Text: Click Me
4: Name: btnExit; Text: Exit
Start up object (Đối tượng khởi động)
Khi một dự án có nhiều hơn một form, chúng ta cần phải xác lập Start up
object của dự án. Ngoài ra chúng ta cũng nên phải xác lập lại thông số này mỗi khi
chúng ta thay đổi thuộc tính Name của một đối tượng Form. Thử suy nghĩ xem tại sao
ta phải làm như vậy?
2
1
3 4TT. Visual Basic.NET
Trang 6
Xác lập đối tượng khởi động bằng cách nhấp chuột phải vào dự án MyName
trong cửa sổ Solution Explorer (như hình).
Lưu và thực thi dự án
Để lưu dự án, ta chọn File/Save All (lưu tất cả các tập tin hay Save- lưu từng
tập tin).
Có một số cách để thực thi dự án: Chọn mục Debug/Start trên menu hay đơn
giản là bấm phím F5.
Viết mã lệnh
Giả sử khi chương trình được thực thi, mỗi khi người dùng nhấp chọn vào nút
Click Me. Lúc đó tên của ta sẽ xuất hiện trên điều khiển nhãn lblMyName. Hay khi họ
nhấp chọn Exit, chương trình kết thúc.
Khi người dùng nhấp chọn vào nút nhấn, lúc đó ta nói có sự kiện (event) xảy ra,
sự kiện đó là sự kiện Click và đối tượng nhận biết sự kiện đó là nút nhấn tương ứng.
Nếu chúng ta muốn thực thi các thao tác được mô tả ở trên, chúng ta phải viết mã lệnh
tương ứng. Đoạn mã lệnh đó gọi là đáp ứng sự kiện (event handler).
Chú thích trong VBNET
Chú thích giúp cho mã lệnh được rõ ràng, dễ tham chiếu về sau hơn. Điều này
rất có ích trong trường hợp mã lệnh của chương trình khá lớn.
Trong VBNET, việc chú thích được đặt sau từ REM hay sau dấu ‘. Chẳng hạn
như:
REM Programmer: Lam Hoai Bao
' Date Programmed: 12/09/2005
REM Program name: MyName
Để có thể viết được các chú thích trên trong dự án, ta chuyển sang cửa sổ mã
lệnh như trong hình:
TT. Visual Basic.NET
Trang 7
Gán trị cho điều khiển bằng mã lệnh
Sử dụng: Object.Property = Value
Nếu ta muốn gán họ và tên của chúng ta cho điều khiển nhãn lblMyName (giá
trị đó được lưu trữ trong thuộc tính Text), ta sử dụng:
lblMyName.Text = "Lâm Hoài Bảo"
Thực thi phương thức của một điều khiển
Sử dụng: Object.Method(<Các tham số - nếu có>)
Chẳng hạn, để đóng form frmMyName ta sử dụng phương thức Close()
frmMyName.Close()
Đáp ứng sự kiện:
Để có thể đáp ứng sự kiện Click ở trên, trong cửa sổ thiết kế (View Designer),
ta double click lên nút nhấn cần thiết, cửa sổ mã lệnh hiển thị như hình:
Nhấp chọn Form hay Code
Chọn View Code
Chọn View Designer TT. Visual Basic.NET
Trang 8
VBNET tạo ra 1 chương trình con bắt đầu bằng Private Sub và kết thúc bởi End
Sub. Mỗi chương trình con có một tên. Đối với chương trình con dùng để đáp ứng sự
kiện của 1 điều khiển, chương trình con đáp ứng sự kiện sẽ có tên là: Tên điều khiển
+ Tên sự kiện.
Ví dụ: Đối với nút nhấn btnClickMe ở trên, ta có chương trình con
btnClickMe_Click.
Lưu ý: Chương trình con đáp ứng sự kiện có thể có tham số.
Yêu cầu:
9 Viết các chú thích được mô tả như trên.
9 Viết mã lệnh đáp ứng sự kiện Click của các nút nhấn.
9 Lưu dự án và thực thi chương trình.
9 Đóng dự án lại và thoát khỏi Visual Studio.NET.
PHẦN 2: Tính toán học phí sinh viên
Trong phần này chúng ta sẽ tính toán học phí của các sinh viên trong trường đại học và
ghi nhận lại kết quả tổng.
Đầu vào: Người dùng hệ thống nhập dữ liệu vào các ô nhập. Chương trình sẽ lưu các
giá trị dưới dạng các biến.
Xử lý: Dựa vào các biến, chương trình sẽ tính toán giá trị kết quả, lưu vào trong các
biến kết quả. TT. Visual Basic.NET
Trang 9
Đầu ra: Kết quả sẽ được hiển thị trong các điều khiển nhãn. Mỗi lần tính toán cần ghi
nhận lại tổng số tiền miễn giảm và tổng số sinh viên đã nhập vào hệ thống.
Chuẩn bị:
Tạo giao diện như trên, viết các khai báo sau trong phần khai báo của Form
‘ Hằng số lưu tỉ lệ miễn giảm (mặc định là 20%)
Const Tilegiam As Single = 0.2F
'Cac bien lưu số lượng sinh viên, tổng số tiền giảm
Dim SoSV As Integer = 0
Dim TongGiam As Decimal = 0.0
Xử lý sự kiện Form_Load()
Ban đầu khi Form được hiển thị button Tính toán được kích hoạt, ngược lại là
Button Xóa. Lý do là button Xóa nhằm xác lập người dùng hệ thống xóa trắng các ô
nhập và các o kết quả mỗi khi muốn nhậpvào người mới. Do đó, button Xóa chỉ được
kích hoạt sau khi ta đã tính toán giá trị của 1 người.
Me.btnTinh.Enabled = True
Me.btnXoa.Enabled = False
Xử lý sự kiện Click chuột vào Button Tính toán:
- Khai báo biến lưu số tín chỉ, số tiền 1 tín chỉ, tổng học phí, số tiền giảm (=
tổng học phí*20%), số tiền phải đóng.
- Đưa các giá trị của biến tổng học phí, số tiền giảm, số tiền phải đóng hiển thị
lên các điều khiển nhãn.
- Đếm tăng số lượng sinh viên, tổng số tiền miễn giảm của các học sinh; đặt các
kết quả này lên các điều khiển nhãn tương ứng.
Private Sub btnTinh_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles btnTinh.Click
‘ Khai báo các biến cục bộ
Dim SoTienGiam As Decimal
Dim SoTinChi As Integer, HocPhi_TC As Decimal
Dim HocPhi As Decimal, SoTien As Decimal
‘ Lưu các giá trị nhập vào biến
SoTinChi = CInt(txtSTC.Text)
HocPhi_TC = CDec(txtHPTC.Text)
‘ Tính toán số tiền
HocPhi = HocPhi_TC * SoTinChi
SoTienGiam = HocPhi * Tilegiam
SoTien = HocPhi – SoTienGiam
' Tinh tong cong
SoSV = SoSV + 1
TongGiam = TongGiam + SoTienGiam
' Dat gia tri vao cac o nhan
Me.lblGiam.Text = FormatCurrency(SoTienGiam, 2)
Me.lblTongHP.Text = FormatCurrency(HocPhi, 2)
Me.lblHPDong.Text = FormatCurrency(SoTien, 2)
Me.lblSoSV.Text = CStr(SoSV)
Me.lblTongGiam.Text = FormatCurrency(TongGiam, 2)
' Dat lai trang thai của Button
Me.btnXoa.Enabled = True
Me.btnTinh.Enabled = False
End Sub TT. Visual Basic.NET
Trang 10
Xử lý sự kiện Click của Button Xóa:
- Xóa trắng các ô nhập và các ô kết quả.
- Đặt lại trạng thái của Button Tính toán và Xóa.
- Ô nhập họ tên nhận được tiêu điểm (sẵn sàng được kích hoạt) .
Private Sub btnXoa_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles btnXoa.Click
Me.txtHPTC.Clear()
Me.txtHT.Clear()
Me.txtSTC.Clear()
Me.lblTongHP.Text = ""
Me.lblHPDong.Text = ""
Me.lblGiam.Text = ""
Me.txtHT.Focus()
Me.btnTinh.Enabled = True
Me.btnXoa.Enabled = False
End Sub
Bẫy lỗi:
Điều gì sẽ xảy ra nếu người dùng hệ thống nhập vào các ô nhập không phải là
các giá trị số?
Để giải quyết ta sử dụng cấu trúc bẫy lỗi Try … Catch bao quanh mã lệnh chỗ
chuyển đổi dữ liệu từ chuỗi sang số và ngược lại.
Chẳng hạn:
Try
SoTinChi = CInt(txtSTC.Text)
HocPhi_TC = CDec(txtHPTC.Text)
HocPhi = HocPhi_TC * SoTinChi
SoTienGiam = HocPhi * Tilegiam
SoTien = HocPhi - SoTienGiam
' Tinh tong cong
SoSV = SoSV + 1
TongGiam = TongGiam + SoTienGiam
' Dat gia tri vao cac o nhan
Me.lblGiam.Text = FormatCurrency(SoTienGiam, 2)
Me.lblTongHP.Text = FormatCurrency(HocPhi, 2)
Me.lblHPDong.Text = FormatCurrency(SoTien, 2)
Me.lblSoSV.Text = CStr(SoSV)
Me.lblTongGiam.Text = FormatCurrency(TongGiam, 2)
' Dat lai trang thai
Me.btnXoa.Enabled = True
Me.btnTinh.Enabled = False
Catch
MessageBox.Show("Học phí hoặc số tín chỉ không hợp lệ!", _
"Dữ liệu lỗi", MessageBoxButtons.OK, MessageBoxIcon.Warning)
End Try
Hãy thêm vào một điều khiển nhãn tính số tiền giảm trung bình của 1 sinh viên, khi
tính toán tính luôn giá trị này và hiển thị kết quả.
Cuối cùng, xử lý cho sự kiện Click vào Button Thoát để chấm dứt chương trình.
TT. Visual Basic.NET
Trang 11
PHẦN 3: LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG & WINDOWS
FORMS
Bài tập này tập trung vào việc thiết kế một lớp để lưu thông tin về các loại sách bán
của một cửa hiệu. Mỗi cuốn sách có 3 thuộc tính: Title (tựa), Quantity (số lượng), Giá
bán (Price).
Tạo một dự án mới kiểu WinForm
Thêm một lớp vào dự án nhờ chọn Project menu-Add Class.
THUỘC TÍNH (PROPERTY)
- Thiết kế lớp có các thuộc tính lưu thông tin: tựa sách, số lượng, giá.
Option Strict On
Public Class BookSale
Private mstrTitle As String
Private mintQuantity As Integer
Private mdecPrice As Decimal
'. . . Property declarations go here
End Class
PHƯƠNG THỨC PROPERTY
Để các thuộc tính trên có thể truy cập từ bên ngoài ta phải định nghĩa các
phương thức Property. Trường hợp tổng quát, các phương thức cho mỗi thuộc tính
đảm bảo cho thuộc tính đó cho phép đọc và ghi dữ liệu (luôn có Set và Get).
Do đó, ta sẽ thêm các phương thức Title, Quantity, Price cho cac thuộc tính tựa,
số lượng, đơn giá. Lưu ý rằng, giá trị của Quantity & Price phải hợp lệ (ta có thể bẫy
bằng cách sử dụng System.Exception). TT. Visual Basic.NET
Trang 12
#Region "Properties"
'. . . Property declarations go here
Property Title() As String
Get
Title = mstrTitle
End Get
Set(ByVal Value As String)
mstrTitle = Value
End Set
End Property
Property Quantity() As Integer
Get
Quantity = mintQuantity
End Get
Set(ByVal Value As Integer)
If Value > 0 Then 'must sell at least one book
mintQuantity = Value
Else
Throw New System.Exception
End If
End Set
End Property
Property Price() As Decimal
Get
Price = mdecPrice
End Get
Set(ByVal Value As Decimal)
If Value >= 0 Then '= sign Allows free book at zero price
mdecPrice = Value
Else
Throw New System.Exception
End If
End Set
End Property
#End Region
Đoạn mã lệnh ở trên, ta có sử dụng cặp #Region … End Region để bao lại
đoạn mã trong Property.
PHƯƠNG THỨC (Method)
Phương thức thể hiện các hoạt động của một lớp. Chẳng hạn khi những quyển
sách được bán, ta cần phải tính giá tiền của chúng với giá tiền = Số lượng * Đơn giá.
Phương thức tính số tiền bán 1 loại sách như sau:
#Region "Methods"
Public Function ExtendedPrice() As Decimal
'Calculate extended price as quantity multiplied by price
Return mintQuantity * mdecPrice
End Function
#End Region
KHỞI TẠO ĐỐI TƯỢNG CỦA LỚP
Có 2 cách khởi tạo đối tượng của một lớp:
- Khai báo đối tượng, sau đó khởi tạo đối tượng ở dòng kế tiếp. TT. Visual Basic.NET
Trang 13
TD: Private mBookSale As BookSale 'Khai báo đối tượng
mBookSale = New BookSale 'Khởi tạo đối tượng
- Khai báo và khởi tạo đối tượng trên cùng một dòng.
TD: Private mBookSale As New BookSale
THIẾT KẾ GIAO DIỆN
- Trên Form ta có một menu File với 2 mục: Calculate (Name: mnuCalculate)
để tính toán giá trị của giá tiền, Exit (Name: mnuExit) dùng để thoát khỏi ứng dụng.
- Khai báo một biến đối tượng BookSale (đặt trong phần Windows Form
Designer generated code).
Private mBookSale As BookSale
- Sự kiện mnuCalculate_Click được xử lý:
Private Sub mnuCalculate_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles mnuCalculate.Click
Try
mBookSale = New BookSale 'Instantiate object
'Store values from textboxes to the properties
'of the new object
mBookSale.Title = txtTitle.Text
mBookSale.Quantity = CType(txtQuantity.Text, Integer)
mBookSale.Price = CType(txtPrice.Text, Decimal)
'Calculate and format result
lblEPrice.Text = FormatCurrency(mBookSale.ExtendedPrice)
Catch ex As Exception
'Catch error if Quantity or Price not numeric
MessageBox.Show("Error in Quantity or Price" & _
ControlChars.NewLine & ex.Message, "Data Entry Error", _
MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
End Try
End Sub
- Việc kết thúc ứng dụng được xử lý bằng câu lệnh End.
SHARED VARIABLE
- Nếu chúng ta muốn tính tổng số sách bán ra và tổng giá tiền đã bán ta cần sử
dụng đến biến Shared.
- Một thành viên được gọi là Shared có nghĩa là thành viên đó được dùng
chung cho tất cả các đối tượng của lớp đó. Bên cạnh đó ta có thể truy cập đến chúng
không cần thông qua các đối tượng của lớp.
txtTitle
txtQuantity
txtPrice
lblEPrice TT. Visual Basic.NET
Trang 14
- Cú pháp khai báo biến Shared:
[Public | Private] Shared VariableName As Datatype
- Chẳng hạn, ta cần khai báo các biến Shared trong lớp BookSale để lưu tổng
số sách bán ra và tổng giá tiền đã bán:
'Hold the SalesTotal property
Private Shared mdecSalesTotal As Decimal
'Hold the SalesCount property
Private Shared mintSalesCount As Integer
- Đồng thời lúc đó ta cũng khai báo 2 thuộc tính cho 2 biến Shared ở trên với để
ý rằng chúng là chỉ đọc (ReadOnly):
Shared ReadOnly Property SalesTotal() As Decimal
Get
SalesTotal = mdecSalesTotal
End Get
End Property
Shared ReadOnly Property SalesCount() As Integer
Get
SalesCount = mintSalesCount
End Get
End Property
- Phương thức tính tổng giá bán được sửa lại như sau:
Public Function ExtendedPrice() As Decimal
Dim decExtendedPrice As Decimal
'Calculate extended price as quantity times price
decExtendedPrice = mintQuantity * mdecPrice
'Add the extended price to the total
'and add 1 to the count of sales made
mdecSalesTotal += decExtendedPrice
mintSalesCount += 1
Return decExtendedPrice
End Function
THIẾT KẾ LẠI FORM
- Thêm mục Summary (Name: mnuSum) vào menu File để tính tổng sách và
tổng số tiền thu được. Sự kiện mnuSum_Click được xử lý:
Private Sub mnuSum_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles mnuSum.Click
'Display sales summary information
Dim strMessage As String
strMessage = "Sales Total: " & _
FormatCurrency(mBookSale.SalesTotal) & _
ControlChars.NewLine & "Sales Count: " & _
mBookSale.SalesCount.ToString
MessageBox.Show(strMessage, "Summary Information", _
MessageBoxButtons.OK, MessageBoxIcon.Information)
End Sub
- Thêm một CheckBox vào Form. Giả sử, đôi lúc cửa hàng sách giảm giá cho
một số khách hàng nào đó, việc giảm giá thể hiện bằng một giá trị Boolean (True nếu
giảm giá, False và ngược lại).
- Giả sử ta cần giảm giá 20% cho một số khách hàng nào đó.
Public Class BookSale
Private mstrTitle As String
Private mintQuantity As Integer
Private mdecPrice As Decimal TT. Visual Basic.NET
Trang 15
'Variables to accumulate sales total and count
Private Shared mdecSalesTotal As Decimal
Private Shared mintSalesCount As Integer
'Variable for the check box and constant for the discount rate
Private mblnDiscount As Boolean
Private Const msngDISCOUNT_RATE As Single = 0.2
- Giá trị Discount = True nếu là giảm giá.
- Property DisCount: gồm 2 phương thức Set & Get
Property Discount() As Boolean
Get
Discount = mblnDiscount
End Get
Set(ByVal Value As Boolean)
mblnDiscount = Value
End Set
End Property
- Hàm tính số tiền giảm: DisCountAmount:
Public Function DiscountAmount() As Decimal
'Calculate discounted price
Dim decDiscountAmount As Decimal
If mblnDiscount Then
decDiscountAmount = CDec(mintQuantity) * mdecPrice * _
CType(msngDISCOUNT_RATE, Decimal)
Else 'No discount given
decDiscountAmount = 0D
End If
Return decDiscountAmount
End Function
- Hàm NetDue: tính số tiền thực sự phải trả, số tiền này = Tổng số tiền – Số tiền
giảm. Lưu ý là khi tính số tiền thực sự phải trả ta cần cập nhật lại các thuộc tính dùng
chung (Shared).
Public Function NetDue() As Decimal
'Calculate discounted price
Dim decNetDue As Decimal
decNetDue = ExtendedPrice() - DiscountAmount()
'Add the new due amount to the total
'and add 1 to the count of sales made
mdecSalesTotal += decNetDue
mintSalesCount += 1
Return decNetDue
End Function
- Hàm ExtendedPrice:
Public Function ExtendedPrice() As Decimal
Dim decExtendedPrice As Decimal
'Calculate extended price as quantity times price
decExtendedPrice = mintQuantity * mdecPrice
Return decExtendedPrice
End Function
- Sự kiện mnuCalculate_Click được xử lý lại:
Try
'Instantiate new booksale class instance
mBookSale = New BookSale
'Store from textboxes to new booksale class instance
mBookSale.Title = txtTitle.Text TT. Visual Basic.NET
Trang 16
mBookSale.Quantity = CType(txtQuantity.Text, Integer)
mBookSale.Price = CType(txtPrice.Text,Decimal)
mBookSale.Discount = chkDis.Checked
'Calculate and display result
lblEPrice.Text = FormatCurrency(mBookSale.ExtendedPrice)
lblDis.Text = FormatCurrency(mBookSale.DiscountAmount)
lblNetDue.Text = FormatCurrency(mBookSale.NetDue)
txtPrice.Text = FormatCurrency(txtPrice.Text)
Catch ex As Exception
'Catch error if Quantity or Price not numeric
MessageBox.Show("Error in Quantity or Price" & _
ControlChars.NewLine & ex.Message, "Data Entry Error", _
MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
End Try
- Thực thi ứng dụng, ta có thể nhận được kết quả:
PHƯƠNG THỨC XÂY DỰNG (CONSTRUCTOR) & HỦY (DESTRUCTOR)
CONSTRUCTOR
- Đây là phương thức được gọi khi đối tượng được khởi tạo, phương thức này
có tên là New và ta có thể Overload phương thức này.
- Mở lại mã lệnh của lớp BookeSale và thêm vào 2 phương thức xây dựng.
Sub New()
'Constructor for class
'Place initialization statements here
End Sub
Sub New(ByVal Title As String, ByVal Quantity As Integer, _
ByVal Price As Decimal, ByVal Discount As Boolean)
'Assign property values
Me.Title = Title
Me.Quantity = Quantity
Me.Price = Price
Me.Discount = Discount
End Sub
- Khởi tạo lại đối tượng mBookSale của lớp BookSale bằng cách sử dụng
phương thức xây dựng có tham số. Điều này được thực hiện bằng cách sửa lại thủ tục
mnuCalculate_Click:
Try TT. Visual Basic.NET
Trang 17
'Instantiate new booksale class instance
mBookSale = New BookSale(txtTitle.Text, CType(txtQuantity.Text, _
Integer), CType(txtPrice.Text, Decimal), chkDis.Checked)
'Calculate and display result
lblEPrice.Text = FormatCurrency(mBookSale.ExtendedPrice)
lblDis.Text = FormatCurrency(mBookSale.DiscountAmount)
lblNetDue.Text = FormatCurrency(mBookSale.NetDue)
txtPrice.Text = FormatCurrency(txtPrice.Text)
Catch ……
- Thực thi chương trình và kiểm tra kết quả.
INHERITANCE (THỪA KẾ)
- Thiết kế lớp StudentBookSale thừa kế từ lớp BookSale. Lớp này thừa kế tất cả
các thành viên của lớp BookSale, vì vậy các thành viên là Private của lớp BookSale
cần được đặt lại là Protected.
- Lớp StudentBookSale có thêm một thuộc tính mang ý nghĩa nếu sinh viên giỏi
thì được giảm giá thêm 15%.
Lớp StudentBookSale:
• Thêm một thuộc tính protected shared mdecDiscountTotal, thuộc tính này
dùng để lưu tổng số tiền giảm (đây là giá trị chỉ đọc Readonly).
• Thêm một hằng msngSTUDENT_DISCOUNT_RATE lưu tỉ lệ giảm là 15%.
• Thêm một thuộc tính Boolean để xác định đó có phải là sinh viên giỏi hay
không?
Public Class StudentBookSale
Inherits BookSale
Protected Shared mdecDiscountTotal As Decimal
Protected mblnStudentDiscount As Boolean
Private Const msngSTUDENT_DISCOUNT_RATE As Single = 0.15
#Region "Properties"
Shared ReadOnly Property DiscountTotal() As Decimal
Get
DiscountTotal = mdecDiscountTotal
End Get
End Property
Property StudentDiscount() As Boolean
Get
StudentDiscount = mblnStudentDiscount
End Get
Set(ByVal Value As Boolean)
mblnStudentDiscount = Value
End Set
End Property
#End Region
End Class
- Mở lại lớp BookSale để sửa đổi lại các thuộc tính là Protected & phương thức
là Overridable.
Protected mstrTitle As String
Protected mintQuantity As Integer
Protected mdecPrice As Decimal
'Hold the SalesTotal property
Protected Shared mdecSalesTotal As Decimal TT. Visual Basic.NET
Trang 18
'Hold the SalesCount property
Protected Shared mintSalesCount As Integer
Protected mblnDiscount As Boolean
Protected Const msngDISCOUNT_RATE As Single = 0.2
Và Public Overridable Function DiscountAmount() As Decimal
- Mở lớp StudentBookSale để thêm vào phương thức DiscountAmount:
Overrides Function DiscountAmount() As Decimal
'Calculate discounted price
Dim decDiscountAmount As Decimal
Dim sngTotalDiscountRate As Single
'Figure out the discount based on the check boxes.
If mblnDiscount Then
sngTotalDiscountRate += msngDISCOUNT_RATE
End If
If mblnStudentDiscount Then
sngTotalDiscountRate += msngSTUDENT_DISCOUNT_RATE
End If
'Compute amount of discount
decDiscountAmount = CType(mintQuantity, Decimal) * mdecPrice * _
CType(sngTotalDiscountRate, Decimal)
Accumulate the amount of discount to the total discount shared variable
mdecDiscountTotal += decDiscountAmount
'Return the amount of discount
Return decDiscountAmount
End Function
- Thêm phương thức xây dựng vào lớp StudentBookSale, phương thức này có 5
tham số trong đó có một tham số xác định đó có phải là sinh viên giỏi hay không?
Sub New()
'Constructor with empty argument list
MyBase.New() 'Call the base class constructor
End Sub
Sub New(ByVal Title As String, ByVal Quantity As Integer, _
ByVal Price As Decimal, ByVal Discount As Boolean, _
ByVal StudentDiscount As Boolean)
'Assign property values
MyBase.New() 'Calls the base class constructor
Me.Title = Title
Me.Quantity = Quantity
Me.Price = Price
Me.Discount = Discount
Me.StudentDiscount = StudentDiscount
End Sub
TT. Visual Basic.NET
Trang 19
XÂY DỰNG LẠI FORM
- Thiết kế Form như sau:
Private Sub mnuCalculate_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles mnuCalculate.Click
Try
'Calculate extended price for sale
'Instantiate correct object and set properties
If chkStu.Checked Then
'This is a student – note the number of arguments in
'the parameter list – there are five of them
mStudentBookSale = _
New StudentBookSale(txtTitle.Text, _
CType(txtQuantity.Text, Integer), _
CType(txtPrice.Text, Decimal), _
chkDis.Checked, chkStu.Checked)
'Calculate and display result
lblEPrice.Text = _
FormatCurrency(mStudentBookSale.ExtendedPrice)
lblDis.Text = _
FormatCurrency(mStudentBookSale.DiscountAmount)
lblNetDue.Text = _
FormatCurrency(mStudentBookSale.NetDue)
txtPrice.Text = FormatCurrency(txtPrice.Text)
Else
'This is not a student – only four arguments in
'the parameter list
mBookSale = New BookSale(txtTitle.Text, _
CType(txtQuantity.Text, Integer), _
CType(txtPrice.Text, Decimal), chkDis.Checked)
'Calculate and display result
lblEPrice.Text = _
FormatCurrency(mBookSale.ExtendedPrice)
lblDis.Text = _ TT. Visual Basic.NET
Trang 20
FormatCurrency(mBookSale.DiscountAmount)
lblNetDue.Text = FormatCurrency(mBookSale.NetDue)
txtPrice.Text = FormatCurrency(txtPrice.Text)
End If
Catch
MessageBox.Show("Error in Quantity or Price", _
"Data Entry Error", MessageBoxButtons.OK, _
MessageBoxIcon.Exclamation)
End Try
End Sub
- Sự kiện mnuSum_Click được xử lý lại để hiển thị giá trị tổng:
Private Sub mnuSum_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles mnuSum.Click
'Display sales summary information
Dim strMessage As String
strMessage = "Sales Total: " & _
FormatCurrency(mBookSale.SalesTotal) & _
ControlChars.NewLine & "Sales Count: " & _
mBookSale.SalesCount.ToString & _
ControlChars.NewLine & _
"Total Student Discounts: " & _
FormatCurrency(mStudentBookSale.DiscountTotal)
MessageBox.Show(strMessage, "Summary Information", _
MessageBoxButtons.OK, MessageBoxIcon.Information)
End Sub
LƯU DỰ ÁN VÀ THỰC THI ỨNG DỤNG TT. Visual Basic.NET
Trang 21
Phần 3
TRUY CẬP CƠ SỞ DỮ LIỆU VỚI
ADO.NET
Trong phần này chúng ta sẽ tìm hiểu cách thức làm việc với ADO.NET. Đây là một
tập hợp các lớp cũng như các giao diện cho phép truy cập dữ liệu trong .NET
Framework. Ở đây ta sẽ sử dụng ADO.NET để nối kết với cơ sở dữ liệu SQL Server,
lấy dữ liệu và hiển thị chúng trên form.
Các bước thực hiện:
1. Trong SQL Server tạo một cơ sở dữ liệu tên là DVDLibrary.
2. Thêm một bảng tên DVDLibrary với cấu trúc như sau (Bảng 4.1):
3. Thêm vài dòng dữ liệu vào bảng.
4. Tạo một ứng dụng WinForrm tên prjDVD.
5. Đổi tên của form chính thành frmDVDCatalog.
6. Thêm một số control vào và sửa đổi một số thuộc tính tương ứng (bảng 4.2) sao
cho ta được giao diện:
TT. Visual Basic.NET
Trang 22
Control Property Value
Form
Name
Text
frmDVDCatalog
DVD Catalog
Label
Name
Text
lblHeading
DVD Catalog
Label
Name
Text
lblDVDCodeNo
DVD Code Number
Label
Name
Text
lblTitle
DVD Title
Label
Name
Text
lblLang
Language
Label
Name
Text
lblPrice
Price
Label
Name
Text
lblDollars
Dollars
GroupBox
Name
Text
grpSubTitles
Subtitles
RadioButton
Name
Text
Checked
radYes
Yes
true
RadioButton
Name
Text
Checked
radNo
No
false
ComboBox
Name
Collection
cboLang
English
Spanish
French
Chinese
Russian
NumericUpDown
Name
Maximum
Minimum
Value
updPrice
150
5
5
TextBox
Name
ReadOnly
Text
txtCodeNo
true
TextBox
Name
Text
txtTitle
Button
Name
Text
btnAddNew
AddNew
Button
Name
Text
btnSave
Save
Button
Name
Text
btnExit
Exit
7. Chuyển sang cửa sổ Code View, tham chiếu đến một số không gian tên:
Imports System.Data
Imports System.Data.SqlClient;
8. Khai báo những biến sau trong phần khai báo của form: TT. Visual Basic.NET
Trang 23
Private conn As SqlConnection
Private commd As SqlCommand
Private sqlstr, lang As String
Private codeno, subtitles As Integer
Dim price As Decimal
9. Viết đoạn mã sau vào phương thức xử lý sự kiện Load của form:
Try
conn = New SqlConnection("Server=.;” & _
”Initial Catalog=DVDLibrary;User
Id=user;pwd=user;")
commd = new SqlCommand("Select * From
DVDLibrary",conn)
conn.Open()
btnSave.Enabled = False
Catch (ex As Exception)
MessageBox.Show(ex.Message + ex.StackTrace)
End Try
10. Khi button AddNew được click, một đối tượng SQLCommand được tạo ra
thực hiện câu truy vấn lấy về mã số lớn nhất của DVD Code No từ bảng from the
DVDLibrary. Nếu bảng rỗng, một ngoại lệ được tạo ra. Vì thws ta phải bẫy lại
ngoại lệ này nhằm kiểm tra khả năng bảng rỗng (lúc đói giá trị của biến codeno
được gán là 0). Sau đó giá trị của codeno tăng 1 để có giá trị hiện hành của
codeno. Kế tiếp các trường của form được xóa trắng nhờ vào việc gọi thực thi
phương thức ResetFields() để một mẩu tin mới được thêm vào và kích hoạt
button Save.
Sự kiện btnAddNew_Click:
//calculate new Code
commd = new SqlCommand("Select max(DVDCodeNo) From DVDLibrary", _
conn)
Try
codeno = CType(commd.ExecuteScalar(), Integer)
btnAddNew.Enabled = False
btnSave.Enabled=True
Catch(ex As Exception)
codeno=0
MessageBox.Show(ex.Message)
End Try
codeno = codeno + 1
txtCodeNo.Text = codeno.ToString()
ResetFields()
11. Sự kiện Click của button btnExit được xử lý để đóng lại nối kết dữ liệu và
kết thúc ứng dụng:
conn.Close()
End
12. Sự kiện btnSave_Click nhằm thêm một dòng dữ liệu mới vào bảng. Bởi vì
đây không phải là một câu truy vấn lấy về dữ liệu mà là một câu truy vấn hành
động nên ta sử dụng phương thức ExecuteNonQuery của lớp SQLCommand: TT. Visual Basic.NET
Trang 24
Try
sqlstr = "Insert Into DVDLibrary Values(" & _
codeno.ToString() & ",'" & txtTitle.Text & "', '" & _
lang + "'," & subtitles.ToString() & _
"," & price.ToString() & ")"
MessageBox.Show(sqlstr)
commd = New SqlCommand(sqlstr,conn)
commd.ExecuteNonQuery()
MessageBox.Show("Record has been add successfully")
ResetFields()
btnExit.Focus()
btnAddNew.Enabled = True
btnSave.Enabled=False
Catch(ex As Exception)
MessageBox.Show(ex.Message + ex.StackTrace)
End Try
13. Sự kiện ValueChanged của NumericUpDown được xử lý:
price = updPrice.Value
14. Sự kiện SelectedIndexChanged của ComboBox được xử lý:
lang = cboLang.SelectedItem.ToString()
15. Sự kiện CheckedChanged của RadioButton được xử lý:
radYes_CheckedChanged
subtitles = 1
radNo_CheckedChanged
subtitles = 0;
16. Đoạn mã cho phương thức ResetFields:
Private Sub ResetFields()
txtTitle.Text = ""
price = updPrice.Value=5
lang=cboLang.Items[0].ToString()
cboLang.Text = ""
radYes.Checked = True
radNo.Checked= False;
btnSave.Enabled=True
End Sub
17. Lưu, biên dịch và thực thi dự án. Một thí dụ mẫu cho việc thêm vào một
mẩu tin như trong hình 4.3:
TT. Visual Basic.NET
Trang 25

P3P: CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"

Cache-Control: no-cache

Vary: User-Agent

Content-Type: text/html; charset=utf-8