Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Интерактивный поиск в комбобоксе  [new]
dima_18
Member

Откуда:
Сообщений: 318
Всем добрый день!

Будьте добры пожалуйста, подскажите ответ на следующий вопрос.
У меня есть комбобокс, и он завязан на таблице, я по данному комбобоксу (нажатием на него) ищу нужную запись.
Таблица и записей очень много.
Как можно сделать интерактивный поиск в нем.
т.е. ввожу символ и сразу инерактивно отфильтровываются записи.
Аналогично как я делаю в текстовом поле.

Я поставил обработчик на interactivechange и как только начинаю набивать что-то у меня в гриде запись выбирается:

SELECT narush2
Locate for Alltrim(ThisFormSet.Form1.Text1.Value) $ ALLTRIM(narush2.fio)
if found()
ThisFormSet.rec_zap1 = RECNO()
GO ThisFormSet.rec_zap1
*ThisFormSet.Form1.grdLech_uch.column2.text1.backcolor = rgb(229,229,229)
ThisFormSet.Form1.Gridmash.Column1.SetFocus
ThisFormSet.Form1.Text1.SetFocus
endif

Спасибо большое
13 сен 18, 13:43    [21673513]     Ответить | Цитировать Сообщить модератору
 Re: Интерактивный поиск в комбобоксе  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1370
dima_18
Всем добрый день!

Будьте добры пожалуйста, подскажите ответ на следующий вопрос.
У меня есть комбобокс, и он завязан на таблице, я по данному комбобоксу (нажатием на него) ищу нужную запись.
Таблица и записей очень много.
Много записей и комбо - уже что-то в консерватории не так.
Как можно сделать интерактивный поиск в нем.
В общем-то, он уже там есть. Возможно, он не такой как тебе нужно, но есть.
т.е. ввожу символ и сразу инерактивно отфильтровываются записи.
Фильтрация и поиск - несколько разные операции. И где отфильтровываться? В комбо? А в коде ниже вроде уже грид?
Аналогично как я делаю в текстовом поле.
Мы НЕ ЗНАЕМ как ты это делаешь.

Я поставил обработчик на interactivechange и как только начинаю набивать что-то у меня в гриде запись выбирается:

SELECT narush2
Locate for Alltrim(ThisFormSet.Form1.Text1.Value) $ ALLTRIM(narush2.fio)
if found()
ThisFormSet.rec_zap1 = RECNO()
GO ThisFormSet.rec_zap1
*ThisFormSet.Form1.grdLech_uch.column2.text1.backcolor = rgb(229,229,229)
ThisFormSet.Form1.Gridmash.Column1.SetFocus
ThisFormSet.Form1.Text1.SetFocus
endif

Спасибо большое
Какая-то мешанина... Да еще и с переводом фокуса после каждой клавиши..
13 сен 18, 14:10    [21673570]     Ответить | Цитировать Сообщить модератору
 Re: Интерактивный поиск в комбобоксе  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7813
dima_18,

Вы не корректно используете термины, чем вводите и себя и других в заблуждение

В терминах FoxPro

Фильтр - отобразить (выбрать) только те записи, которые удовлетворяют критериям фильтрации
Поиск - переместить указатель записи к первой попавшейся записи, удовлетворяющей критериям поиска

Если Вы хотите чтобы при поиске также и фильтровались записи, то это надо оговаривать отдельно, поскольку в FoxPro при поиске количество отображаемых записей не меняется

Существующий механизма работы ListBox (то, что отображается как раскрывающийся список ComboBox) предусматривает поиск по первым символам. Т.е. пользователь вводит первые символы, а в ListBox указатель автоматически переходит на первую запись, у которой первые символы равны тому значению, которое ввел пользователь. Поскольку при этом, как правило, список упорядочен по возрастанию, то все значения списка, начинающиеся на эти символы оказываются рядом и пользователю не сложно найти нужное

То, что Вы написали в коде - это поиск по фрагменту строки. И этот фрагмент может быть в любом месте строки. Функционалом FoxPro такое не предусмотрено. Вам придется делать собственную форму поиска.

Кроме того, то, что Вы написали в коде для пользователя имеет смысл в одном единственном случае, если введенный им фрагмент для поиска - уникален. Если же такие фрагменты встречаются несколько раз, то подобный механизм не упростит, а усложнит поиск нужной записи

Для пример, представьте, что у Вас есть такие записи

"123_А_456"
"123_Б_456"
"123_В_456"
"123_Г_456"
"123_Д_456"
"123_Е_456"
"123456_А_"

Теперь пользователь вводит в качестве критерия поиска букву А. Команда Locate как и положено, находит первую запись "123_А_456" и переводит на нее указатель записи. Вроде, все хорошо? А как пользователь сможет найти последнюю запись"123456_А_"? А никак! Ведь отображены по прежнему ВСЕ записи, а последняя запись вне области видимости списка. Ну, и зачем нужен такой поиск?

Для подобных задач используют фильтрацию записей. Т.е. необходимо не перейти к первой попавшейся записи, а отфильтровать (отобрать) только записи, удовлетворяющие условиям отбора.

Стандартный объект ComboBox такого сделать не может. Для Grid сделать можно.
14 сен 18, 09:56    [21674394]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить