The information in this article applies to:
- Microsoft Visual FoxPro for Windows, versions 3.0 and 3.0b
SUMMARY
When using multiple page pageframes, you may find it useful to populate a
list box on a following page with the values selected from a multiple-
select list box on a previous page.
This article demonstrates how to fill the first multiple-select list box
from an array created by an SQL SELECT statement and then take the user's
selections from this list box to fill the second list box on another page
of the pageframe.
The form has a command button that resets the multiple-select list so that
the user can start making selections on a clean unselected list. Initially,
this button is disabled; it becomes enabled when at least one selection is
made in the multiple-select list box. When the user clicks the button to
reset the list, the command button again becomes disabled.
The form also checks whether a selection was made on the first list. If no
items are chosen in the first list, the display value of the second list
shows "No Selection Made" in the list. This feature is optional.
MORE INFORMATION
NOTE: To select multiple items from a multiple-select list, hold down the
CTRL key while clicking with the mouse. To select a contiguous range of
items, click first item in the range, and then hold down the SHIFT key as
you click the last item.
Step-by-Step Example
- Create a new form.
- In the form designer, choose New Property from the Form menu. Enter the
following array in the name box. Then click OK:
aSelected(1)
Again choose New Property from the Form menu. Enter the variable that
will be used to count the selected items in the name box. Then click OK:
nCount
- Right-click the form, and select Data Environment. Then right-click the
Data Environment window, and click Add. Click the Other button, and add
the Employee table from the \VFP\Samples\Data directory.
- Add a page frame to the form by selecting the PageFrame control from the
Form Controls toolbar and clicking the form. Resize the page frame if
needed.
- Right-click the page frame, and select Edit. A hatched border is drawn
around the page frame.
- Right-click Page1 and select Properties. Select the All tab from the
Properties sheet, and add the following code to the listed events for
Page1 of the page frame:
Activate event:
Thisform.nCount=0 && Reset nCount when page is selected
Thisform.aSelected=" " && Reinitialize array to empty string
DIMENSION Thisform.aSelected(1) && Redimension array to one element
FOR i=1 TO This.List1.ListCount && Loop through number items in List
IF This.List1.Selected=.T. && If an item is selected in List,
This.List1.Selected=.F. && the Selected property is .T.
ENDIF
ENDFOR
This.List1.ListIndex=0 && Reset the index number of List box
This.List1.RowSource=This.List1.RowSource
This.Refresh && Force List and Form to refresh
Deactivate event:
This.Command1.Enabled=.F.
LOCAL narraycnt
narraycnt=1
FOR i=1 TO This.List1.ListCount && Loop through Selected array, if
IF This.List1.Selected(i)=.T. && true, increment nCount variable.
Thisform.nCount=Thisform.nCount+1
ENDIF
ENDFOR
IF Thisform.nCount=0 && No selection made, set nCount=1
Thisform.nCount=1
Thisform.aSelected(Thisform.nCount)="No Selection Made!"
ENDIF
DIMENSION Thisform.aSelected(Thisform.nCount) && Dimension array
FOR i=1 TO This.List1.Listcount && Loop through items in List,
IF This.List1.Selected(i)=.T. && if Selected-look at List property
Thisform.aSelected(narraycnt)=This.List1.List(i)
narraycnt=narraycnt+1
ENDIF
ENDFOR
- With the pageframe still in edit mode, add a list box to Page1 of the
page frame by selecting the ListBox control from the Form Controls
toolbar and clicking Page1.
- Right-click the list box and select Properties, or click the Properties
window if it is already available. Select the All tab from the
Properties sheet, and modify the following properties and events:
RowSource - Enter the following on one, single line:
SELECT DISTINCT Employee.Title from Testdata!Employee ORDER BY
Employee.Title INTO CURSOR mlist WHERE NOT EMPTY(Employee.Title)
RowSourceType: 3 - SQL Statement
MultiSelect: .T.
Click Event:
This.Parent.Command1.Enabled=.T. && Enable 'RESET' button
- Add a command button to page 1 while the page frame is in edit mode.
Configure the command button with the following properties and events:
Caption: Reset List
Click Event:
This.Parent.List1.ListIndex=0 && Reset ListIndex property
This.Parent.List1.RowSource=This.Parent.List1.RowSource
This.Parent.Refresh && Refresh List and Page
This.Enabled=.F. && Disable 'RESET' button
This.Parent.List1.Setfocus && Put focus on list
- With the page frame in edit mode, click the Page2 tab on the page
frame. Add the following events to Page2 of the pageframe:
Activate event:
This.List1.Requery && Issue Requery to display/refresh
- Add a list box to Page2 with the following properties:
RowSource: Thisform.aSelected
RowSourceType: 5 - Array
|