  
Chapter 10
List Boxes and Data
Lists
Often the user will need to select from or add to a list of items such as pay
code abbreviations or division names. Visual Basic supports two controls, the List
Box and the Combo Box controls, that you use to display lists and from which the
user can select items in the lists.
Once you master the List controls, two additional VB programming topics are simple:
data arrays and control arrays. You can combine the List controls and the arrays
to work in harmony when processing lists of information, as you'll see in this lesson.
The highlights of this hour include
- How to add list boxes
- What differences exist between list boxes and combo boxes
- How to initialize lists
- When to use drop-down list boxes
- How to declare and use arrays
- Why control arrays streamline coding
The List Box Control
Figure 10.1 shows VB's Options dialog box that appears when you select Tools |
Options and click the Editor Format tab. The dialog box illustrates a List Box control.
You've seen list boxes throughout your work with Windows; list boxes appear on many
forms and dialog boxes. The List Box control gives the user a choice of several values.
The user selects an option instead of typing a value into a text box. The list box
ensures that the user always chooses one of the available options.
Figure
10.1. The List Box control gives the user
a choice of options.
NOTE: The list box
displays scrollbars if the list box is not tall enough or wide enough to display
all its data.
As you place the list box on the form, think about the data the list box will
hold and try to size the list box so that it's large enough to hold the data. Of
course, you don't always know a list box's data in advance because the data might
come from a disk file or from the user at the keyboard, but try to make the control
large enough to hold the data you expect. Your form's size and surrounding controls
might limit the size of your list box, so the scrollbars often appear.
Any list box can have a single or multiple columns. In many situations the single
column makes data selection easier for your users, but they will have to scroll through
more values to locate the item they want to find. Figure 10.2 shows a form with two
list boxes; the first list box is a single-column list box, and the second displays
three columns. (The Columns property determines the list box's number of
columns.)
To familiarize yourself with list boxes as quickly as possible, look over the
property values in Table 10.1. You'll work with other properties at runtime because
you often initialize the list box at runtime and not at design time.
Figure
10.2. A list box with one column and one
with three columns.
Table 10.1. The basic list box properties.
| Property |
Description |
| BackColor |
Specifies the list box's background color. |
| Columns |
Determines the number of columns. If 0, the list box scrolls vertically
in a single column. If 1 or more, the list box items appear in the number
of columns specified (one or more columns) and a horizontal scrollbar appears so
you can see all the items in the list. |
| ForeColor |
Specifies the list box's text color. |
| Height |
Indicates the height of the list box in twips. |
| IntegralHeight |
Determines whether the list box can display partial items, such as the upper half
of an item that falls toward the bottom of the list box. |
| List |
Holds, in a drop-down property list box, values that you can enter into the list
box at design time. You can enter only one at a time, and most programmers usually
prefer to initialize the list box at runtime. |
| MultiSelect |
The state of the list box's selection rules. If 0-None (the default), the
user can select only one item by clicking with the mouse or by pressing the Spacebar
over an item. If 1-Simple, the user can select more than one item by clicking
with the mouse or by pressing the Spacebar over items in the list. If 2-Extended,
the user can select multiple items using Shift+click and Shift+arrow to extend the
selection from a previously selected item to the current one. Ctrl+click either selects
or deselects an item from the list. |
| Sorted |
Determines whether the list box values are automatically sorted. If False
(the default value), the values appear in the same order in which the program added
the items to the list. |
| Style |
Determines whether the list box appears in its usual list format or, as shown in
Figure 10.3, with check boxes next to the selected items. |
Figure
10.3. You can add check boxes to list
box items.
TIP: You can add a
command button that operates in conjunction with the list box in many situations.
The user can, therefore, select a value from the list box and then click the command
button to inform your application of the selected value. You can also add a double-click
event procedure to the list box so that the user's double-click on a list box item
selects that item. If you set up the command button first, the double-click event
procedure is simple because you can trigger the command button's Click()
event procedure from within the double-click procedure with this one line:
cmdAccept_Click ` Triggers the button's click event
-
Table 10.2 describes the methods available to the list box. Remember that methods
are routines a control knows how to execute. List boxes use methods more than any
other control you've learned about so far. The methods help the user initialize,
add items to, and remove items from list boxes.
Table 10.2. Common list box methods.
| Method |
Description |
| AddItem |
Adds a single item to the list box. |
| Clear |
Removes all items from the list box. |
| List |
A string array that holds items from within the list box. |
| ListCount |
The total number of list box items. |
| RemoveItem |
Removes a single item from the list box. |
Perhaps the most important method is the AddItem method, which adds items
to the list box. AddItem is to list boxes what the assignment statement
is to variables. A method always appears between the control name and a period. For
example, the following AddItem method sends the value of Joseph
to a list box named lstOneCol:
lstOneCol.AddItem "Joseph"
NOTE: The one-column
list box shown in Figure 10.1 is named lstOneCol and that's the name used
throughout the next couple examples.
You'll often initialize a list box in the Form_Load() event procedure
that initializes the form and the form controls right before the form appears on
the screen. The following code sends several people's names to the list boxes shown
earlier:
lstOneCol.AddItem "Joseph"
lstOneCol.AddItem "Michael"
lstOneCol.AddItem "Stephanie"
lstOneCol.AddItem "Mary Ann"
lstOneCol.AddItem "Pamela"
lstOneCol.AddItem "Jock"
lstOneCol.AddItem "Bobby"
lstOneCol.AddItem "Cliff"
lstOneCol.AddItem "Jerry"
lstOneCol.AddItem "Thomas"
lstOneCol.AddItem "George"
lstOneCol.AddItem "Robert"
You'll initialize both single-column and multicolumn list boxes the same way with
AddItem. The number of columns the list box contains has no bearing on how
you initialize the list box.
Each item in a list box contains an associated subscript. The subscript is a number
that begins at 0 for the first item, the second subscript is 1,
and so on. Therefore, if you apply the RemoveItem method as follows, the
third item is removed (because of the first item's 0 subscript):
lstOneCol.RemoveItem(2) ` 3rd item has a subscript of 2
New Term: A subscript is a value that
distinguishes one array item from the other array items.
As you remove list box items, the remaining item subscripts adjust upward accordingly.
Therefore, if a list box contains seven items, each item has a subscript that ranges
from 0 to 6. If you remove the fourth item, the list box items
will then range from 0 to 5; the subscript 5 will now
indicate the same item that the subscript 6 indicated before RemoveItem
removed the fourth item.
You can remove all items from the list box with Clear, like this:
lstOneCol.Clear ` Remove all items
You can assign individual items from a list box that contains data using the List
method. You must save list box values in String or Variant variables
unless you convert the items to a numeric data type using Val() first. The
following statements store the first and fourth list box items in two String
variables:
strVar1 = lstOneCol.List(0)
strVar2 = lstOneCol.List(3)
The List method requires a subscript so Visual Basic knows which value
from the list to assign to the variable. The value remains in the list after the
assignment, but now the value appears in the variable as well.
You use ListCount to determine the number of items in the list box currently
defined. The following statement stores the number of list box items in a numeric
variable named intNum:
intNum = lstOneCol.ListCount
TIP: You use ListCount
to loop through an entire list box with a For-Next loop.
You use Selected to determine whether a user has selected a list box
item. Selected returns True for one or more list box items if the
items' MultiSelect property is set to either 1-Simple or 2-Extended.
Those properties indicate that the user can select more than one item at once. Figure
10.4 shows a list box with several items selected at the same time.
Figure
10.4. A list box with a MultiSelect
property set to 1 or 2.
Combo Boxes
Combo boxes work much like list boxes except that the user can add items to a
combo box at runtime, whereas the user can only scroll and select items from a list
box at runtime. Visual Basic supports three kinds of combo boxes, and the kind you
select depends on the combo box you want to display on the form and on the ability
you want the user to have. All the list box methods that you learned about in the
previous section apply to combo boxes.
Here are the three kinds of combo boxes:
- Drop-down combo box--Takes up only a single line on the form unless the user
opens the combo box (by pressing the combo box's down arrow) to see additional values.
The user can enter additional items at the top of the drop-down combo box and select
items from the combo box.
- Simple combo box--Displays items as if they were in a list box. The user can
add items to the combo box list (whereas the user cannot with a normal list box).
- Drop-down list box--Does not let the user enter new items, so is similar to a
list box. Unlike a list box, however, the drop-down list box normally appears closed
to a single line until the user clicks the down arrow button to open the list box
to its full size. Technically, drop-down list boxes are not combo box controls but
work more like list boxes. The reason drop-down list boxes fall in the combo box
control family is that you place drop-down list boxes on forms by clicking the combo
box control and setting the Style combo box property.
TIP: Think of a combo
box as being a combination List Box and Text Box control. The user sees items in
the list but then enters additional items in the text box portion of the combo box.
Figure 10.5 shows the three kinds of combo boxes. Each combo box contains the
names of people that you saw in Figure 10.4. The first combo box, the drop-down combo
box, is normally closed; when the user clicks the combo box's down arrow, the combo
box opens. The third combo box, the drop-down list box, is left unopened. If the
user opens the drop-down list box, the user will see a list of people's names but
will not be able to add to the names because no data entry is possible in drop-down
list boxes.
Figure
10.5. Use Style to change the
combo box appearance.
TIP: Study your form's
design and determine the best list control to use. If the user must enter values,
you should use either a drop-down combo or simple combo box. If the user only selects
a value from a list, use a list box if you have enough form space or use a drop-down
list box if you don't have a lot of room to display a full-sized list box.
Table 10.3 describes some of the combo box properties.
Table 10.3. The fundamental combo box properties.
| Property |
Description |
| BackColor |
The combo box's background color. |
| ForeColor |
The combo box's foreground text color. |
| Height |
The height, in twips, of the closed combo box. |
| IntegralHeight |
Determines whether the combo box can display partial items, such as the upper half
of an item that falls toward the bottom of the combo box. |
| List |
A drop-down property list box in which you can enter values into the combo box at
design time. You can enter only one at a time, and most programmers prefer to initialize
the combo box at runtime. |
| Sorted |
Determines whether the combo box values are automatically sorted. If False (the
default value), the values appear in the same order in which the program added the
items to the combo box. |
| Style |
Determines the type of combo box your application needs. If 0-DropDown Combo,
the combo box is a drop-down combo box. If 1-Simple Combo, the combo box
turns into a simple combo box that remains open to the height you use at design time.
If 2-DropDown List, the combo box turns into a drop-down list box that remains
closed until the user is ready to see more of the list. |
WARNING: The user's
entered value does not add to the Drop-down Combo Box control or to the Simple Combo
Box control unless you add the capability to capture the user's entry. The combo
box by itself, without code, cannot handle the addition of items automatically. You
need to write, in the combo's Change or LostFocus event procedure,
enough code to add the new item (that always appears in the combo's Text
property) to the combo box list, like this:
cboBox.AddItem cboBox.Text ` Adds user's value to the box
-
You can also add a command button that adds the user's entered combo box value
if the user clicks the command button and ignores the new value in Text.
TIP: Run Visual Basic's
sample application named ListCombo (in the VB\Samples\Pguide folder)
to see the difference between a normal list box and a combo box list box.
Data Arrays
Now that you've mastered list boxes and combo boxes, you will have little trouble
understanding data arrays. An array is nothing more than a list of variables. Regular
non-array variables, as opposed to arrays, have separate names such as the following:
curSales97 sngTaxRate intCount blnIsRecorded
Variables in an array all have the same name. Therefore, an array that holds a
list of 10 division sales figures might be named curDivSales. Your program
must be capable of distinguishing between an array's variables, and with the single
name this distinction might seem impossible. Nevertheless, as with list boxes, your
program can distinguish between array variables by using a subscript. The subscript
works just like an index value. The first value in the array would be subscripted
as curDivSales(0) (subscripts start at 0 unless you use the Option
Base 1 statement in a general module to start the array's subscripts
at 1). The second value in the array would be curDivSales(1), and
so on.
An array is a list of items with the same name and type.
NOTE: Even without
Option Base 1, programmers often ignore the zero subscript and don't reference
it. Your programming preferences determine the starting subscript that you want to
use.
Figure 10.6 illustrates how an array such as the 10-element curDivSales
resides in memory.
Figure
10.6. Distinguishing array elements with
subscripts.
To declare an array, you use Dim or Public just as you declare
regular non-array variables. In the declaration, specify the number of elements the
array is to hold. The following Dim statement declares the 10-element Currency
array named curDivSales:
Dim curDivSales(10) As Currency
NOTE: All elements
in an array must be the same data type.
Here's the great benefit that arrays give you over separate variable names: When
you need to work with a group of variables, if you don't use an array, you must list
each variable. Therefore, if you want to add all the divisions' sales figures and
they are stored in separate non-array variables, you would have to code something
like this:
curTotal = curDivSales0 + curDivSales1 + curDivSales2 + _
curDivSales3 + curDivSales4 + curDivSales5 + _
curDivSales6 + curDivSales6 + curDivSales7 + _
curDivSales8 + curDivSales9
TIP: If you want to
break a long Code window statement into two or more lines, terminate each continued
line with the underscore character, as shown in the CurTotal assignment.
An array makes stepping through and totaling the data much simpler. Here is the
code that uses a For-Next loop to add the items in an array:
curTotal = 0 ` Zero out the total
` Step through the elements
For intCtr = 0 To 9
intTotal = intTotal + curDivSales(intCtr) ` Add elements
Next intCtr
` curTotal not holds the sum of all 10 values
With only 10 variables, does the array make for a lot less coding than separate
variables? With only 10 variables, the array does not seem to offer a lot of space
advantages or coding shortcuts. What, however, if there were 1,000 variables that
you needed to track and total? By making a simple change to the For-Next
loop, you can easily add together all 1,000 elements, like this:
curTotal = 0 ` Zero out the total
` Step through the elements
For intCtr = 0 To 999
intTotal = intTotal + curDivSales(intCtr) ` Add elements
Next intCtr
` curTotal not holds the sum of all 1,000 values
Again, many programmers ignore the 0 subscript and start the subscript
at 1, so this loop would become the following:
curTotal = 0 ` Zero out the total
` Step through the elements
For intCtr = 1 To 1000
intTotal = intTotal + curDivSales(intCtr) ` Add elements
Next intCtr
` curTotal not holds the sum of all 1,000 values
Suppose you need to ask the user for several values, such as the names of children
in a class. By declaring a string array, a For-Next loop makes getting the
names simple, as you can see here:
For intCtr = 1 To 10
strChildName(intCtr) = InputBox("What is the next child's name?")
Next intCtr
WARNING: Remember
that if you use a starting subscript of 1, you must declare one more element
than you actually need due to the 0-based subscript that you're ignoring.
Therefore, the previous code's strChildName's array declaration would be
Dim strChildName(11) As String.
Control Arrays
A control array is a list of controls with the same name. Therefore, instead of
using four command buttons with four separate names, you can place a command button
control array on the form, and that control array holds four command buttons. The
control array can have a single name, and you'll distinguish the controls from each
other with a subscript.
TIP: Use a control
array if several controls on your form are to look and act similar to each other,
such as multiple command buttons or two or more list boxes.
One of the best reasons to use a control array is that you can add the first control
to your form and set all its properties. When you create a control array from that
first control, all the elements in the control array take on the same property values.
You then can change those properties that need to be changed without having to set
every property for every control individually.
New Term: A control array is an array
of several controls that you reference with an Index property value that
acts as the subscript. The controls in a control array must be the same control type.
Control arrays have a lot in common with data arrays. A control array has one
name, and you distinguish all the array's controls from each other with the zero-based
subscript. (The Index property holds the control's subscript number.) All
the control array elements must be the same data type.
As soon as you place a control on a form that has the same name as an existing
control, Visual Basic makes sure that you want to begin a control array by issuing
the warning message shown in Figure 10.7. The message box keeps you from accidentally
creating a control array when you actually want to add a different control. You'll
see Figure 10.7's message box when you copy an existing control to the Clipboard
and paste the copy elsewhere onto the form. If you click the message box's No button,
Visual Basic uses a default control name for the placed control.
Fig 10.7 Visual Basic asks whether you want a control array.
All event procedures that use controls from a control array require a special
argument value passed to them that determines which control is being worked on. For
example, if your application contains a single command button named cmdTotal,
the Click() event procedure begins and ends as follows:
Private Sub cmdTotal_click ()
End Sub
If, however, you created a control array named cmdTotal, the Click()
event procedure begins and ends like this:
Private Sub cmdTotal_click (Index As Integer)
End Sub
The procedure uses the Index argument as the control index number (the
subscript) that the user clicked. Therefore, if you want to change the clicked command
button's Caption property inside the cmdTotal_Click() procedure,
you would do so like this:
cmdTotal(Index).Caption = "A new Caption value"
The Index value holds the command button's index the user clicked to
generate the event procedure so you will always respond to the proper control clicked
if you use Index after the control array name.
Summary
In this hour you have learned how you can add lists of items to your application.
The first kind of list, the List Box control, lets your users select from a list
of items that your application displays. The combo box works like a list box but
lets the user enter new values into the list.
Data and control arrays help you streamline your programs. Instead of working
with separate variable or control names, you can work with a single name and use
a subscript value to distinguish between the items. The code to process 10 or 100
array items is virtually the same, as this lesson demonstrated.
Chapter 11, "Additional Controls," teaches several new controls that you
can add to your applications.
Q&A
- Q When do I use a list box and when do I use a combo box?
A A list box presents users with a list of items. The user can select from the
list. The user cannot add new items to the list box. If you want to present a list
of items to the user and let the user enter new items, use a combo box. A combo box
works a lot like a combination list box and text box. As users type new values into
the text area and then click the appropriate command button to indicate that the
text is ready, the new values go to the combo box's list.
Q What's the difference between a combo drop-down list box and a regular list box?
A The only difference is that the drop-down list box remains closed until the
user opens it. Therefore, the list box does not consume a lot of form space until
the user is ready to see the values in the list. If your form contains lots of extra
room, you might want to use a regular list box so your users can see more values
at one time. If form space is tight, use a drop-down list box.
Q Should I use 0 or 1 for the starting array subscript?
A You can use either unless you've added the Option Base 1 statement
to a module's general section, in which case your subscripts will have to
begin at 1. If you don't use Option Base 1 and you ignore the 0
subscript, however, make sure you declare enough array elements to hold all your
data. If you need 15 elements and you use 1 for the starting subscript,
you must declare 16 values to access subscripts 1 through 15.
Workshop
The quiz questions and exercises are provided for your further understanding.
See Appendix C, "Answers," for answers.
Quiz
- 1. When do you normally initialize a list box?
2. What method adds new items to a list box?
3. Which method determines the number of items in a list box?
4. True or false: Visual Basic will automatically keep list box items sorted
if you set a certain property to True.
5. How many combo boxes are there?
6. How do you specify the type of combo box you want to add to an application?
7. True or false: The drop-down list box is one of the Combo Box controls, so
users can enter new values in the drop-down list box just as they can other Combo
Box controls.
8. What is an array?
9. What is the highest subscript in a 10-element array if you do not use Option
Base 1 and you use element 0?
10. True or false: A control array exists when two or more controls have the
same Name property.
Exercises
- 1. Write an application that builds a list as the user enters new values.
(Hint: Use a Combo Box control for the list.) The list should hold the user's favorite
guide titles. As the user enters more and more titles, the list should grow. Add a
command button to the form with the caption Add to; when the user clicks the command
button, the title just entered goes to the list. Keep the list sorted at all times.
2. Write an application that contains four command buttons. The command buttons
should be blue and have boldfaced, italicized captions that read Change Color, Change
Bold, Change Height, and Change Width. When the user clicks one of the command buttons,
the appropriate property should change inside the Click() event procedure.
Use a Select Case statement to determine which property should change based
on the event procedure's Index argument.
 
|