Tải bản đầy đủ (.pdf) (115 trang)

Mastering Microsoft Visual Basic 2008 phần 3 pot

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.56 MB, 115 trang )

Petroutsos c06.tex V3 - 01/28/2008 12:50pm Page 195
THE LISTBOX, CHECKEDLISTBOX, AND COMBOBOX CONTROLS 195
There are a couple of things you should notice about this handler. F irst, it doesn’t react to the Enter
key if it was pressed along with the Alt or Ctrl keys. The Shift key, on the other hand, is used to control
the direction in the Tab order. The focus moves forward with the Enter keystroke and moves back-
ward with the Shift + Enter keystroke. Also, the focus is handled automatically only for the TextBox,
CheckBox, and DataTimePicker controls. When the user presses the Enter key when a button has the
focus, the program reacts as expected by invoking the button’s Click event handler.
The ListBox, CheckedListBox, and ComboBox Controls
The ListBox, CheckedListBox, and ComboBox controls present lists of choices, from which the
user can select one or more. The first two are illustrated in Figure 6.5.
Figure 6.5
The ListBox and
CheckedListBox controls
The ListBox control occupies a user-specified amount of space on the form and is populated
with a list of items. If the list of items is longer than can fit on the control, a vertical scroll bar
appears automatically.
The CheckedListBox control is a variation of the ListBox control. It’s identical to the ListBox
control, but a check box appears in front of each item. The user can select any number of items by
selecting the check boxes in front of them. As you know, you can also select multiple items from a
ListBox control by pressing the Shift and Ctrl keys.
The ComboBox control also contains multiple items but typically occupies less space on the
screen. The ComboBox control is an expandable ListBox control: The user can expand it to make a
selection, and collapse it after the selection is made. The real advantage of the ComboBox control,
however, is that the user can enter new information in the ComboBox, rather than being forced to
select from the items listed.
To add items at design time, locate the Items property in the control’s Properties window and
click the ellipsis button. A new window will pop up — the String Collection Editor window — in
which you can add the items you want to display in the list. Each item must appear on a separate
text line, and blank text lines will result in blank lines in the list. These items will appear in the list
when the form is loaded, but you can add more items (or remove existing ones) from within your


code at any time. They appear in the same order as entered on the String Collection Editor window
unless the control has its Sorted property set to True, in which case the items are automatically
sorted, regardless of the order in which you’ve specified them.
This section first examines the ListBox control’s properties and methods. Later, you’ll see how
the same properties and methods can be used with the ComboBox control.
Petroutsos c06.tex V3 - 01/28/2008 12:50pm Page 196
196 CHAPTER 6 BASIC WINDOWS CONTROLS
Basic Properties
In this section, you’ll find the properties that determine the functionality of the three controls.
These properties are usually set at design time, but you can change their setting from within your
application’s code.
IntegralHeight
This property is a Boolean value (True/False) that indicates whether the control’s height will be
adjusted to avoid the partial display of the last item. When set to True, the control’s actual height
changes in multiples of the height of a single line, so only an integer number of rows are displayed
at all times.
Items
The Items property is a collection that holds the control’s items. At design time, you can populate
this list through the String Collection Editor window. At runtime, you can access and manipulate
the items through the methods and properties of the Items collection, which are described shortly.
MultiColumn
A ListBox control can display its items in multiple columns if you set its MultiColumn property to
True. The problem with multicolumn ListBoxes is that you can’t specify the column in which each
item will appear. ListBoxes with many items and their MultiColumn property set to True expand
horizontally, not vertically. A horizontal scroll bar will be attached to a multicolumn ListBox, so
that users can bring any column into view. This property does not apply to the ComboBox control.
SelectionMode
This property, which applies to the ListBox and CheckedListBox controls only, determines how
the user can select the list’s items. The possiblevaluesofthisproperty—membersofthe
SelectionMode enumeration — are shown in Table 6.3.

Table 6.3: The SelectionMode Enumeration
Value Description
None No selection at all is allowed.
One (Default) Only a single item can be selected.
MultiSimple Simple multiple selection: A mouse click (or pressing the spacebar) selects or deselects
an item in the list. You must click all the items you want to select.
MultiExtended Extended multiple selection: Press Shift and click the mouse (or press one of the arrow
keys) to expand the selection. This process highlights all the items between the
previously selected item and the current selection. Press Ctrl and click the mouse to
select or deselect single items in the list.
Sorted
When this property is True, the items remain sorted at all times. The default is False, because it
takes longer to insert new items in their proper location. This property’s value can be set at design
time as well as runtime.
The items in a sorted ListBox control are sorted in ascending and case-sensitive order.
Uppercase characters appear before the equivalent lowercase characters, but both upper- and
Petroutsos c06.tex V3 - 01/28/2008 12:50pm Page 197
THE LISTBOX, CHECKEDLISTBOX, AND COMBOBOX CONTROLS 197
lowercase characters appear together. All words beginning with B appear after the words begin-
ning with A and before the words beginning with C. Within the group of words beginning with
B, those beginning with a capital B appear before those beginning with a lowercase b. This sorting
order is known as phone book order.
Moreover, the ListBox control won’t sort numeric data. The number 10 will appear in front of
the number 5 because the string 10 is smaller than the string 5. If the numbers are formatted as 010
and 005, they will be sorted correctly.
Text
The Text property returns the selected text on the control. Although you can set the Text property
for the ComboBox control at design time, this property is available only at runtime for the other
two controls. Notice that the items need not be strings. By default, each item is an object. For each
object, however, the control displays a string, which is the same string returned by the object’s

