Võ Văn Hải's blog

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

Structure trong VB.Net

Cấu trúc là một kiểu dữ liệu do người dùng tự định nghĩa (user-defined data type) dùng để tập hợp các thành phần dữ liệu có quan hệ với nhau thành một cấu trúc duy nhất. Structure tương tự như class chẳng hạn nó có các fields và các methods,… Tuy nhiên, điểm khác biệt lớn nhất giữa structure và class đó là structure mang kiểu tham chiếu(reference type) còn structure mang kiểu giá trị(value type). Thông thường structure dùng cho các kiểu hạng nhẹ và thời gian tồn tại trong bộ nhớ ngắn trong khi class được dùng cho các đối tượng lớn và thời gian tồn tại trong bộ nhớ lâu. Tuy vậy, xu hướng thì người ta thích dùng các class hơn bởi tính chất hướng đối tượng của nó.

Để khai báo 1 cấu trúc, người ta dùng từ khóa structure.

Ví dụ:

Structure Sinhvien

Dim masv As String
Dim hoten As String
Dim ngaysinh As Date
Dim diemtoan As Integer
Dim diemly As Integer
Dim diemhoa As Integer
End Structure

Trong ví dụ sau, chúng ta cùng xét đến structure và việc dùng 1 mảng quản lý 1 danh sách các phần tử mang cấu trúc này.

Với cấu trúc đặc tả 1 sinh viên như trên, ta khai báo 1 mảng các phần tử c1 kiểu dữ liệu là cấu trúc này:

Public dssv(0 To 1000) As Sinhvien

Giao diện đề nghị cho ứng dụng như sau:
vbstructure1.png
Các TextBox cho người dụng nhập dữ liệu. Khi người dùng nhấn nút Thêm, dữ liệu sẽ được lưu vào mảng

Khi người dùng nhấn nút Xóa, dữ liệu của item hiện tại sẽ bị xóa khỏi mảng
Khi người dùng thay đổi dữ liệu rồi nhấn nút Sửa, dữ liệu của item hiện tại sẽ được cập nhật vào mảng.
Khi người dùng nhấn nút In DS, cửa sổ sau sẽ xuất hiện:
vbstructure2.png
Code hướng dẫn:

Module QLSV dùng chung
Module QLSV’cấu trúc đặc tả thông tin về 1 sinh viên

Structure Sinhvien
Dim masv As String
Dim hoten As String
Dim ngaysinh As Date
Dim diemtoan As Integer
Dim diemly As Integer
Dim diemhoa As Integer
End Structure
‘Khai báo mảng cho danh sách sinh viên
Public dssv(0 To 1000) As Sinhvien
‘Biến lưu trữ số sinh viên thực sự có trong danh sách

Public sosv As Integer = 0
”’ <summary>
”’ Thêm 1 sinh viên vào mảng các sinh viên
”’ </summary>
”’ <param >Sinh viên cần thêm</param>
”’ <remarks></remarks>
Public Sub AddSV(ByVal sv As Sinhvien)
If (sosv > 999) Then
Return
End If
dssv(sosv) = sv
sosv += 1
End Sub
”’ <summary>
”’ Xóa 1 sinh viên khỏi danh sách
”’ </summary>
”’ <param >vị trí của sinh viên cần xóa</param>
”’ <remarks></remarks>
Public Sub Xoa(ByVal index As Integer)
If (index < 0 Or index > sosv) Then
Return
End If
For i As Integer = index To sosv – 1
dssv(i) = dssv(i + 1)
Next
sosv = sosv – 1
End Sub

End Module

Thiết kế Form: frmSinhvien
vbstructure3.png
frmDanhsachSV
vbstructure4.png

Code cho Form frmSinhvien
Public Class frmSinhvien

‘biến dùng để lưu giữ vị trí hiện tại của các phần tử

Private current As Integer = 0

Private Sub btnThem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnThem.Click

‘có thể kiểm tra các giá trị hợp lệ không ở đây

‘…

Dim sv As Sinhvien

