[VB.NET] Phương pháp tổng hợp thông tin control

tuhocvba

Administrator
Thành viên BQT
1. Vấn đề
Giả sử chúng ta có 10 ô textbox xử lý như sau:
Mã:
TextBox1.Enabled = False
TextBox2.Enabled = False
TextBox3.Enabled = False
TextBox4.Enabled = False
TextBox5.Enabled = False
TextBox6.Enabled = False
TextBox7.Enabled = False
TextBox8.Enabled = False
TextBox9.Enabled = False
TextBox10.Enabled = False
Cách viết code như thế này đúng, nhưng khi viết code sẽ rất cực và mất thời gian.
Thay vì thế ta có thể viết code như sau:
Mã:
Dim o As Control
For Each o In Me.Controls

    If o.GetType Is GetType(TextBox) Then

        o.Enabled = False

    End If

Next
Ở trên ta dùng vòng lặp For ~ Next để kiểm tra từng đối tượng trên Form. Code trên không khó, hãy ghi nhớ nó vào trong đầu để sử dụng bất cứ khi nào chúng ta thấy cần.
Đối với một đối tượng hay biến số X, nếu không biết kiểu (GetType) của nó là gì , ta có thể làm như sau: MsgBox(X.GetType) , ví dụ để kiểm tra X có phải là Integer hay không, ta viết If X.GetType Is GetType(Integer) .
Như ví dụ trên thì ta tìm kiếm o có phải là TextBox hay không.

2. Thuộc tính Controls
Việc điều khiển Control rất tiện lợi. Nhưng nếu trên form của các bạn có control như panel, Container, thì việc điều khiển control sẽ có khó khăn. Ta hãy xem xét vấn đề sau:
Bạn cần đăng nhập để thấy đính kèm

Mối quan hệ của các control như sau :
Bạn cần đăng nhập để thấy đính kèm

Theo hình trên, thông qua thuộc tính controls, ta có thể truy cập được control con, nhưng controls cháu thì không được.
Hãy nhớ điều này.
Nói tóm lại, ta không thể truy cập vào TextBox3 thông qua thuộc tính Controls của form.
Nhưng ta có thể thông qua thuộc tính Controls của Panel1 để truy cập vào TextBox3.
Bạn có thể thông qua trị số để truy cập tới nó. Hoặc thông qua tên của nó. Nhưng điều này thì bạn cũng chỉ có thể chỉ định một chỉ số hay một tên cụ thể.
(VB.NET 2005 trở đi thì mới chỉ định được tên. VB.NET2002, VB.NET2003 thì không chỉ định bằng tên được)

Code lúc này sẽ là:
Mã:
Me.Controls(2).Visible = False
3. Nhóm hóa thông qua thuộc tính controls.
Mã:
Dim oControl As Control
For Each oControl In Panel1.Controls

    oControl.Text = "tuhocvba.net"

Next
Nhóm hóa thông qua tên:
Mã:
Dim oControl As Control
For Each oControl In Me.Controls

    If Strings.Left(oControl.Name, 7) = "txtNeed" Then
        oControl.BackColor = Color.LightCoral
    End If

Next
Nhóm hóa thông qua chủng loại:
Mã:
Dim oControl As Control
For Each oControl In Me.Controls

    If oControl.GetType Is GetType(Button) Then
        oControl.Enabled = False
    End If

Next
Nhóm hóa thông qua thuộc tính Tag :
Mã:
Dim oControl As Control
For Each oControl In Me.Controls

    If oControl.Tag = "Admin" Then
        oControl.Enabled = False
    End If

Next
Thuộc tính Tag mọi người có thể tự do thiết định, nó cũng không có chức năng gì. Vì vậy thông qua Tag để nhóm hóa theo ý đồ người code là rất hữu dụng.

4. Tự mình định nghĩa nhóm
Mã:
Dim MyControls As New ArrayList
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    MyControls.Add(TextBox2)
    MyControls.Add(TextBox3)
    MyControls.Add(Button1)

End Sub
Mã:
Dim oControl As Control
For Each oControl In MyControls

    oControl.Enabled = False

Next
5. Phương pháp đặc biệt
Mã:
Dim i As Integer
Dim ControlName As String
For i = 1 To 5
    ControlName = "ComboBox" & i
    Me.Controls(ControlName).Enabled = False
Next
(Còn nữa)
Nguồn:
 

tuhocvba

Administrator
Thành viên BQT
Nói là phương pháp đặc biệt nhưng hiện nay cũng không có gì là mới. Trong VBA cũng đang sử dụng cách này để gọi một đối tượng.
Me.Controls(ControlName).Thuộc_Tính = Giá_Trị
Chú ý VB.2002 và VB.2003 thì không sử dụng được thuộc tính Controls. Tôi nghĩ ở thời điểm hiện tại, ta có thể bỏ qua vấn đề này được rồi. Nhưng thôi, dù sao đã mất công dịch thì sẽ dịch cho hết.
Để giải quyết vấn đề trên, tác giả sẽ tự tạo ra Collection bằng hàm CreateControlCollection như sau:
Mã:
Public Shared Function CreateControlCollection(ByVal Container As Control) As Hashtable
    Dim Hash As New Hashtable

    Call AppendControlCollection(Container, Hash)

    Return Hash

End Function
Private Shared Sub AppendControlCollection(ByVal Container As Control, ByVal Hash As Hashtable)
    For Each oControl As Control In Container.Controls

        If oControl.Controls.Count > 0 Then
                Call AppendControlCollection(oControl, Hash)
        End If
        Hash(oControl.Name) = oControl
    Next
End Sub
Ở đây, bạn chỉ cần copy paste là sử dụng, không cần chỉnh sửa gì nữa.
Sau đây tôi sẽ đi vào ví dụ cụ thể. Ở đây tôi muốn tất cả các ô Text trên Form hiển thị là: Hello!
Mã:
Dim MyControls As Hashtable = CreateControlCollection(Me)
Dim oControl As Control
For Each oControl In MyControls.Values

    oControl.Text = "Hello!"

Next
(Còn nữa)
Nguồn :
 
Top