Coding Without Control Arrays
One of the more noticeable changes for a Visual Basic 6.0 developer who is getting started in Windows forms is the lack of control arrays. This feature of pre-.NET VB allowed you to configure a set of controls with a single name by assigning index values to each control. Once a control array was created, a single event procedure could be used to handle the events of all the controls in the array and you could also loop through the controls in an array based on index. These features made control arrays useful for a great many projects, but I mostly remember using this feature to handle groups of option buttons (radio buttons in .NET). Consider this form in VB6 (see Figure 3.4), which displays a six-item option button (radio button) collection using a control array. A single event handler (see Listing 3.12) can be written for this array that will run whenever any of the options are selected, or the array can be looped through to find the one option button with a Value = True.
Listing 3.12 VB6 Event Handler for an Option Button Control Array
Private Sub optFruit_Click(Index As Integer) MsgBox "Selected Item: " & optFruit(Index).Caption End SubFigure 3.4 A group of options buttons on a VB6 form can all be part of a control array.
Due to the changes in event handling, allowing multiple objects' events to be mapped to the same event handler, achieving the same effect in Windows forms is not impossible, but it is not quite as simple as it was in VB6. Combining the event handling features of .NET with the use of a standard array, here is a walkthrough of handling some radio buttons on a .NET Windows form. This example creates an array to hold a set of radio buttons and shows you how you can use that array along with a shared event handler to determine which option button is currently selected. If you follow along with these steps, you can try out the code for yourself.
Create a new Visual Basic .NET Windows application.
A blank Form1 will be created and opened in Design View. Select the form and then drag a new radio button onto it from the toolbox.
Copy and paste the radio button four times onto the form. This is likely the fastest way to end up with five radio buttons, but you can also drag four more radio buttons from the toolbox.
Add a label to your form.
Double-click one of the radio buttons to jump into its CheckedChanged event (see Listing 3.13) and modify the Handles clause to include all five of the radio buttons' events.
Declare an array of radio buttons as a private member variable in your form (put the declaration anywhere in your code outside of a procedure):
Declare an integer private member variable as well:
Add code into the constructor of the form (the sub New() procedure contained within the Windows Forms Designer generated area) to fill up the array with the radio buttons (see Listing 3.14).
Finally, write code into the shared CheckedChanged event handler that will loop through the radio button array and determine the currently selected option (shown in Listing 3.15). Store the appropriate array index into selectedOption and change the Text property of the label control.
Listing 3.13 Creating an Event Handler for All Five Radio Buttons
Private Sub RadioButton1_CheckedChanged( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles RadioButton1.CheckedChanged, _ RadioButton2.CheckedChanged, _ RadioButton3.CheckedChanged, _ RadioButton4.CheckedChanged, _ RadioButton5.CheckedChanged End Sub
Dim radioButtons(4) As RadioButton
Dim selectedOption As Integer = 0
Listing 3.14 Filling Up Your Own Radio Button Array
Public Sub New() MyBase.New() 'This call is required by the Windows Form Designer. InitializeComponent() 'Add any initialization after the InitializeComponent() call radioButtons(0) = RadioButton1 radioButtons(1) = RadioButton2 radioButtons(2) = RadioButton3 radioButtons(3) = RadioButton4 radioButtons(4) = RadioButton5 End Sub
Listing 3.15 Loop Through the Radio Buttons and Determine which One Is Clicked
Private Sub RadioButton1_CheckedChanged( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles RadioButton1.CheckedChanged, _ RadioButton2.CheckedChanged, _ RadioButton3.CheckedChanged, _ RadioButton4.CheckedChanged, _ RadioButton5.CheckedChanged Dim i As Integer = 0 Dim found As Boolean = False While i < radioButtons.GetLength(0) And Not found If radioButtons(i).Checked Then found = True selectedOption = i + 1 Label1.Text = CStr(selectedOption) End If i += 1 End While End Sub
If you were to run this code, you would see the label changing every time a different option was selected. The flexibility of event handling in .NET allows you to work with a set of five radio buttons without having to have five different event handlers.