Căn bản Class trong Visual Basic.Net
Nội dung chính:
- Đặc tả đối tượng
- Xây dựng tập hợp đối tượng(dùng mảng, dùng collection)
- Serialization
- Biểu diễn dữ liệu và thao tác với người sử dụng
Yêu cầu tổng quát:
- Xây dựng lớp/cấu trúc để biểu diễn 1 đối tượng nào đó.
- Xây dựng 1 lớp / dùng mảng để quản lý danh sách các đối tượng này.
- Yêu cầu khi chương trình chạy thì nạp dữ liệu từ 1 tập tin dữ liệu, khi chương trình kết thúc phải lưu lại các thay đổi trong quá trình làm việc.
- Xây dựng cửa sổ giao diện thao tác người sử dụng.
Ví dụ: sử dụng class
Người ta cần quản lý các sinh viên trong 1 lớp học. Mỗi sinh viên gồm các thông tin sau:
Mssv, họ tên, điểm toán, điểm lý, điểm hóa. Một lớp học gôm các thông tin về mã số lớp, tên lớp và 1 danh sách các sinh viên.
Xây dựng giao diện như hình sau để thao tác với người sử dụng

Khi chương trình khởi động sẽ nạp dữ liệu từ tập tin lên 1 listview với kỹ thuật serialization. Khi người dùng chọn 1 mẫu tin trong listview, dữ liệu của mẫu tin đang chọn sẽ hiển thị lên các textbox.
Khi người dùng nhấn nút Add, giao diện chuyển thành

Khi người dùng nhấn nút Save, chương trình sẽ kiểm tra tính hợp lệ của dữ liệu và cập nhật lên danh sách các sinh viên. Sau khi cập nhật xong sẽ khôi phục trạng thái của Form lại như ban đầu. Người dùng có thể nhấn nút Cancel để hủy bỏ tác vụ.
Khi người dùng nhấn nút Delete, chương trình sẽ xác nhận người dùng có chắc chắn hay không. Nếu YES thì sẽ xóa mẫu tin đang chọn.
Khi nhấn nút Edit, giao diện sẽ như sau:

