Фильтрация в t*dropdown*
Модератор: Модераторы
Фильтрация в t*dropdown*
Как в полях, имеющих выпадающий список (tdropdownlisteditdb, tenumeditdb и т.п.), при вводе символов отфильтровывать значение выпадающего списка?
На примере приложенного изображения:
Как сделать чтобы при вводе в tdropdownlisteditdb символов "Мос" из выпадающего списка исчезала строчка с Ярославлем?
На примере приложенного изображения:
Как сделать чтобы при вводе в tdropdownlisteditdb символов "Мос" из выпадающего списка исчезала строчка с Ярославлем?
- Вложения
-
- dropdown-need.png (4.38 КБ) 37113 просмотров
-
- dropdown.png (3.75 КБ) 37113 просмотров
Последний раз редактировалось t-ea 24.08.2013 12:17:47, всего редактировалось 2 раза.
- debi12345
- долгожитель
- Сообщения: 5761
- Зарегистрирован: 10.05.2006 23:41:15
- Откуда: Ташкент (Узбекистан)
Легко делается на списках, увязанных на LOOKUPBUFFERы. Тогда можно назначить коллбэк на DROPDOWN.OnFilter, ниже - пример кода такого обработчика :
Методы лукап-буфферов подробно расписаны (Вашим покорным слугой) в MSEUNIVERSE :
Код: Выделить всё
procedure tform6editfo.officecodefilter(const sender: tcustomlookupbuffer;
const physindex: Integer; var valid: Boolean);
begin
if form6viewfo.fldOfficeType.isnull
then valid:= false
else
valid:= sender.integervalue[0,physindex] = form6viewfo.fldOfficeType.value;
end;
Методы лукап-буфферов подробно расписаны (Вашим покорным слугой) в MSEUNIVERSE :
Код: Выделить всё
mseuniverse\attic\msedocumenting\mse\trunk\help\doc\msehelp.txtAnother possibility is to use TDataset.OnFilterRecord with t*editdb. Though using t*editlb.onfilter and a tdblookupbuffer or a tsqllookupbuffer as debi12345 writes is more recommended.
От меня что-то скрывают.
Я пробовал, и c lookupbuffer, и с OnFilter, но ничего не получалось.
Сейчас ещё раз попробовал, и опять не фильтрует так, как я хочу.
Вот прикладываю, то на чём тренируюсь. Можете подсказать, где и что надо дописать?
Я пробовал, и c lookupbuffer, и с OnFilter, но ничего не получалось.
Сейчас ещё раз попробовал, и опять не фильтрует так, как я хочу.
Вот прикладываю, то на чём тренируюсь. Можете подсказать, где и что надо дописать?
- Вложения
-
- test.zip
- (8.39 КБ) 839 скачиваний
I don't understand the example, sorry. Can you write what you want to achieve, maybe there is a better solution?
Some comments:
- You use ddLB1.Text. Maybe you should use t*edit.value instead? t*edit.text changes by every key stroke so the filter condition changes while the dropdownlist already has been showed, that probably will not work reliable.
- You use ddDB1.ontextedited to switch dataset.filtered state. ontextedited fires by every keystroke so the filtered state changes while the dropdownlist already has been showed, that probably will not work reliable.
- You use the deprecated tmsememdataset, please use tlocaldataset instead.
Some comments:
- You use ddLB1.Text. Maybe you should use t*edit.value instead? t*edit.text changes by every key stroke so the filter condition changes while the dropdownlist already has been showed, that probably will not work reliable.
- You use ddDB1.ontextedited to switch dataset.filtered state. ontextedited fires by every keystroke so the filtered state changes while the dropdownlist already has been showed, that probably will not work reliable.
- You use the deprecated tmsememdataset, please use tlocaldataset instead.
mse писал(а):- You use the deprecated tmsememdataset, please use tlocaldataset instead.
Это только для этого примера, для своей программы я использую tsqlquery.
mse писал(а):- You use ddDB1.ontextedited to switch dataset.filtered state. ontextedited fires by every keystroke so the filtered state changes while the dropdownlist already has been showed, that probably will not work reliable.
Вот-вот, а мне и надо, чтобы dropdownlist сокращался по мере ввода. То есть, на каждый ввод символа dropdownlist фильтровался.
Я ввёл 'м', dropdownlist = ['москва', 'мурманск']
Я ввёл 'а' (ddDB1.Text = 'ма'), dropdonwlist сократился до ['мурманск'].
Ouch, this is complicated. Do you really need it? Did you notice that the row cursor in the dropdownlist automatically follows the entered text?
mse писал(а):Do you really need it?
Да.
Например, в моём списке находятся:
"Отдел УФМС России по Волгоградской области в Кировском районе …"
"Отдел УФМС России по Волгоградской области в Тракторозаводском районе …"
"Отдел УФМС России по Воронежской области в Россошанском районе …"
То же самое с "Территориальный пункт ОУФМС России по …".
Различия между ними начинаются только с 20-го, 30-го, 50-го символов. И таких "Отделов УФМС…", "ОУФМС…" очень много, они не все даже помещаются в dropdownlist.
Также, в базу могут занести "ОВД" вместо "Отдел внутренних дел", "гор." вместо "г." и наоборот.
В итоге между возможными правильными наименованиями может быть много лишних записей.
А так я ввёл "мур" и в списке у меня остались только "ОУФМС Мурманска", "Мурманский ОУФМС" и ещё какой-нибудь "Муром".
Then probably it is better to use a tdropdownwidgetedit and to implement the searching and filtering independent of the existing left to right character locating in tdropdownlistcontroller. I'll try to make an example.
Последний раз редактировалось mse 22.08.2013 14:39:22, всего редактировалось 1 раз.
Or t*lookupbuffer.
А если просто добавить какую-нибудь процедуру которая позволяла бы заново вызывать OnFilter ?
То есть, у меня был бы обработчик
То есть, у меня был бы обработчик
Код: Выделить всё
procedure tmainfo.OnTextEditedDropdownListEditLB(const sender: tcustomedit;
var atext: msestring);
begin
…
DoAgainOnFilter;
end;
есть делфи вариант http://stackoverflow.com/questions/6667054/how-can-i-filter-the-contents-of-a-combo-box-based-on-whats-been-typed
Что мешает Вам самим организовать подобный фильтр. Ведь смысл прост. Держим два списка. Из одного тянем что надо, второй показывает.
Что мешает Вам самим организовать подобный фильтр. Ведь смысл прост. Держим два списка. Из одного тянем что надо, второй показывает.