ToString method.
Manipulating the Items Collection
To manipulate a ListBox control from within your application, you should be able to do
the following:
◆ Add items to the list
◆ Remove items from the list
◆ Access individual items in the list
The items in the list are represented by the Items collection. You use the members of the Items
collection to access the control’s items and to add or remove items. The Items property exposes
the standard members of a collection, which are described later in this section.
Each member of the Items collection is an object. In most cases, we use ListBox controls to
store strings, but it’s possible to store objects. When you add an object to a ListBox control, a string
is displayed on the corresponding line of the control. This is the string returned by the object’s
ToString method. This is the property of the object that will be displayed by default. You can
display any other property of the object by setting the control’s ValueMember property to the
name of the property.
If you add a Color object and a Rectangle object to the Items collection with the following
statements:
ListBox1.Items.Add(New Font(”Verdana”, 12,
FontStyle.Bold)
ListBox1.Items.Add(New Rectangle(0, 0, 100, 100))
then the following strings appear on the first two lines of the control:
[Font: Name=Verdana, Size=12, Units=3, GdiCharSet=1, gdiVerticalFont=False]
{X=0, Y=0, Width=100, Height=100}
However, you can access the members of the two objects because the ListBox stores objects, not
their descriptions. The following statement prints the width of the Rectangle object (the output
produced by the statement is highlighted):
Debug.WriteLine(ListBox1.Items.Item(1).Width)
100
Petroutsos c06.tex V3 - 01/28/2008 12:50pm Page 198

198 CHAPTER 6 BASIC WINDOWS CONTROLS
The expression in the preceding statement is late-bound, which means that the compiler doesn’t
know whether the first object in the Items collection is a Rectangle object and it can’t verify the
member Width. If you attempt to call the Width property of the first item in the collection, you’ll
get an exception at runtime indicating that the code has attempted to access a missing member.
The missing member is the Width property of the Font object.
The proper way to read the objects stored in a ListBox control is to examine the type of the
object first and then attempt to retrieve a property (or call a method) of the object, only if it’s of
the appropriate type. Here’s how you would read the Width property of a Rectangle object:
If ListBox1.Items.Item(0).GetType Is
GetType(Rectangle) Then
Debug.WriteLine(
CType(ListBox1.Items.Item(0), Rectangle).Width)
End If
The Add Method
To add items to the list, use the Items.Add or Items.Insert method. The syntax of the Add
method is as follows:
ListBox1.Items.Add(item)
The item parameter is the object to be added to the list. You can add any object to the ListBox
control, but items are usually strings. The Add method appends new items to the end of the list,
unless the Sorted property has been set to True.
The following loop adds the elements of the array words to a ListBox control, one at a time:
Dim words(100) As String
{ statements to populate array }
Dim i As Integer
Fori=0To99
ListBox1.Items.Add(words(i))
Next
Similarly, you can iterate through all the items on the control by using a loop such as the
following:

Dim i As Integer
Fori=0ToListBox1.Items.Count - 1
{ statements to process item ListBox1.Items(i) }
Next
You can also use the For Each Next statement to iterate through the Items collection, as
shown here:
Dim itm As Object
For Each itm In ListBox1.Items
{ process the current item, represented by the itm variable }
Next
Petroutsos c06.tex V3 - 01/28/2008 12:50pm Page 199
THE LISTBOX, CHECKEDLISTBOX, AND COMBOBOX CONTROLS 199
When you populate a ListBox control with a large number of items, call the BeginUpdate
method before starting the loop and call the EndUpdate method when you’re done. These
two methods turn off the visual update of the control while you’re populating it and they speed
up the process considerably. When the EndUpdate method is called, the control is redrawn with
all the items.
The Insert Method
To insert an item at a specific location, use the Insert method, whose syntax is as follows:
ListBox1.Items.Insert(index, item)
The item parameter is the object to be added, and index is the location of the new item. The first
item’s index in the list is zero. Note that you need not insert items at specific locations when the list
is sorted. If you do, the items will be inserted at the specified locations, but the list will no longer
be sorted.
The Clear Method
The Clear method removes all the items from the control. Its syntax is quite simple:
List1.Items.Clear
The Count Property
This is the number of items in the list. If you want to access all the items with a For Next loop,
the loop’s counter must go from 0 to ListBox.Items.Count - 1,asshownintheexampleofthe

Add method.
The CopyTo Method
The CopyTo method of the Items collection retrieves all the items from a ListBox control and stores
them in the array passed to the method as an argument. The syntax of the CopyTo method is
ListBox.CopyTo(destination, index)
where destination is the name of the array that will accept the items, and index is the index of
an element in the array where the first item will be stored. The array that will hold the items of the
control must be declared explicitly and must be large enough to hold all the items.
The Remove and RemoveAt Methods
To remove an item from the list, you can simply call the Items collection’s Remove method, passing
the object to be removed as an argument. If the control contains strings, pass the string to be
removed. If the same string appears multiple times on the control, only the first instance will
be removed.
You can also remove an item by specifying its position in the list via the RemoveAt method,
which accepts as argument the position of the item to be removed:
ListBox1.Items.RemoveAt(index)
The index parameter is the order of the item to be removed, and the first item’s order is 0.
Petroutsos c06.tex V3 - 01/28/2008 12:50pm Page 200
200 CHAPTER 6 BASIC WINDOWS CONTROLS
The Contains Method
The Contains method of the Items collection — not to be confused with the control’s Contains
method — accepts an object as an argument and returns a True/False value that indicates whether
the collection contains this object. Use the Contains method to avoid the insertion of identical
objects into the ListBox control. The following statements add a string to the Items collection, only
if the string isn’t already part of the collection:
Dim itm As String = ”Remote Computing”
If Not ListBox1.Items.Contains(itm) Then
ListBox1.Items.Add(itm)
End If
Selecting Items

The ListBox control allows the user to select either one or multiple items, depending on the setting
of the SelectionMode property. In a single-selection ListBox control, you can retrieve the selected
item by using the SelectedItem property, and its index by using the SelectedIndex property.
SelectedItem returns the selected item, which is an object. The text of the selected item is reported
by the Text property.
If the control allows the selection of multiple items, they’re reported with the SelectedItems
property. This property is a collection of objects and exposes the same members as the Items
collection. Because the ComboBox does not allow the selection of multiple items, it provides only
the SelectedIndex and SelectedItem properties.
To iterate through all the selected items in a multiselection ListBox control, use a loop such as
the following:
Dim itm As Object
For Each itm In ListBox1.SelectedItems
Debug.WriteLine(itm)
Next
The itm variable should be declared as Object because the items in the ListBox control are
objects. If they’re all of the same type, you can convert them to the specific type and then call their
methods. If all the items are of the Rectangle type, you can use a loop like the following to print
the area of each rectangle:
Dim itm As Rectangle
For Each itm In ListBox1.SelectedItems
Debug.WriteLine(itm.Width * itm.Height)
Next
VB 2008 at Work: The ListBox Demo Project
The ListBox Demo application (shown in Figure 6.6) demonstrates the basic operations of the
ListBox control. The two ListBox controls on the form operate slightly differently. The first has
the default configuration: Only one item can be selected at a time, and new items are appended
after the existing item. The second ListBox control has its Sorted property set to True and its
MultiSelect property set according to the values of the two RadioButton controls at the bottom
of the form.

Petroutsos c06.tex V3 - 01/28/2008 12:50pm Page 201
THE LISTBOX, CHECKEDLISTBOX, AND COMBOBOX CONTROLS 201
The code for the ListBox Demo application contains much of the logic you’ll need in your
ListBox manipulation routines. It shows you how to do the following:
◆ Add and remove items at runtime
◆ Transfer items between lists at runtime
◆ Handle multiple selected items
◆ Maintain sorted lists
Figure 6.6
ListBox Demo
demonstrates most of
the operations
you’ll perform with
ListBoxes.
The Add Item Buttons
The Add Item buttons use the InputBox() function to prompt the user for input, and then they
add the user-supplied string to the ListBox control. The code is identical for both buttons
(see Listing 6.10).
Listing 6.10: The Add New Element Buttons
Private Sub bttnSourceAdd Click( )
Handles bttnSourceAdd.Click
Dim ListItem As String
ListItem = InputBox(”Enter new item’s name”)
Petroutsos c06.tex V3 - 01/28/2008 12:50pm Page 202
202 CHAPTER 6 BASIC WINDOWS CONTROLS
If ListItem.Trim <> ”” Then
sourceList.Items.Add(ListItem)
End If
End Sub
Notice that the subroutine examines the data entered by the user to avoid adding blank strings

to the list. The code for the Clear buttons is also straightforward; it simply calls the Clear method
of the Items collection to remove all entries from the corresponding list.
Removing Items from the Two Lists
The code for the Remove Selected Item button is different from that for the Remove Selected Items
button (both are presented in Listing 6.11). The code for the Remove Selected Item button removes
the selected item, while the Remove Selected Items buttons must scan all the items of the left list
and remove the selected one(s).
Listing 6.11: The Remove Buttons
Private Sub bttnDestinationRemove Click( )
Handles bttnDestinationRemove.Click
destinationList.Items.Remove( destinationList.SelectedItem)
End Sub
Private Sub bttnSourceRemove
Click( )
Handles bttnSourceRemove.Click
Dim i As Integer
For i = 0 To sourceList.SelectedIndices.Count - 1
sourceList.Items.RemoveAt( sourceList.SelectedIndices(0))
Next
End Sub
Even if it’s possible to remove an item by its value, this is not a safe approach. If two items have
the same name, the Remove method will remove the first one. Unless you’ve provided the code to
make sure that no identical items can be added to the list, remove them by their index, which
is unique.
Notice that the code always removes the first item in the SelectedIndices collection. If you
attempt to remove the item SelectedIndices(i), you will remove the first selected item, but
after that you will not remove all the selected items. After removing an item from the selection,
the remaining items are no longer at the same locations. (In effect, you have to refresh the
SelectedIndices collection.) The second selected item will take the place of the first selected item,
which was just deleted, and so on. By removing the first item in the SelectedIndices collection,

we make sure that all selected items, and only those items, will be eventually removed.
Moving Items between Lists
The two single-arrow buttons that are between the ListBox controls shown in Figure 6.6 transfer
selected items from one list to another. The button with the single arrow pointing to the right
Petroutsos c06.tex V3 - 01/28/2008 12:50pm Page 203
THE LISTBOX, CHECKEDLISTBOX, AND COMBOBOX CONTROLS 203
transfers the items selected in the left list, after it ensures that the list contains at least one selected
item. Its code is presented in Listing 6.12. First, it adds the item to the second list, and then it
removes the item from the original list. Notice that the code removes an item by passing it as an
argument to the Remove method because it doesn’t make any difference which one of two identical
objects will be removed.
Listing 6.12: Moving the Selected Items
Private Sub bttnSourceMove Click( )
Handles bttnSourceMove.Click
While sourceList.SelectedIndices.Count > 0
destinationList.Items.Add(sourceList.Items(
sourceList.SelectedIndices(0)))
sourceList.Items.Remove(sourceList.Items(
sourceList.SelectedIndices(0)))
End While
End Sub
The second single-arrow button transfers items in the opposite direction. The destination
control (the one on the right) doesn’t allow the selection of multiple items, so you could use the
SelectedIndex and SelectedItem properties. Because the single selected element is also part of
the SelectedItems collection, you need not use a different approach. The statements that move a
single item from the right to the left ListBox are shown next:
sourceList.Items.Add(destinationList.SelectedItem)
destinationList.Items.RemoveAt(
destinationList.SelectedIndex)
Searching the ListBox

Two of the most useful methods of the ListBox control are the FindString and FindStringExact
methods, which allow you to quickly locate any item in the list. The FindString method locates
a string that partially matches the one you’re searching for; FindStringExact finds an exact
match. If you’re searching for Man, and the control contains a name such as Mansfield, FindString
matches the item, but FindStringExact does not.
Both the FindString and FindStringExact methods perform case-insensitive searches.
If you’re searching for visual, and the list contains the item Visual, both methods will locate it.
Their syntax is the same:
itemIndex = ListBox1.FindString(searchStr As String)
where searchStr is the string you’re searching for. An alternative form of both methods allows
you to specify the order of the item at which the search will begin:
itemIndex = ListBox1.FindString(searchStr As String,
startIndex As Integer)
Petroutsos c06.tex V3 - 01/28/2008 12:50pm Page 204
204 CHAPTER 6 BASIC WINDOWS CONTROLS
The startIndex argument allows you to specify the beginning of the search, but you can’t
specify where the search will end.
The FindString and FindStringExact methods work even if the ListBox control is not sorted.
You need not set the Sorted property to True before you call one of the searching methods on
the control. Sorting the list will help the search operation, but it takes the control less than 100
milliseconds to find an item in a list of 100,000 items, so time spent to sort the list isn’t worth it.
Before you load thousands of items in a ListBox control, however, you should probably consider
a more-functional interface.
VB 2008 at Work: The ListBoxFind Application
The application you’ll build in this section (seen in Figure 6.7) populates a list with a large
number of items and then locates any string you specify. Click the button Populate List to populate
the ListBox control with 10,000 random strings. This process will take a few seconds and will
populate the control with different random strings every time. Then, you can enter a string in
the TextBox control at the bottom of the form. As you type characters (or even delete characters
in the TextBox), the program will locate the closest match in the list and select (highlight) this item.

Figure 6.7
The ListBoxFind
application
The sample application reacts to each keystroke in the TextBox control and locates the string
you’re searching for instantly. The Find Item button does the same, but I thought I should
demonstrate the efficiency of the ListBox control and the type of functionality you’d expect in a
rich client application.
The code (shown in Listing 6.13) attempts to locate an exact match via the FindStringExact
method. If it succeeds, it reports the index of the matching element. If not, it attempts to locate
a near match with the FindString method. If it succeeds, it reports the index of the near match
(which is the first item on the control that partially matches the search argument) and terminates.
If it fails to find an exact match, it reports that the string wasn’t found in the list.
Petroutsos c06.tex V3 - 01/28/2008 12:50pm Page 205
THE LISTBOX, CHECKEDLISTBOX, AND COMBOBOX CONTROLS 205
Listing 6.13: Searching the List
Private Sub TextBox1 TextChanged( ) Handles TextBox1.TextChanged
Dim srchWord As String = TextBox1.Text.Trim
If srchWord.Length = 0 Then Exit Sub
Dim wordIndex As Integer
wordIndex = ListBox1.FindStringExact(srchWord)
If wordIndex >= 0 Then
ListBox1.TopIndex = wordIndex
ListBox1.SelectedIndex = wordIndex
Else
wordIndex = ListBox1.FindString(srchWord)
If wordIndex >= 0 Then
ListBox1.TopIndex = wordIndex
ListBox1.SelectedIndex = wordIndex
Else
Debug.WriteLine(”Item ” & srchWord &

” is not in the list”)
End If
End If
End Sub
If you search for SAC, for example, and the control contains a string such as ”SAC” or ”sac” or
”sAc”, the program will return the index of the item in the list and will report an exact match. If
no exact match can be found, the program will return something like ”SACDEF”,ifsuchastring
exists on the control, as a near match. If none of the strings on the control starts with the characters
SAC, the search will fail.
Populating the List
The Populate List button creates 10,000 random items with the help of the Random class. First, it
generates a random value in the range 1 through 20, which is the length of the string (not all strings
have the same length). Then the program generates as many random characters as the length of
the string and builds the string by appending each character to it. These random numbers are
in the range of 65 to 91 and they’re the ANSI values of the uppercase characters.
The ComboBox Control
The ComboBox control is similar to the ListBox control in the sense that it contains multiple items
and the user may select one, but it typically occupies less space onscreen. The ComboBox is
practically an expandable ListBox control, which can grow when the user wants to make a selec-
tion and retract after the selection is made. Normally, the ComboBox control displays one line
with the selected item, as this control doesn’t allow multiple item selection. The essential differ-
ence, however, between ComboBox and ListBox controls is that the ComboBox allows the user to
specify items that don’t exist in the list.
Petroutsos c06.tex V3 - 01/28/2008 12:50pm Page 206
206 CHAPTER 6 BASIC WINDOWS CONTROLS
There are three types of ComboBox controls. The value of the control’s Style property
determines which box is used; these values are shown in Table 6.4.
Table 6.4: Styles of the ComboBox Control
Value Effect
DropDown (Default) The control is made up of a drop-down list, which is visible at all times, and a

text box. The user can select an item from the list or type a new one in the text box.
DropDownList This style is a drop-down list from which the user can select one of its items but can’t
enter a new one. The control displays a single item, and the list is expanded as needed.
Simple The control includ es a text box and a list that doesn’t drop down. The user can select
from the list or type in the text box.
The ComboBox Styles project, shown in Figure 6.8, demonstrates the three styles of the
ComboBox control. This is another common element of the Windows interface, and its properties
and methods are identical to those of the ListBox control. Load the ComboBox Styles project in the
Visual Basic IDE and experiment with the three styles of the ComboBox control.
The DropDown and Simple ComboBox controls allow the user to select an item from the
list or enter a new one in the edit box of the control. Moreover, they’re collapsed by default
and they display a single item, unless the user expands the list of items to make a selection.
The DropDownList ComboBox is similar to a ListBox control in the sense that it restricts the user
to selecting an item (the user cannot enter a new one). However, it takes much less space on the
form than a ListBox does, because normally it displays a single item. When the user wants to make
a selection, the DropDownList expands to display more items. After the user has made a selection,
the list contracts to a single line again.
Figure 6.8a
The Simple ComboBox
displays a fixed number
of items at all times.
Petroutsos c06.tex V3 - 01/28/2008 12:50pm Page 207
THE LISTBOX, CHECKEDLISTBOX, AND COMBOBOX CONTROLS 207
Figure 6.8b
The DropDown
ComboBox displays a
single item, and users
can either expand the
items or type something
in the edit box.

Figure 6.8c
The DropDownList
ComboBox expands to
display its items, but
doesn’t allow users to
type anything in the
edit box.
Petroutsos c06.tex V3 - 01/28/2008 12:50pm Page 208
208 CHAPTER 6 BASIC WINDOWS CONTROLS
Most of the properties and methods of the ListBox control also apply to the ComboBox
control. The Items collection gives you access to the control’s items, and the SelectedIndices
and SelectedItems collections give you access to the items in the current selection. If the
control allows only a single item to be selected, use the properties SelectedIndex and
SelectedItem. You can also use the FindString and FindStringExact methods to locate
any item in the control.
There’s one aspect worth mentioning regarding the operation of the control. Although the edit
box at the top allows you to enter a new string, the new string doesn’t become a new item in the
list. It remains there until you select another item or you clear the edit box. You can provide some
code to make any string entered by the user in the control’s edit box be added to the list of
existing items.
The most common use of the ComboBox control is as a lookup table. The ComboBox control
takes up very little space on the form, but it can be expanded at will. You can save even more space
when the ComboBox is contracted by setting it to a width that’s too small for the longest item. Use
the DropDownWidth property, which is the width of the segment of the drop-down list. By default,
this property is equal to the control’s Width property. The second ComboBox control in Figure 6.8
contains an unusually long item. The control is wide enough to display the default selection. When
the user clicks the arrow to expand the control, the drop-down section of the control is wider
than the default width, so that the long items can be read.
Adding Items to a ComboBox at Runtime
Although the ComboBox control allows users to enter text in the control’s edit box, it doesn’t

provide a simple mechanism for adding new items at runtime. Let’s say you provide a ComboBox
with city names. Users can type the first few characters and quickly locate the desired item. But
what if you want to allow users to add new city names? You can provide this feature with two
simple techniques. The simpler one is to place a button with an ellipsis (three periods) right next
to the control. When users want to add a new item to the control, they can click the button and be
prompted for the new item.
A more-elegant approach is to examine the control’s Text property as soon as the control loses
focus, or the user presses the Enter key. If the string entered by the user doesn’t match an item on
the control, you must add a new item to the control’s Items collection and select the new item from
within your code. The FlexComboBox project demonstrates how to use both techniques in your
code. The main form of the project, which is shown in Figure 6.9, is a simple data-entry screen. It’s
not the best data-entry form, but it’s meant for demonstration purposes.
Figure 6.9
The FlexComboBox
project demonstrates
two techniques for
adding new items to
aComboBoxatruntime.
Petroutsos c06.tex V3 - 01/28/2008 12:50pm Page 209
THE LISTBOX, CHECKEDLISTBOX, AND COMBOBOX CONTROLS 209
You can either enter a city name (or country name) and press the Tab key to move to another
control or click the button next to the control to be prompted for a new city/country name. The
application will let you enter any city/country combination. You should provide code to limit
the cities within the selected country, but this is a nontrivial task. You also need to store the new
city names entered on the first ComboBox control to a file (or a database table), so users will find
them there the next time they execute the application. I haven’t made the application elaborate;
I’ve added the code only to demonstrate how to add new items to a ComboBox control at runtime.
VB 2008 At Work: The FlexCombo Project
The ellipsis button next to the City ComboBox control prompts the user for the new item via
the InputBox() function. Then it searches the Items collection of the control via the FindString

method, and if the new item isn’t found, it’s added to the control. Then the code selects the new
item in the list. To do so, it sets the control’s SelectedIndex property to the value returned by the
Items.Add method, or the value returned by the FindString method, depending on whether
the item was located or added to the list. Listing 6.14 shows the code behind the ellipsis button.
Listing 6.14: Adding a New Item to the ComboBox Control at Runtime
Private Sub Button1 Click( ) Button1.Click
Dim itm As String
itm = InputBox(”Enter new item”, ”New Item”)
If itm.Trim <> ”” Then AddElement(itm)
End Sub
The AddElement() subroutine, which accepts a string as an argument and adds it to the control,
is shown in Listing 6.15. If the item doesn’t exist in the control, it’s added to the Items collection.
If the item is a member of the Items collection, it’s selected. As you will see, the same subroutine
will be used by the second method for adding items to the control at runtime.
Listing 6.15: The AddElement() Subroutine
Sub AddElement(ByVal newItem As String)
Dim idx As Integer
If ComboBox1.FindString(newItem) > 0 Then
idx = ComboBox1.FindString(newItem)
Else
idx = ComboBox1.Items.Add(newItem)
End If
ComboBox1.SelectedIndex = idx
End Sub
You can also add new items at runtime by adding the same code in the control’s LostFocus
event handler:
Private Sub ComboBox1 LostFocus( ) Handles ComboBox1.LostFocus
Dim newItem As String = ComboBox1.Text
AddElement(newItem)
End Sub

Petroutsos c06.tex V3 - 01/28/2008 12:50pm Page 210
210 CHAPTER 6 BASIC WINDOWS CONTROLS
The ScrollBar and TrackBar Controls
The ScrollBar and TrackBar controls let the user specify a magnitude by scrolling a selector
between its minimum and maximum values. In some situations, the user doesn’t know in advance
the exact value of the quantity to specify (in which case, a text box would suffice), so your
application must provide a more-flexible mechanism for specifying a value, along with some
type of visual feedback.
The vertical scroll bar that lets a user move up and down a long document is a typical example
of the use of the ScrollBar control. The scroll bar and visual feedback are the prime mechanisms for
repositioning the view in a long document or in a large picture that won’t fit entirely in its window.
The TrackBar control is similar to the ScrollBar control, but it doesn’t cover a continuous range
of values. The TrackBar control has a fixed number of tick marks, which the developer can label
(for example, Still, Slow, and Warp Speed, as shown in Figure 6.10). Users can place the slider’s
indicator to the desired value. Whereas the ScrollBar control relies on some visual feedback outside
the control to help the user position the indicator to the desired value, the TrackBar control
forces the user to select from a range of valid values.
In short, the ScrollBar control should be used when the exact value isn’t as important as the
value’s effect on another object or data element. The TrackBar control should be used when
the user can type a numeric value and the value your application expects is a number in a specific
range; for example, integers between 0 and 100, or a value between 0 and 5 inches in steps of 0.1
inches (0.0, 0.1, 0.2 5.0). The TrackBar control is preferred to the TextBox control in similar
situations because there’s no need for data validation on your part. The user can specify only valid
numeric values with the mouse.
Figure 6.10
The TrackBar control
lets the user select one
of several discrete
values.
The ScrollBar Control

There’s no ScrollBar control per se in the Toolbox; instead, there are two versions of it: the HScroll-
Bar and VScrollBar controls. They differ only in their orientation, but because they share the same
members, I will refer to both controls collectively as ScrollBar controls. Actually, both controls
inherit from the ScrollBar control, which is an abstract control: It can be used to implement ver-
tical and horizontal scroll bars, but it can’t be used directly on a form. Moreover, the HScrollBar
and VScrollBar controls are not displayed in the Common Controls tab of the Toolbox. You have
to open the All Windows Forms tab to locate these two controls.
The ScrollBar control is a long stripe with an indicator that lets the user select a value between
the two ends of the control. The left (or bottom) end of the control corresponds to its minimum
value; the other end is the control’s maximum value. The current value of the control is determined
by the position of the indicator, which can be scrolled between the minimum and maximum
values. The basic properties of the ScrollBar control, therefore, are properly named Minimum,
Maximum,andValue.
Petroutsos c06.tex V3 - 01/28/2008 12:50pm Page 211
THE SCROLLBAR AND TRACKBAR CONTROLS 211
Minimum The control’s minimum value. The default value is 0, but because this is an
Integer value, you can set it to negative values as well.
Maximum The control’s maximum value. The default value is 100, but you can set it to any
value that you can represent with the Integer data type.
Value The control’s current value, specified by the indicator’s position.
The Minimum and Maximum properties are Integer values. To cover a range of nonintegers, you
must supply the code to map the actual values to Integer values. For example, to cover a range
from 2.5 to 8.5, set the Minimum property to 25, set the Maximum property to 85, and divide the
control’s value by 10. If the range you need is from –2.5 to 8.5, do the same but set the Minimum
property to –25 and the Maximum value to 85, and divide the Value property by 10.
There are two more properties that allow you to control the movement of the indicator: the
SmallChange and LargeChange properties. The first property is the amount by which the indicator
changes when the user clicks one of the arrows at the two ends of the control. The LargeChange
property is the displacement of the indicator when the user clicks somewhere in the scroll bar
itself. You can manipulate a scroll bar by using the keyboard as well. Press the arrow keys to

move the indicator in the corresponding direction by SmallChange, and the PageUp/PageDown
keys to move the indicator by LargeChange.
VB 2008 at Work: The Colors Project
Figure 6.11 shows the main form of the Colors sample project, which lets the user specify a color
by manipulating the value of its basic colors (red, green, and blue) through scroll bars. Each basic
color is controlled by a scroll bar and has a minimum value of 0 and a maximum value of 255. If
you aren’t familiar with color definition in the Windows environment, see the section ‘‘Specifying
Colors’’ in Chapter 19, ‘‘Manipulating Images and Bitmaps.’’
Figure 6.11
The Colors application
demonstrates the use of
the ScrollBar control.
As the scroll bar is moved, the corresponding color is displayed, and the user can easily specify
a color without knowing the exact values of its primary components. All the user needs to know
is whether the desired color contains, for example, too much red or too little green. With the help
of the scroll bars and the immediate feedback from the application, the user can easily pinpoint
the desired color. Notice that the exact values of the color’s basic components are of no practical
interest; only the final color counts.
Petroutsos c06.tex V3 - 01/28/2008 12:50pm Page 212
212 CHAPTER 6 BASIC WINDOWS CONTROLS
The ScrollBar Control’s Events
The user can change the ScrollBar control’s value in three ways: by clicking the two arrows at its
ends, by clicking the area between the indicator and the arrows, and by dragging the indicator
with the mouse. You can monitor the changes of the ScrollBar’s value from within your code by
using two events: ValueChanged and Scroll. Both events are fired every time the indicator’s
position is changed. If you change the control’s value from within your code, only the
ValueChanged event will be fired.
The Scroll event can be fired in response to many different actions, such as the scrolling of the
indicator with the mouse, a click on one of the two buttons at the ends of the scroll bars, and so
on. If you want to know the action that caused this event, you can examine the Type property of

the second argument of the event handler. The settings of the e.Type property are members of the
ScrollEventType enumeration (LargeDecrement, SmallIncrement, Track,andsoon).
Handling the Events in the Colors Application
The Colors application demonstrates how to program the two events of the ScrollBar control. The
two PictureBox controls display the color designed with the three scroll bars. The left PictureBox
is colored from within the Scroll event, whereas the other one is colored from within the
ValueChanged event. Both events are fired as the user scrolls the scrollbar’s indicator, but in
the Scroll event handler of the three scroll bars, the code examines the value of the e.Type
property and reacts to it only if the event was fired because the scrolling of the indicator has ended.
For all other actions, the event handler doesn’t update the color of the left PictureBox.
If the user attempts to change the Color value by clicking the two arrows of the scroll bars or by
clicking in the area to the left or to the right of the indicator, both PictureBox controls are updated.
While the user slides the indicator or keeps pressing one of the end arrows, only the PictureBox to
the right is updated.
The conclusion from this experiment is that you can program either event to provide
continuous feedback to the user. If this feedback requires too many calculations, which would
slow down the reaction of the corresponding event handler, you can postpone the reaction until
the user has stopped scrolling the indicator. You can detect this condition by examining the value
of the e.Type property. When it’s ScrollEventType.EndScroll, you can execute the appropriate
statements. Listing 6.16 shows the code behind the Scroll and ValueChanged events of the scroll
bar that controls the red component of the color. The code of the corresponding events of the other
two controls is identical.
Listing 6.16: Programming the ScrollBar Control’s Scroll Event
Private Sub redBar Scroll( ) Handles redBar.Scroll
If e.Type = ScrollEventType.EndScroll Then
ColorBox1()
lblRed.Text = ”RED ” & redBar.Value.ToString(”###”)
End If
End Sub
Private Sub redBar

ValueChanged( ) Handles redBar.ValueChanged
ColorBox2()
End Sub
Petroutsos c06.tex V3 - 01/28/2008 12:50pm Page 213
THE SCROLLBAR AND TRACKBAR CONTROLS 213
The ColorBox1() and ColorBox2() subroutines update the color of the two PictureBox
controls by setting their background colors. You can open the Colors project in Visual Studio and
examine the code of these two routines.
The TrackBar Control
The TrackBar control is similar to the ScrollBar control, but it lacks the granularity of ScrollBar.
Suppose that you want the user of an application to supply a value in a specific range, such as the
speed of a moving object. Moreover, you don’t want to allow extreme precision; you need only
a few settings, as shown in the examples of Figures 6.10 and 6.12. The user can set the control’s
value by sliding the indicator or by clicking on either side of the indicator.
Figure 6.12
The Inches application
demonstrates the use
of the TrackBar control
in specifying an exact
value in a specific range.
Granularity is how specific you want to be in measuring. In measuring distances between towns,
a granularity of a mile is quite adequate. In measuring (or specifying) the dimensions of a building,
the granularity could be on the order of a foot or an inch. The TrackBar control lets you set the type
of granularity that’s necessary for your application.
Similar to the ScrollBar control, SmallChange and LargeChange properties are available.
SmallChange is the smallest increment by which the Slider value can change. The user can change
the slider by the SmallChange value only by sliding the indicator. (Unlike the ScrollBar
control, there are no arrows at the two ends of the Slider control.) To change the Slider’s value by
LargeChange, the user can click on either side of the indicator.
VB 2008 at Work: The Inches Project

Figure 6.12 demonstrates a typical use of the TrackBar control. The form in the figure is an
element of a program’s user interface that lets the user specify a distance between 0 and 10 inches
in increments of 0.2 inches. As the user slides the indicator, the current value is displayed on a
Label control below the TrackBar. If you open the Inches application, you’ll notice that there are
more stops than there are tick marks on the control. This is made possible with the TickFrequency
property, which determines the frequency of the visible tick marks.
You might specify that the control has 50 stops (divisions), but that only 10 of them will be
visible. The user can, however, position the indicator on any of the 40 invisible tick marks. You can
think of the visible marks as the major tick marks, and the invisible ones as the minor tick marks.
If the TickFrequency property is 5, only every fifth mark will be visible. The slider’s indicator,
however, will stop at all tick marks.
When using the TrackBar control on your interfaces, you should set the TickFrequency
property to a value that helps the user select the desired setting. Too many tick marks are
confusing and difficult to read. Without tick marks, the control isn’t of much help. You might also
consider placing a few labels to indicate the value of selected tick marks, as I have done in
this example.
Petroutsos c06.tex V3 - 01/28/2008 12:50pm Page 214
214 CHAPTER 6 BASIC WINDOWS CONTROLS
The properties of the TrackBar control in the Inches application are as follows:
Minimum =0
Maximum =50
SmallChange =1
LargeChange =5
TickFrequency =5
The TrackBar needs to cover a range of 10 inches in increments of 0.2 inches. If you set the
SmallChange property to 1, you have to set LargeChange to 5. Moreover, the TickFrequency is
set to 5, so there will be a total of five divisions in every inch. The numbers below the tick marks
were placed there with properly aligned Label controls.
The label at the bottom needs to be updated as the TrackBar’s value changes. This is signaled to
the application with the Change event, which occurs every time the value of the control changes,

either through scrolling or from within your code. The ValueChanged event handler of the
TrackBar control is shown next:
Private Sub TrackBar1 ValueChanged( )
Handles TrackBar1.ValueChanged
lblInches.Text = ”Length in inches = ” &
Format(TrackBar1.Value / 5, ”#.00”)
End Sub
The Label controls below the tick marks can also be used to set the value of the control. Every
time you click one of the labels, the following statement sets the TrackBar control’s value. Notice
that all the Label controls’ Click events are handled by a common handler:
Private Sub Label Click( )
Handles Label1.Click, Label9.Click
TrackBar1.Value = sender.text * 5
End Sub
The Bottom Line
Use the TextBox control as a data-entry and text-editing tool. The TextBox control is the
most common element of the Windows interface, short of the Button control, and it’s used
to display and edit text. You can use a TextBox control to prompt users for a single line of
text (such as a product name) or a small document (a product’s detailed description).
Master It What are the most important properties of the TextBox control? Which ones
would you set in the Properties windows at design-time?
Master It How will you implement a control that suggests lists of words matching the
characters entered by the user?
Use the ListBox, CheckedListBox, and ComboBox controls to present lists of items. The
ListBox control contains a list of items from which the user can select one or more, depending
on the setting of the SelectionMode property.
Master It How will you locate an item in a ListBox control?
Petroutsos c06.tex V3 - 01/28/2008 12:50pm Page 215
THE BOTTOM LINE 215
Use the ScrollBar and TrackBar controls to e nable users to specify sizes and positions with

the mouse. The ScrollBar and TrackBar controls let the user specify a magnitude by scrolling
a selector between its minimum and maximum values. The ScrollBar control uses some visual
feedback to display the effects of scrolling on another entity, such as the current view in a long
document.
Master It Which event of the ScrollBar control would you code to provide visual feedback to
the user?
Petroutsos c06.tex V3 - 01/28/2008 12:50pm Page 216
Petroutsos c07.tex V3 - 01/28/2008 1:11pm Page 217
Chapter 7
Working with Forms
In Visual Basic, the form is the container for all the controls that make up the user interface. When
a Visual Basic application is executing, each window it displays on the desktop is a form. The
terms form and window describe t he same entity. A window is what the user sees on the desktop
when the application is running. A form is the same entity at design time. The proper term is a
Windows form, as opposed to a web form,butIwillrefertothemasforms. This term includes both
the regular forms and dialog boxes, which are simple forms you use for very specific actions, such
as to prompt the user for a particular piece of data or to display critical information. A dialog box
is a form with a small number of controls, no menus, and usually an OK and a Cancel button to
close it.
Forms have a built-in functionality that is always available without any programming effort on
your part. You can move a form around, resize it, and even cover it with other forms. You do so
with the mouse or with the keyboard through the Control menu.
In previous chapters, you concentrated on placing the elements of the user interface on forms,
setting their properties, and adding code behind selected events. Now, you’ll look at forms
themselves and at a few related topics. In this chapter, you’ll learn how to do the following:
◆ Use forms’ properties
◆ Design applications with multiple forms
◆ Design dynamic f orms
◆ Design menus
Forms have many trivial properties that won’t be discussed here. Instead, let’s jump directly to

the properties that are unique to forms and then look at how to manipulate forms from within an
application’s code.
The Appearance of Forms
Applications are made up of one or more forms — usually more than one. You should craft your
forms carefully, make them functional, and keep them simple and intuitive. You already know
how to place controls on the form, but there’s more to designing forms than populating them with
controls. The main characteristic of a form is the title bar on which the form’s caption is displayed
(see Figure 7.1).
Clicking the icon on the left end of the title bar opens the Control menu, which contains the
commands shown in Table 7.1. On the right end of the title bar are three buttons: Minimize,
Maximize, and Close. Clicking these buttons performs the associated function. When a form is
Petroutsos c07.tex V3 - 01/28/2008 1:11pm Page 218
218 CHAPTER 7 WORKING WITH FORMS
maximized, the Maximize button is replaced by the Restore button. When clicked, the Restore
button resets t he form to the size and position before it was maximized, and it’s replaced by the
Maximize button. To access the Control menu without a mouse, press Alt and then the down
arrow key.
Figure 7.1
The elements of the
form
Table 7.1: Commands of the Control Menu
Command Effect
Restore Restores a maximized form to the size it was before it was maximized; available only if the
form has been maximized.
Move Lets the user move the form around with the arrow keys.
Size Lets the user resize the form with the arrow keys.
Minimize Minimizes the form.
Maximize Maximizes the form.
Close Closes the current form. (Closing the application’s main form terminates the application.)
Properties of the Form Object

You’re familiar with the appearance of forms, even if you ha ven’t programmed in the Windows
environment in the past; you have seen nearly all types of windows in the applications you’re
Petroutsos c07.tex V3 - 01/28/2008 1:11pm Page 219
THE APPEARANCE OF FORMS 219
using every day. The floating toolbars used by many graphics applications, for example, are actu-
ally forms with a narrow title bar. The dialog boxes that display critical information or prompt
you t o select the file to be opened are also forms. You can duplicate the look of any window or
dialog box through the following properties of the Form object.
AcceptButton, CancelButton
These two properties let you specify the default Accept and Cancel buttons. The Accept button
is the one that’s automatically activated when you press Enter, no matter which control has the
focus at t he time, and is usually the button with the OK caption. Likewise, the Cancel button is
the one that’s automatically activated when you hit the Esc key and is usually the button with the
Cancel caption. To specify the Accept and Cancel buttons on a form, locate the AcceptButton and
CancelButton properties of the form and select the corresponding controls from a drop-down
list, which contains the names of all the buttons on the form. For more information on these two
properties, see the section ‘‘Forms versus Dialog Boxes,’’ later in this chapter.
AutoScaleMode
This property determines how t he control is scaled, and its value is a member of the AutoScale-
Mode enumeration: None (automatic scaling is disabled), Font (the controls on the form are scaled
relative to the size of their font), Dpi, which stands for dots per inch (the controls on the form are
scaled relative to the display resolution), and Inherit (the controls are scaled according to the
AutoScaleMode property of their parent class). The default value is Font; if you change the form’s
font size, the controls on it are scaled to the new font size.
AutoScroll
The AutoScroll property is a True/False value that indicates whether scroll bars w ill be auto-
matically attached to the form (as seen in Figure 7.2) if the form is resized to a point that not all
itscontrolsarevisible.Usethispropertytodesign large forms without having to worry about
the resolution o f the monitor on which they’ll b e displayed. The AutoScroll property is used in
conjunction with two other properties (described a little later in this section): AutoScrollMargin

and AutoScrollMinSize. Note that the AutoScroll property applies to a few controls as well,
including the Panel and SplitContainer controls. For example, you can create a form with a fixed
and a scrolling pane by placing two Panel controls on it and setting the AutoScroll property of
one of them (the Panel you want to scroll) to True.
AutoScrollPosition
This property is available from within your code only (you can’t set this property at design time),
and it indicates the number of pixels that the form was scrolled up or down. Its initial value is
zero, and it assumes a value when t he user scrolls the form (provided that the form’s AutoScroll
property is True). Use this property to find out t he visible controls from within your code, or scroll
the form programmatically to bring a specific control into view.
AutoScrollMargin
This is a margin, expressed in pixels, that’s added around all the controls on the form. If the form
is smaller than the rectangle that encloses all the controls adjusted by the margin, the appropriate
scroll bar(s) will be displayed automatically.

×