Navtik
Navtik

Reputation: 5

Array of Checkboxes VB.NET

I can now draw multiple checkboxes onto the form, however im not sure as to how I can check each checkbox indivdually to see whether it has been checked or not. This is the code that I am using to draw the checkboxes to screen.

    Dim data as String() = New String() { "testing", "testing2" }
    Dim offset = 10
    For Each cur In data
        Dim checkBox = New CheckBox()
        Me.Controls.Add(checkBox)
        checkBox.Location = New Point(10, offset)
        checkBox.Text = cur
        checkBox.Checked = True
        checkBox.Size = New Size(100, 20)
        offset = offset + 20
    Next

Upvotes: 0

Views: 7926

Answers (3)

Andrew Morton
Andrew Morton

Reputation: 25013

You can store references to the checkboxes in a List(Of Checkbox):

Option Infer On

Public Class Form1

    Dim theCheckBoxes As List(Of CheckBox)

    Sub SetUpCheckBoxes()
        theCheckBoxes = New List(Of CheckBox)

        Dim data As String() = New String() {"testing", "testing2"}
        Dim offset = 10
        For Each cur In data
            Dim cb = New CheckBox()
            cb.Location = New Point(10, offset)
            cb.Text = cur
            cb.Checked = True
            cb.Size = New Size(100, 20)
            Me.Controls.Add(cb)
            theCheckBoxes.Add(cb)
            offset = offset + 20
        Next

    End Sub

    ' an example of doing something with the list of checkboxes
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim count = 0
        For Each cb In theCheckBoxes
            ' do something with cb.Checked
            If cb.Checked Then
                count += 1
            End If
        Next

        If count = 1 Then
            MsgBox("There is 1 checked.")
        Else
            MsgBox("There are " & count.ToString() & " checked.")
        End If

    End Sub

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

    End Sub

End Class

However, if you wanted to make it more general so that you could have more than one set of checkboxes and you could add them to the container control of your choice, you could make it more sophisticated and have a class which looks after a set of checkboxes. As an example:

Option Infer On

Public Class Form1

    Dim myCheckboxes As Dictionary(Of String, CheckboxOrganiser)

    'TODO: Consider putting this CheckboxOrganiser class in its own file.
    Public Class CheckboxOrganiser
        Implements IDisposable

        Property Checkboxes As List(Of CheckBox)

        ' ########### some examples of what could be in this Class
        Sub ShowCheckedCount()
            Dim count = 0
            For Each cb In Checkboxes
                ' do something with cb.Checked
                If cb.Checked Then
                    count += 1
                End If
            Next

            If count = 1 Then
                MsgBox("There is 1 checked.")
            Else
                MsgBox("There are " & count.ToString() & " checked.")
            End If

        End Sub

        Sub ShowIfChecked(tagText As String)
            For Each cb In Checkboxes
                If cb.Tag.ToString = tagText Then
                    MsgBox(String.Format("{0} is {1}checked.", tagText, If(cb.Checked, "", "not ")))
                    Exit For
                End If
            Next

        End Sub
        ' ########### end examples

        ' dispose of the CheckBoxes and the references to them
        Sub Clear()
            If Me.Checkboxes IsNot Nothing Then
                For Each cb In Me.Checkboxes
                    cb.Parent.Controls.Remove(cb)
                    cb.Dispose()
                Next
                Me.Checkboxes.Clear()
            End If

        End Sub

        ' add the CheckBoxes to a container control
        Sub Display(target As Control)
            'TODO: check that target is a container control
            target.Controls.AddRange(Me.Checkboxes.ToArray())

        End Sub

        ' make a new list of CheckBoxes
        Sub New(left As Integer, top As Integer, data As String())
            Checkboxes = New List(Of CheckBox)
            Dim cbSize As New Size(100, 20)

            Dim offset = top
            For Each cur In data
                Dim cb = New CheckBox()
                cb.Location = New Point(left, offset)
                cb.Text = cur
                cb.Tag = cur
                cb.Checked = True
                cb.Size = cbSize
                Checkboxes.Add(cb)
                offset = offset + 20
            Next

        End Sub

        Sub New()
            Checkboxes = New List(Of CheckBox)

        End Sub

        ' We're trying to do this properly, so it is best to implement the code for .Dispose()...
