Võ Văn Hải's blog

Chỉ có một điều tuyệt đối đó là mọi thứ đều tương đối…

Căn bản Class trong Visual Basic.Net

Nội dung chính:

  1. Đặc tả đối tượng
  2. Xây dựng tập hợp đối tượng(dùng mảng, dùng collection)
  3. Serialization
  4. 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:

  1. Xây dựng lớp/cấu trúc để biểu diễn 1 đối tượng nào đó.
  2. Xây dựng 1 lớp / dùng mảng để quản lý danh sách các đối tượng này.
  3. 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.
  4. 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
vbclass_01.png
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
vbclass_02.png
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:
vbclass_03.png
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
vbclass_04.png
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 !

16 Responses to “Căn bản Class trong Visual Basic.Net”

  1. 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

  2. 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.

  3. 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 ạ.

  4. 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.

  5. HUYNHHUUPHUOC said

    CAM ON ANH NHIU LAM

  6. 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 !

  7. 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

  8. Võ Văn Hải said

    Bạn tự làm được mà!

  9. 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!!

  10. 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

  11. 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

  12. 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.

  13. 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

  14. 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.

  15. Cám ơn thầy đã giúp đỡ

  16. 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

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: