PDA

Просмотр полной версии : Фильтрация данных в editable ComboBox


Alex_41
13.08.2009, 20:21
Привет. Возникла необходимость реализации инкрементного поиска (фильтрации данных в комбобоксе) аля гугл, для этого наиболее подходящим был выбран компонент ComboBox с выставленным свойством Editable=true, данные полностью помещаються в коллекцию, запихиваються в комбобокс и фильтруются при помощи "filterFunction", фильтр накладывается при воде каких либо символов.
Но возникла такая проблема, при применении фильтра к коллекции, у комбобокса меняется дата провайдер и введенный текст соответственно тоже удалялся, даже если запоминать введенный символ до наложения фильтра и заполнять поле ввода после наложения фильтра, то происходит выделение этого символа и последующее продолжение ввода удаляет предыдущий введенный текст, потому что он выделен, а программно убрать выделение или управлять кареткой в эдитейбл поле комбобокса нельзя. Накопление введенных символов не предлагать. Надеюсь понятно изложил суть проблемы, какие варианты решения можете подсказать?

wvxvw
13.08.2009, 20:29
>> а программно убрать выделение или управлять кареткой в эдитейбл поле комбобокса нельзя
Это почему же? - это же обычный TextField. Просто надо поискать, как до него добраться...

Alex_41
14.08.2009, 02:50
>> а программно убрать выделение или управлять кареткой в эдитейбл поле комбобокса нельзя
Это почему же? - это же обычный TextField. Просто надо поискать, как до него добраться...
С пары тыков не получилось, погуглил, ничего толком не нашел, решил спросить тут. Будем копать.

Добавлено через 11 часов 42 минуты
решение найдено

package classes.common
{
import flash.events.KeyboardEvent;

import mx.collections.ArrayCollection;
import mx.controls.ComboBox;

public class CustomCombobox extends ComboBox
{
private var tmpText: String;

public function CustomCombobox()
{
super();
addEventListener(KeyboardEvent.KEY_UP, function(event: KeyboardEvent):void{
tmpText = event.currentTarget.text;

dataProvider.filterFunction = producerListFilterFunction;
dataProvider.refresh();

text = tmpText;

if(dataProvider.length > 0)
open();
} );
}

private function producerListFilterFunction(item:Object):Boolean{
return !Boolean(String(item.label).toUpperCase().indexOf(text.toUpperCase(), 0));
}

override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void{
super.updateDisplayList(unscaledWidth, unscaledHeight);

if (editable){
textInput.selectionBeginIndex = text.length;
textInput.selectionEndIndex = text.length;
}
}
}
}

wvxvw
14.08.2009, 15:19
http://www.adobe.com/cfusion/exchange/index.cfm?event=extensionDetail&extid=1047291

Оказалось, был готовый :)