sv.masv = txtMS.Text

sv.hoten = txtHT.Text

sv.ngaysinh = dtpNS.Value

sv.diemtoan = Convert.ToInt16(txtDT.Text)

sv.diemly = Convert.ToInt16(txtDL.Text)

sv.diemhoa = Convert.ToInt16(txtDH.Text)

AddSV(sv)

lblRecs.Text = (current + 1).ToString() + ” / ” + sosv.ToString()

End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

sosv = 0

lblRecs.Text = current.ToString() + ” / ” + sosv.ToString()

End Sub

Private Sub btnInDS_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnInDS.Click

Dim frm As New frmDanhsachSV

frm.ShowDialog(Me)

End Sub

Private Sub btnNavigate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFirst.Click, btnPrev.Click, btnNext.Click, btnLast.Click

Dim btn As Button = sender

If (btn.Text = “|<“) Then

current = 0

FillList()

ElseIf (btn.Text = “<“) Then

If current > 0 Then

current = current – 1

FillList()

End If

ElseIf (btn.Text = “>”) Then

If current < (sosv – 1) Then

current = current + 1

FillList()

End If

ElseIf (btn.Text = “>|”) Then

current = sosv – 1

FillList()

End If

End Sub

Private Sub FillList()

If sosv = 0 Then

Return

End If

Dim sv As Sinhvien = dssv(current)

txtMS.Text = sv.masv

txtHT.Text = sv.hoten

txtDT.Text = sv.diemtoan

txtDL.Text = sv.diemly

txtDH.Text = sv.diemhoa

dtpNS.Value = sv.ngaysinh

lblRecs.Text = (current + 1).ToString() + ” / ” + sosv.ToString()

End Sub

Private Sub btnXoa_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnXoa.Click

Xoa(current)

End Sub

Private Sub btnSua_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSua.Click

dssv(current).hoten = txtHT.Text

dssv(current).ngaysinh = dtpNS.Value

dssv(current).diemtoan = Convert.ToInt16(txtDT.Text)

dssv(current).diemly = Convert.ToInt16(txtDL.Text)

dssv(current).diemhoa = Convert.ToInt16(txtDH.Text)

End Sub

End Class

Code cho form frmDanhsachSV
Public Class frmDanhsachSV

Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

For i As Integer = 0 To sosv – 1

Dim s As Sinhvien = dssv(i)

lstMSSV.Items.Add(s.masv)

lstHT.Items.Add(s.hoten)

lstNS.Items.Add(s.ngaysinh.ToString)

lstToan.Items.Add(s.diemtoan)

lstLy.Items.Add(s.diemly)

lstHoa.Items.Add(s.diemhoa)

Dim tb As Double = (s.diemhoa + s.diemly + s.diemtoan) / 3

lstTB.Items.Add(tb.ToString)

Next

End Sub

”’ <summary>

”’ Sự kiện này dùng chung cho tất cả các ListBox trong form.

”’ Mục dích là khi chọn bất kỳ 1 phần tử nào trên 1 listbox thì tất cả

”’ các listbox còn lại sẽ chọn đúng vị trí mà bạn chọn

”’ </summary>

”’ <param ></param>

”’ <param ></param>

”’ <remarks></remarks>

Private Sub lst_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lstMSSV.SelectedIndexChanged, lstToan.SelectedIndexChanged, lstTB.SelectedIndexChanged, lstNS.SelectedIndexChanged, lstLy.SelectedIndexChanged, lstHT.SelectedIndexChanged, lstHoa.SelectedIndexChanged

Dim lst As ListBox = sender

Dim index As Integer = lst.SelectedIndex

Dim ctls As Control

For Each ctls In Me.Controls

If (TypeOf (ctls) Is ListBox) Then

lst = ctls

lst.SelectedIndex = index

End If

Next

End Sub

End Class

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.

Cám ơn vì đã quan tâm !