Người dùng sẽ hiệu chỉnh các thông tin trừ mã số. Người dùng có thể nhấn nút Save để cập nhật thay đổi hoặc nhấn nút Cancel để hủy bỏ tác vụ.
Code hướng dẫn:
| Code cho các lớp đặc tả 1 sinh viên |
| <Serializable()> _
Public Class Student Private _mssv As String Private _hoten As String Private _diemtoan As Double Private _diemly As Double Private _diemhoa As Double Public Sub New() End Sub Public Sub New(ByVal mssv$, ByVal hoten$, ByVal diemtoan As Double, ByVal diemly As Double, ByVal diemhoa As Double) Me.mssv = mssv Me.hoten = hoten Me.diemhoa = diemhoa Me.diemly = diemly Me.diemtoan = diemtoan End Sub Public Property mssv() As String Get Return _mssv End Get Set(ByVal value As String) _mssv = value End Set End Property Public Property hoten() As String Get Return _hoten End Get Set(ByVal value As String) _hoten = value End Set End Property Public Property diemtoan() As Double Get Return _diemtoan End Get Set(ByVal value As Double) If value < 0 Or value > 10 Or Not IsNumeric(value) Then Throw New Exception(“Điểm không hợp lệ”) End If _diemtoan = value End Set End Property Public Property diemly() As Double Get Return _diemly End Get Set(ByVal value As Double) If value < 0 Or value > 10 Or Not IsNumeric(value) Then Throw New Exception(“Điểm không hợp lệ”) End If Me._diemly = value End Set End Property Public Property diemhoa() As Double Get Return _diemhoa End Get Set(ByVal value As Double) If value < 0 Or value > 10 Or Not IsNumeric(value) Then Throw New Exception(“Điểm không hợp lệ”) End If _diemhoa = value End Set End Property Public Overrides Function Equals(ByVal obj As Object) As Boolean Dim st As Student st = obj Return _mssv.ToLower() = st.mssv.ToLower() End Function Public Overrides Function GetHashCode() As Integer Return _mssv.GetHashCode() End Function Public Overrides Function ToString() As String Return _hoten End Function ‘phương thức tính điểm trung bình Public Function DiemTB() As Double Return (diemtoan + diemly + diemhoa) / 3 End Function End Class |
| Code cho lớp đặc tả 1 lớp học |
| <Serializable()> _
Public Class Lophoc Private _msLop As String Private _tenlop As String Private dslh As List(Of Student) Public Sub New() _msLop = “” _tenlop = “” dslh = New List(Of Student) End Sub Public Sub New(ByVal mslop As String, ByVal tenlop$) _msLop = mslop _tenlop = tenlop dslh = New List(Of Student) End Sub Public Property mslop() As String Get Return _msLop End Get Set(ByVal value As String) _msLop = value End Set End Property Public Property tenlop() As String Get Return _tenlop End Get Set(ByVal value As String) _tenlop = value End Set End Property ‘========================================================================== ”’ <summary> ”’ Thêm 1 sinh viên vào danh sách sinh viên ”’ </summary> ”’ <param>Sinh viên cần thêm</param> ”’ <returns>true nếu thành công</returns> ”’ <remarks></remarks> Public Function AddNewStudent(ByVal st As Student) As Boolean If dslh.Contains(st) Then Return False End If dslh.Add(st) Return True End Function ‘========================================================================== ”’ <summary> ”’ Xóa bỏ 1 sinh viên khỏi danh sách ”’ </summary> ”’ <param >là mssv cần gỡ bỏ</param> ”’ <returns>true nếu việc gỡ bỏ thành công</returns> ”’ <remarks></remarks> Public Function RemoveStudent(ByVal mssv As String) As Boolean Dim st = New Student(mssv, “”, 0, 0, 0) If Not dslh.Contains(st) Then Return False End If dslh.Remove(st) Return True End Function ‘========================================================================== ”’ <summary> ”’ Hiệu chỉnh thông tin sinh viên khi biết msssv ”’ </summary> ”’ <param >là mssv cần hiệu chỉnh thông tin</param> ”’ <param >Thông tin sv mới</param> ”’ <returns>true nếu việc cập nhật OK</returns> ”’ <remarks></remarks> Public Function ModifyStudent(ByVal mssv As String, ByVal newStudent As Student) As Boolean Dim st = New Student(mssv, “”, 0, 0, 0) If Not dslh.Contains(st) Then Return False End If Dim os As Student os = dslh(dslh.IndexOf(st)) ‘lay sinh viên có trong danh sách os.hoten = newStudent.hoten os.diemtoan = newStudent.diemtoan os.diemly = newStudent.diemly os.diemhoa = newStudent.diemhoa Return True End Function ‘========================================================================== ”’ <summary> ”’ Truy xuất sinh viên khi biết m4 số của sv trong danh sách ”’ </summary> ”’ <param >là mssv cần truy xuất</param> ”’ <returns>nothing nếu không tồn tại mssv này trong dsach</returns> ”’ <remarks></remarks> Public Function GetStudent(ByVal mssv As String) As Student Dim st = New Student(mssv, “”, 0, 0, 0) If Not dslh.Contains(st) Then Return Nothing End If Return dslh(dslh.IndexOf(st)) End Function ”’ <summary> ”’ Truy xuất sinh viên khi biết số Thứ tự của sv trong danh sách ”’ </summary> ”’ <param >số thứ tự của sv cần truy xuất</param> ”’ <returns>null nếu không có thứ tự</returns> ”’ <remarks></remarks> Public Function GetStudent(ByVal index As Integer) As Student If (index < 0 Or index > dslh.Count – 1) Then Return Nothing End If Return dslh(index) End Function ‘========================================================================== ”’ <summary> ”’ Lấy sỉ số ”’ </summary> ”’ <returns>số sinh viên có trong lớp học</returns> ”’ <remarks></remarks> Public Function NoStudents() As Integer Return dslh.Count End Function End Class |
| Code cho module serial và deserial 1 đối tượng |
| Imports System.IO
Imports System.Runtime.Serialization.Formatters.Binary Module Master ‘Khai báo dùng chung cho ứng dụng Public lh As New Lophoc ”’ <summary> ”’ Số hóa 1 đối tượng xuống file dạng nhị phân ”’ </summary> ”’ <param >là đường dẫn đến tập tin lưu trữ</param> ”’ <remarks></remarks> Public Sub SerialObject(ByVal filepath As String) Try Dim bfmt = New BinaryFormatter Dim out1 As Stream out1 = New System.IO.FileStream(filepath, FileMode.Create) bfmt.Serialize(out1, lh) out1.Close() Catch ex As Exception Console.WriteLine(ex.ToString()) End Try End Sub ‘========================================================================= ”’ <summary> ”’ Phục hồi dữ liệu từ tập tin dữ liệu ”’ </summary> ”’ <param >là đường dẫn đến tập tin lưu trữ</param> ”’ <returns>1 Lớp học đã lưu trước đó</returns> ”’ <remarks></remarks> Public Function DeserialObject(ByVal filepath As String) As Lophoc Dim lh As Lophoc Try Dim bfmt = New BinaryFormatter Dim inSt As New FileStream(filepath, FileMode.Open) lh = bfmt.Deserialize(inSt) inSt.Close() Catch ex As Exception MessageBox.Show(ex.ToString, “lỗi”) End Try Return lh End Function End Module |
Thiết kế giao diện

