Программный Файл: ...\Samples\Solution\Controls\Combobox\Lookup.scx

Данный пример демонстрирует добавление введенного пользователем текста в Список контрола combo-box и обеспечивает возможность поиска необходимого Элемента в указанном списке.

Добавление Пользовательского Фрагмента Текста в Список Combo Box

Контрол типа Combo Box позволяет вводить требуемое Значение или выбирать уже заданные Значения из раскрывающегося Списка (Drop-Down-List). Вы можете также определить новое Значение в Списке Контрола на основании введенного текстового Значения, поэтому Пользователю не нужно будет вводить одно и тоже значение несколько раз (при переодическом выполнении ОписываемыхОпераций).

В зависимости от варианта определения ключевого Свойства RowSourceType рассматриваемого контрола Combo Box существует несколько различных способов дополнения нового Элемента в Список рассматриваемого Контрола. В текущем примере: RowSourceType = 1 -  (по-значению). Если пользователем введено в Текстовый элемент Контрола новое  Значение, то в представленном далее фрагменте программного кода выполняется добавление нового элемента в Список контрола (в значение свойства RowSource добавляется запятая и новая текстовая строка):

  CopyCode imageКопировать Код
cCountryName = ALLTRIM(Custs.Country)
IF ATC(m.cCountryName,THIS.RowSource)=0 AND !EMPTY(m.cCountryName)
THIS.RowSource=THIS.RowSource+","+m.cCountryName
ENDIF

Контрол типа Combo Box в Примере программной обработки Текста использует установку значения свойства RowSourceType = 0 - (нет источника). В представленном далее фрагменте программного кода, ассоциированного с событием Valid для объекта cboSearchString (смотрите пример формы: ...\Samples\Solution\Controls\TXT_EDT\Text.scx) выполняется добавление нового элемента в Список контрола на основании введенного Значения в текстовый элемент Контрола:

  CopyCode imageКопировать Код
IF !EMPTY(THIS.Text)
FOR i = 1 TO THIS.ListCount
IF THIS.List(i) = THIS.Text
RETURN
ENDIF
ENDFOR
THIS.AddItem(THIS.Text)
ENDIF

Если определяющее свойство RowSource рассматриваемого контрола Combo Box указывает на Массив, вам необходимо обеспечить добавления введенного Текста как элемент Массива, и выполнить метод Requery - для обновления состава раскрывающегося Списка.

Если рассматриваемое свойство RowSource указывает на Таблицу или Курсор, вам требуется обеспечить либо добавление новой записи, ли выполнение команды REPLACE - для пустой записи, и также выполнить обновление Списка Контрола (выполнение Метода Requery).

Обеспечение Поиска Требуемых Данных

Дополнительно к иллюстрации Добавления элемента в список контрола Combo Box, в данном примере демонстрируется один из возможных путей фильтрации выбираемых групп Записей соответственно уточняемому значению Фильтра. Пользователь может выполнить следующее:

  • Ввести некоторое Значение в текстовый элемент контрола ComboBox.

  • Выбрать одно из значений в раскрывающемся Списке.

  • Ввести начальную часть поискового Значения для выполнения динамического Поиска.

Ввод Значения в Текстовый Элемент контрола Combo Box

Представленный далее программный код ассоциирован с Событием LostFocus контрола cboCombo. После завершения ввода Пользователем требуемого значения, в событии LostFocus выполняется заполнение курсора данных в соответствие с выполненным выбором и определяется значение свойства RecordSource для Объекта типа Grid (grdCust), где выбранные данные отображаются.

  CopyCode imageКопировать Код
cDisplayValue = ALLTRIM(THIS.DisplayValue)

IF THIS.Value = "(All)"
SELECT country AS location,* FROM CUSTOMER;
INTO CURSOR Custs
thisform.grdcust.recordsource = "Custs"
ELSE
SELECT country AS location,* FROM CUSTOMER ;
WHERE UPPER(ALLTRIM(Customer.Country)) = UPPER(m.cDisplayValue);
INTO CURSOR Custs
THISFORM.grdCust.RecordSource = "Custs"
ENDIF

Выбор требуемого Значения из раскрывающегося Списка (Drop-Down-List)

В основном, программный Код для Поиска Значения связывается со стандартным Событием InteractiveChange рассматриваемого контрола cboDrop – Если выбирается значение "(All)" - Все, тогда все записи из представленного Курсора выбираются в Результирующий набор Данных, иначе, выбираются только Записи данных, соответствующие пользовательскому Выбору.

Определение частичных Значений для Поиска по-возрастанию (Incremental Search)

Далее представлен фрагмент программного кода для События InteractiveChange контрола cboIntSearch, обеспечивающего динамический Поиск требуемого Значения при вводе каждого символа в Текстовый элемент контрола ComboBox.

  CopyCode imageКопировать Код
#DEFINE DELKEY 127
LPARAMETERS nKeyCode, nShiftAltCtrl
LOCAL cDisplayValue
IF nKeyCode = DELKEY
cDisplayValue = ALLTRIM(THIS.DisplayValue)
IF LEN(m.cDisplayValue)=1
cDisplayValue = ""
ELSE
cDisplayValue = LEFT(cDisplayValue,LEN(cDisplayValue)-1)
ENDIF
ELSE
cDisplayValue = ALLTRIM(THIS.DisplayValue)+CHR(nKeyCode)
ENDIF
THISFORM.LockScreen = .T.
DO CASE
CASE EMPTY(m.cDisplayValue)
THISFORM.grdCust.RecordSource = " "
CASE THIS.Value = "(All)"
SELECT country AS location,* FROM CUSTOMER;
INTO CURSOR Custs
THISFORM.grdCust.RecordSource = "Custs"
OTHERWISE
SELECT country AS location,* FROM CUSTOMER ;
WHERE UPPER(ALLTRIM(Customer.Country)) = UPPER(m.cDisplayValue);
INTO CURSOR Custs
THISFORM.grdCust.RecordSource = "Custs"
ENDCASE
THISFORM.ResetCombos(THIS)
THISFORM.LockScreen = .F.

См. также