#Region "IDisposable Support"
        Private disposedValue As Boolean ' To detect redundant calls

        ' IDisposable
        Protected Overridable Sub Dispose(disposing As Boolean)
            If Not Me.disposedValue Then
                If disposing Then
                    Me.Clear()
                End If
            End If
            Me.disposedValue = True
        End Sub

        ' This code added by Visual Basic to correctly implement the disposable pattern.
        Public Sub Dispose() Implements IDisposable.Dispose
            ' Do not change this code.  Put cleanup code in Dispose(disposing As Boolean) above.
            Dispose(True)
            GC.SuppressFinalize(Me)
        End Sub
#End Region

    End Class

    ' an example of getting rid of a set of CheckBoxes
    Private Sub bnRemoveTestCbs_Click(sender As Object, e As EventArgs) Handles bnRemoveTestCbs.Click
        myCheckboxes("tests").Dispose()

    End Sub

    ' an example of doing something with the checkboxes
    Private Sub bnCountThem_Click(sender As Object, e As EventArgs) Handles bnCountThem.Click
        myCheckboxes("shapes").ShowCheckedCount()

    End Sub

    ' inspect one checkbox in a collection
    Private Sub bnIsTriangleChecked_Click(sender As Object, e As EventArgs) Handles bnIsTriangleChecked.Click
        myCheckboxes("shapes").ShowIfChecked("Triangles")

    End Sub

    Sub Demo()
        ' use a Dictionary so that each CheckboxOrganiser can be referred to by a name
        myCheckboxes = New Dictionary(Of String, CheckboxOrganiser)

        ' create a set of checkboxes and name it "testing"...
        Dim data = New String() {"testing", "testing2"}
        myCheckboxes.Add("tests", New CheckboxOrganiser(10, 10, data))

        ' show them on the main Form
        myCheckboxes("tests").Display(Me)

        ' and another set of checkboxes...
        data = {"Triangles", "Squares"}
        myCheckboxes.Add("shapes", New CheckboxOrganiser(10, 20, data))

        ' we're going to add them to a GroupBox instead:
        Dim gb As New GroupBox With {.Left = 120, .Top = 20, .Width = 120, .Height = 80, .Text = "Shapes"}
        Me.Controls.Add(gb)
        myCheckboxes("shapes").Display(gb)

    End Sub

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

    End Sub


End Class

I started getting a bit carried away there, but I thought it worthwhile to show you how, with a bit more code to start off with, you can make other things simpler to use.

Upvotes: 0

Yamraj Pandya
Yamraj Pandya

Reputation: 21

Dim numberOfButtons As Integer
Dim buttons() as Button

Private Sub MyForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Redim buttons(numberOfbuttons)
for counter as integer = 0 to numberOfbuttons
    With buttons(counter)
       .Size = (10, 10)
       .Visible = False
       .Location = (55, 33 + counter*13)
       .Text = "Button "+(counter+1).ToString ' or some name from an array you pass from main
       'any other property
    End With
    '
next
End Sub

how to programmatically add-controls to a form in vb net

Upvotes: 0

Steve
Steve

Reputation: 216243

To retrieve your checkboxes added dynamically you could loop over the Forms controls collection

For Each chk In Me.Controls.OfType(Of CheckBox)()
   if chk.Checked Then
      if chk.Name = "testing" Then
          ' code for testing.checked = true
      Else if chk.Name = "testing2" then
          ' code for testing2.checked = true
      End If
   End If
Next

Upvotes: 2

Related Questions