Code cho việc nạp 1 Form:
Đầu tiên, chúng ta deserialize file đã được lưu trước đó vào 1 lớp học. Sau đó tiến hành đưa các sinh viên vào listview. Nếu có sinh viên, ta sẽ chọn mẫu tin đầu tiên để hiển thị.
| Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
lh = DeserialObject(“data.dat”) BuildList() LockText(True) If (ListView1.Items.Count > 0) Then ListView1.Items(0).Selected = True ListView1.Select() End If End Sub |
Code cho sự kiện khi chúng ta thoát ứng dụng:
Khi thoát ứng dụng, chúng ta phải serial lớp học của chúng ta trước khi thoát.
| Private Sub frmStudentOOP_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
SerialObject(“data.dat”) End Sub |
Các phương thức hỗ trợ:
Phương thức xóa trắng các textbox
| Private Sub ClearText()
txtDT.Text = “” txtDL.Text = “” txtDH.Text = “” txtHt.Text = “” txtMs.Text = “” End Sub |
Phương thức Khóa/Mở khóa các Textbox tùy theo tình trạng truyền vào
| Private Sub LockText(ByVal state As Boolean)
txtDT.Enabled = Not state txtDL.Enabled = Not state txtDH.Enabled = Not state txtHt.Enabled = Not state txtMs.Enabled = Not state End Sub |
Phương thức thêm 1 dòng mới vào trong ListView:
Dữ liệu chuyền vào là 1 sinh viên. Khi thứ tự mẫu tin là 1 số lẽ, ta đổi màu nền cho việc đọc được dễ dàng hơn.
| Private Sub AddRow2ListView(ByVal st As Student)
Dim item As New ListViewItem(st.mssv) item.SubItems.Add(st.hoten) item.SubItems.Add(st.diemtoan) item.SubItems.Add(st.diemly) item.SubItems.Add(st.diemhoa) item.SubItems.Add(FormatNumber(st.DiemTB, 2)) item.Tag = st ‘ghi nhớ đối tượng If (ListView1.Items.Count Mod 2 = 1) Then item.BackColor = Color.Khaki End If ListView1.Items.Add(item) End Sub |
Phương thức đổ danh sách các mẫu tin vào trong 1 ListView:
| Private Sub BuildList()
ListView1.Items.Clear() Dim st As Student For index As Integer = 0 To lh.NoStudents – 1 st = lh.GetStudent(index) AddRow2ListView(st) Next End Sub |
Code cho sự kiện chọn 1 dòng trên ListView, dữ liệu sẽ được điền lên các TextBox:
Ở đây bạn chú ý do khi chúng ta đưa 1 dòng vào ListView ta có ghi nhớ lại đối tượng bằng thuộc tính tag. Bây giờ dựa vào đó ta sẽ lấy được đối tượng chúng ta đang chọn.
| Private Sub ListView1_ItemSelectionChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ListViewItemSelectionChangedEventArgs) Handles ListView1.ItemSelectionChanged
Try Dim st As Student st = e.Item.Tag txtHt.Text = st.hoten txtMs.Text = st.mssv txtDT.Text = st.diemtoan txtDL.Text = st.diemly txtDH.Text = st.diemhoa Catch ex As Exception MessageBox.Show(ex.ToString(), “Lỗi”) End Try End Sub |
Code cho các nút :
Nút Add: Ở đây nút này chỉ đóng vai trò quản lý các controls để làm nền cho việc cập nhật về sau. Nút này đồng thời chia sẻ 2 chức năng là Add và Cancel. Khi người dùng nhất nút Add thì nó chuyển sang chức năng Cancle và ngược lại.
| Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click
If btnAdd.Text = “Add” Then LockText(False) ClearText() btnAdd.Text = “Cancel” btnSave.Enabled = True btnDelete.Enabled = False btnEdit.Enabled = False txtMs.Focus() Else LockText(True) btnAdd.Text = “Add” btnSave.Enabled = False btnDelete.Enabled = True btnEdit.Enabled = True End If |
Nút Edit : Nút này cũng tương tự như nút Add, nó làm tiền đề cho việc cập nhật dữ liệu.
| Private Sub btnEdit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEdit.Click
If txtMs.Text = “” Then MessageBox.Show(“Không có gì để sửa”, “Thông báo”) Return End If If btnEdit.Text = “Edit” Then btnEdit.Text = “Cancel” LockText(False) txtMs.Enabled = False btnAdd.Enabled = False btnDelete.Enabled = False btnSave.Enabled = True ListView1.Enabled = False Else btnEdit.Text = “Edit” LockText(True) btnAdd.Enabled = True btnDelete.Enabled = True btnSave.Enabled = False ListView1.Enabled = True End If End Sub |
Nút Save : Nút này chia sẻ chức năng của việc thêm mới mẫu tin và việc cập nhật thông tin. Chức năng sẽ được phát hiện khi nút Add hoặc nút Edit được active(enableb).
| Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click
Dim dt, dl, dh As Double Dim st1 As Student ‘Lấy dữ liệu Try dt = Convert.ToDouble(txtDT.Text) dl = Convert.ToDouble(txtDL.Text) dh = Convert.ToDouble(txtDH.Text) st1 = New Student(txtMs.Text, txtHt.Text, dt, dl, dh) Catch ex As Exception MessageBox.Show(ex.Message, “Lỗi nhập liệu”) Return End Try ‘nút lưu là của nút thêm mới If btnAdd.Enabled = True Then Try If (Not lh.AddNewStudent(st1)) Then MessageBox.Show(“Không thêm được”, “Thông báo”) Else AddRow2ListView(st1) End If Catch ex As Exception MessageBox.Show(ex.Message, “loi”) End Try Else ‘nút lưu là của nút cập nhật If lh.ModifyStudent(txtMs.Text, st1) Then BuildList() Else MessageBox.Show(“Không cập nhật được”, “Thông báo”) End If End If ‘phục hồi trang thái ban đầu LockText(True) btnAdd.Text = “Add” btnEdit.Text = “Edit” btnAdd.Enabled = True btnSave.Enabled = False btnDelete.Enabled = True btnEdit.Enabled = True ListView1.Enabled = True End Sub |
Nút Delete : Nút này sẽ xác nhận người dùng rằng có chắc chắn xóa hay không. Nếu việc xác nhận là Yes thì sẽ tiến hành xóa mẫu tin đang chọn và cập nhật lại danh sách.
| Private Sub btnDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDelete.Click
If MessageBox.Show(“Chắc chắn không?”, “Xác nhận”, MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then If lh.RemoveStudent(txtMs.Text) Then BuildList() End If End If End Sub |
Lưu ý : do tính chất của bài toán mang tính đơn giản và phục vụ cho mục đích ôn tập kiểm tra nên chúng ta không bàn luận sâu về tính chất chuyên môn của các nghiệp vụ quản lý sinh viên.
Chân thành cám ơn vì đã quan tâm !
Tesulakata said
Thank anh nhiều!
Em đang tìm hiểu về C# mong dược anh chỉ bảo giúp
Cảm ơn anh trước nha…
HI`
NICK YAHOO CỦA EM
Tesulakata
Anh bảo em với nha
Thân
rek0r said
Em muốn hỏi thầy một điều: có phương pháp nào để biến listbox định dạng như list view đc ko? Ở trên thầy dùng list view để xuất dữ liệu. Nếu em dùng list box thì làm thế nào để định dạng chữ theo column như listview.
Trần Anh Tuấn said
Cho em hỏi một chút ạ.
Em dang dùng C# giờ chuyển qua VB.Net thấy cũng không khác nhau lắm nhưng khi em viết 3 tầng hay dùng chung thì gặp một số trục trặc.
Em viết một lớp DataProviders có nhiệm vụ kết nối và làm một số tác vụ chung cho DataAccess. Thường trong C# thì em viết Static nhưng qua VB em làm shared không được. em viết module thì nó báo là không có contructor. Vậy em phải làm sao. Mong a chỉ giáo.
Cám ơn anh nhiều ạ.
because i love u said
Nếu bạn dùng listbox bạn có thể add từng collumn vào,khi ấy bạn thích add cái nào trước cũng được.
HUYNHHUUPHUOC said
CAM ON ANH NHIU LAM
vuathongtin said
Xin a trả lời giúp e 2 câu hỏi :
?? Tại sao phải dùng đến Class để add vào listview trong khi có thể add trực tiếp bằng cách thông thường mà. Lợi thế khi sử dụng Class là j ?
?? Hình như chương trình trên ko sử dụng đến Class Lophoc, vậy cần chi phải xây dựng class này.
Thank !
lê viết trường said
mong thầy send cho em mã nguồn ví dụ này vào gmail
caubemda174@gmail.com
Võ Văn Hải said
Bạn tự làm được mà!
Trà said
em đang viết một chương trình sử dụng listview và em gặp 3 vấn đề chưa giải quyết được nhờ thầy và mọi người giúp đỡ.Chương trình gồm 2 form: Form1:1 listview(3 cột:name , value và status) dề show data từ một mãng có dạng struct. From2 : có 2 textbox (tên và giá trị)và một button.
1. khi click vào một dòng trên listview (form1)thì thiêt lập background cho dòng đó nhưng em không tìm thấy sự kiện selectchaning và đã thử dung Itemselectionchanged va selectionchanged nhưng không được. Không biết code có sai không nửa nên mong sự giúp sức của thầy và mọi người.
2. em muốn chèn vào listview(form1) các label(label hinh chữ nhật không có text mà chỉ có background thôi) để xử lý theo giá trị của cột phía trước nó trên cùng một dòng(cột value=1 thì background là màu đỏ ngược lại là màu xanh).
3. khi double click vào dòng bất kì của trên listview thì nó truyền name và value qua form2(form1 vẫn còn không bỉ close). Tại form2 khi thay đổi textbox value và click vào button thì form2 đóng lại(close) đồng thời cập nhật lại data trên listview với value của name vừa bị thay đổi ở form2
Đây là một phần trong bài tập lớn của em nên hy vong được thầy cũng như các bạn nào biết xin chỉ em code để giải quyết 3 vấn đề trên.(có thể gửi code qua mail: ngthtra@yahoo.com.vn)
Em xin cam ơn nhiều!!
Phương said
Thầy ơi cho em hỏi cái này. làm cách nào mình tạo sự kiện cho các Control khi runtime. ví dụ như bên C# em chỉ gõ btn.Click+=tab tab là nó tự gen cho mình sự kiện ở bên dưới. VB.net có làm dc vậy k thây.
Thanks
Tran Ngoc Quoc said
Thầy ơi làm sao để tô màu từng dòng trong list view đây.Làm sao để click vào 1 dòng thì nó bôi đen dòng đó lên
Võ Văn Hải said
Khi đưa dữ liệu vào LV, em có 1 biến stt kiểu int. mỗi lần chạy chạy cho nó tăng 1. Nếu stt là chẳn thì cho background color của nó là màu em thích.
Trần Ngọc Quốc said
Cái phương thức Contains sao nó không chạy đúng gì hết
Em đã thêm 1 sinh viên có kiểu dữ liệu là SinhVien vào dssv
Sao đó thêm 1 Sinh Viên cũng giốn y như vậy
mà dssv.Contains(sv) cứ trả về là false.Lí ra nó phải trả về là true vì đã có sv kia trong rồi chứ .Không hiểu sao
Hay nó chỉ chay với kiểu chuối string thôi
Public Function ThemSinhVien(ByVal sv As SinhVien) As Boolean
If dssv.Contains(sv) = True Then ‘ là gì
Return False
End If
dssv.Add(sv)
Return True
End Function
Võ Văn Hải said
Trong lớp Sinhvien, bạn phải đảm bảo là có overrride phương thức Equals và HashCode thì mới dùng được phương thức Contains.
Trần Ngọc Quốc said
Cám ơn thầy đã giúp đỡ
Gà mờ said
Thầy ơi, hiện nay em có làm một bài tập lớn là viết chương trình quản lí tổng thống. CSDL Giảng Viên cho sẵn. Nhưng em gặp khó khăn ở việc xuất thông tin ra text box. Em nhờ thầy giúp đỡ! Cám ơn thầy