PDA

Просмотр полной версии : Комбобокс с вводом значения вручную


arimi
02.04.2015, 06:12
Добрый день. Помогите, пожалуйста, настроить комбобокс так, чтобы можно выбирать элементы не только из выпадающего списка, но и начинать набор с клавиатуры, а из выпадающего списка оставались бы только те строки, которые имеют такое же начало. У меня список городов. Т.е. чтобы при клике выпадал весь список (там очень много), а при вводе, например, "с" - оставались только "самара", "саратов", "санкт-петербург", при дальнейшем вводе "сам" - оставалась только "самара".

cityCB.dataProvider = new DataProvider(cityArray);
cityCB.addEventListener(Event.CHANGE, cityChoosen);
cityCB.editable = true;
cityCB.prompt = "Choose";
cityCB.addEventListener(TextEvent.TEXT_INPUT, inputEventCapture);

function cityChoosen(event:Event):void {
var a:int = cityArray.indexOf(cityCB.selectedItem.label);
}

Вроде и editable стоит true, но все равно при стирании и попытке ручного ввода выдает
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at MethodInfo-392()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at fl.controls::ComboBox/onTextInput()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at fl.controls::TextInput/handleChange()

Понимаю, что где-то нужно ставить листенер на ввод с клавиатуры, но к чему его цеплять и как? Не получается.

silin
03.04.2015, 21:52
поиграться со списком можно в CHANGE текстфилда,
но не развалится ли остальная логика комбобокса не могу гарантировать - очень уж он мутный, как и все адобовские компоненты
package
{
import fl.controls.ComboBox;
import fl.data.DataProvider;
import flash.display.Sprite;
import flash.events.Event;


public class Main extends Sprite
{
private var cityCB:ComboBox;
private var cityArray:Array = ["самара", "саратов", "санкт-петербург"];

public function Main():void
{

cityCB = new ComboBox();
addChild(cityCB);

cityCB.dataProvider = new DataProvider(cityArray);

cityCB.editable = true;
cityCB.prompt = "Choose";


cityCB.textField.addEventListener(Event.CHANGE, cityCB_textField_change);

}



private function cityCB_textField_change(e:Event):void
{

var arr:Array = [];
var text:String = cityCB.text;


if (text == "")// для пустой строки - полный список
{

arr = cityArray;

}else// для какой-либо строки - список совпадений
{

for each(var item:String in cityArray)
{


if (item.substr(0, text.length) == text)
{
arr.push(item);
}

}


}

cityCB.dataProvider = new DataProvider(arr);
cityCB.drawNow();


}


}

}

dimarik
03.04.2015, 22:20
Если у DataProvider есть filterFunction, то нужно сделать через него.
UPD. Посмотрел на fl.data.DataProvider (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/fl/data/DataProvider.html). Не предоставляет оно фильтрацию.