11 Responses to “Structure trong VB.Net”

  1. Tú Quyên said

    Thầy ơi cho em hỏi phần sender
    Private Sub btnNavigate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFirst.Click, btnPrev.Click, btnNext.Click, btnLast.Click

    Dim btn As Button = sender

    If (btn.Text = “|<”) Then

    current = 0

    end if

    Khi em cài đặt bài này thì có một vấn đề đó là nếu em vô tình click chuột nhiều lần vào textbox sẽ báo lỗi do ta gán sender cho button, vậy làm sao để ta phân biệt được đâu là sender click chuột trên button đâu là trên textbox để em khắc phục lỗi này ạ.

    Dim btn As Button = sender

  2. vovanhai said

    Có thể kiểm tra nó bằng cách dùng toán tử TypeOf.
    if TypeOf(sender) is Button then

    endif

  3. hoctromoi said

    thầy ơi,em hiện đang học cơ bản của vb.net.em có thể theo thầy học được không ạ?

  4. LeMinh said

    Public Sub Xoa(ByVal index As Integer)
    If (index sosv) Then
    Return
    End If
    For i As Integer = index To sosv – 1
    dssv(i) = dssv(i + 1)
    Next
    sosv = sosv – 1
    End Sub

    *thầy ơi..em ko hiểu tại sao ngay dòng lập For thầy để

    For i As Integer = index To sosv – 1
    dssv(i) = dssv(i + 1)

    Mà sau khi em thử thay đổi đoạn code nó vẫn chạy ok…
    Dim i As Integer
    For i = index To sosv
    dssv(i) = dssv(i + 1)

    Mong thầy giải thích…em thấy khó hiểu quá

  5. vovanhai said

    có gì đâu, nó tự động chuyển kiểu ấy mà. Tôi để tường minh.

  6. hoang phuoc toan said

    thay oi de nhung sql vao vb thi lam the nao!

  7. tra said

    Em đang gặp vần đề vế đọc file pdf sang file text(.txt) sử dụng Dim token As PRTokeniser trong VB.NET. thầy có thể chỉ cho em vài dòng code không?

    Em muốn đọc từng dòng trong file pdf rồi ghi ra file text cũng theo từng dòng giống như trong file pdf vậy nhưng em làm không được chỉ đọc ra một chuổi dài thón thôi.
    mong thầy giúp em!!!

    Dim sb As New System.Text.StringBuilder()
    Dim reader As New PdfReader(sourcePDF)
    Dim pageBytes() As Byte = Nothing
    Dim token As PRTokeniser = Nothing
    Dim tknType As Integer = -1
    Dim tknValue As String = String.Empty
    Dim fromPageNum As integer
    Dim toPageNum as integer
    the value of toPageNum”)

    For i As Integer = fromPageNum To toPageNum Step 1
    pageBytes = reader.GetPageContent(i)
    If Not IsNothing(pageBytes) Then
    token = New PRTokeniser(pageBytes)
    While token.NextToken()
    tknType = token.TokenType()
    tknValue = token.StringValue
    If tknType = PRTokeniser.TokType.STRING Then
    sb.Append(token.StringValue)
    ElseIf tknType = 5 AndAlso tknValue = “” Then
    sb.Append(“–“)
    End If
    End While
    End If
    Next i

  8. Võ Văn Hải said

    Tôi chưa thử nữa. Bạn nào giải quyết dùm. thanks

  9. Tra said

    thầy ơi cho em hỏi tý.em có một project viết trên VB.NET 2008. Nay em muốn tạo bộ cài(installer) để cài trên máy tính khác không có .Net Framework 3.5 nên khi cài thì em cho cài bộ .Net Framework 3.5 luôn khỏi phải down trên mạng(bộ .Net Framework 3.5 được kèm theo vo8i1 bộ cài luôn).
    Thầy có thể giúp em ít code để giải quyết vấn này không?

    em cám ơn thầy nhiều lắm!!

  10. Mr Tran said

    thank you

  11. Nguyễn Trung Thanh said

    thầy cho e hỏi trường mình hay trung tâm nào có dạy visual basic không ạ, E muốn học mà không biết phải học ở đâu hết!

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: