Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
(ebook) Visual Studio .NET Mastering Visual Basic.pdf
Скачиваний:
120
Добавлен:
17.08.2013
Размер:
15.38 Mб
Скачать

THE LISTBOX, CHECKEDLISTBOX, AND COMBOBOX CONTROLS 275

If you search for “SAC”, for example, and the control begins with a string like “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”, if such a string 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 code (shown in Listing 6.14) generates as many random characters as the length of the string and builds the string. This random number is in the range from 65 to 91; these are the ANSI values of the uppercase characters.

Listing 6.14: Populating a List with Random Strings

Protected Sub PopulateButton_Click(ByVal sender As Object, _ ByVal e As System.EventArgs)

Dim wordLen As Integer

Dim NWords As Integer = 9999 Dim rnd As System.Random rnd = New System.Random() Dim rndChar As Char

Dim thisWord As String Dim i, j As Integer For i = 0 To NWords

wordLen = CInt(rnd.NextDouble * 20 + 1) thisWord = “”

For j = 0 To wordLen

rndchar = Chr(65 + CInt(rnd.Next, 25)) thisWord = thisWord & rndChar

Next ListBox1.Items.Add(thisWord)

Next End Sub

The ComboBox Control

The ComboBox control is similar to the ListBox control in the sense that it contains multiple items of which the user may select one, but it typically occupies less space on-screen. The ComboBox is practically an expandable ListBox control, which can grow when the user wants to make a selection and retract after the selection is made. Normally, the ComboBox control displays one line with the selected item. The real difference, however, between ComboBox and ListBox controls is that the ComboBox allows the user to specify items that don’t exist in the list. Moreover, the Text property of the ComboBox is read-only at runtime, and you can locate an item by assigning a value to the control’s Text property.

Copyright ©2002 SYBEX, Inc., Alameda, CA

www.sybex.com

276 Chapter 6 BASIC WINDOWS CONTROLS

Three types of ComboBox controls are available in Visual Basic.NET. The value of the control’s Style property, whose values are shown in Table 6.3, determines which box is used.

Table 6.3: Styles of the ComboBox Control

Value

Effect

DropDown

(Default) The control is made up of a drop-down list 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.

Simple

The control includes 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 ComboBoxStyles project in this chapter’s folder on the CD (see Figure 6.9) demonstrates the three styles of the ComboBox control. It’s a common element of the Windows interface, and its properties and methods are identical to those of the ListBox control. Load the ComboBoxStyles project in the Visual Basic IDE and experiment with the three styles of the ComboBox control.

Figure 6.9

The ComboBoxStyles project demonstrates the various 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.

The DropDownList ComboBox is similar to a ListBox control in the sense that it restricts the user to selecting an item, but not entering a new one. However, it takes much less space on the form than a ListBox. 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.

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, then use the properties SelectedIndex and SelectedItem. You can also use the FindString and FindStringExact methods to locate any items in the control.

Copyright ©2002 SYBEX, Inc., Alameda, CA

www.sybex.com

THE LISTBOX, CHECKEDLISTBOX, AND COMBOBOX CONTROLS 277

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. It remains there until you select another item or you clear the edit box.

The most common use of the ComboBox control 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 control that’s dropped down. By default, this property is equal to the Width property. Figure 6.10 shows a ComboBox control with a couple of unusually long items. 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. The control on the left is shown in its normal state, with a width of 130 pixels. The drop-down segment of the control is 240 pixels wide. You will have to experiment a little to find the ideal value of the DropDownWidth property.

Figure 6.10

The ComboBox control’s Width and DropDownWidth properties

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 very 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 it loses focus. If the string entered by the user doesn’t match an item on the control, then you must add a new item to the control’s Items collection and select the new item from within your code. The FlexComboBox project on the CD demonstrates how to use both techniques in your code. The main form of the project, which is shown in Figure 6.11, is a simple data-entry screen. It’s not the best data-entry form, but it’s meant for demonstration purposes.

Figure 6.11

The FlexComboBox project demonstrates two techniques for adding new items to a ComboBox at runtime.

Copyright ©2002 SYBEX, Inc., Alameda, CA

www.sybex.com

278 Chapter 6 BASIC WINDOWS CONTROLS

The ComboBox that displays countries isn’t updateable; it’s populated at design time and can’t accept new items, so you must populate it with all the country names. The ComboBox that displays cities is updateable. You can either enter a city 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 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 non-trivial task. You also need to store the new city names entered on the first ComboBox control to a file (or a database table), so that users will find them there the next time they execute the application. I’m not going to make the application really elaborate; I’ll only add the code to demonstrate how to add new items to a ComboBox control at runtime.

The button with the ellipsis next to the City ComboBox control prompts the user for the new item with the InputBox() function. Then it searches the Items collection of the control with the Items.IndexOf 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 Items.IndexOf method, depending on whether the item was located, or added to the list. Listing 6.15 shows the code behind the button with the ellipsis.

Listing 6.15: Adding a New Item to the ComboBox Control at Runtime

Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click

Dim itm As String

itm = InputBox(“Enter new item”, “New Item”) If itm <> “” Then AddElement(itm)

End Sub

The AddElement() subroutine, which accepts a string as argument and adds it to the control, is shown in Listing 6.16. As you will see, the same subroutine will be used by the second method for adding items to the control at runtime.

Listing 6.16: The AddElement() Subroutine

Sub AddElement(ByVal newItem As String) Dim idx As Integer

If Not ComboBox1.Items.Contains(newItem) Then idx = ComboBox1.Items.Add(newItem)

Else

idx = ComboBox1.Items.IndexOf(newItem) End If

ComboBox1.SelectedIndex = idx End Sub

Copyright ©2002 SYBEX, Inc., Alameda, CA

www.sybex.com