我正在尝试根据通过键盘事件输入的文本搜索组合框。搜索正在运行并且正在选择正确的结果但我似乎无法使scrollToIndex找到应该是找到结果的正确项目(i)。它滚动到输入的最后一个字母,我相信它是组合框的默认行为。我想我错误地指的是事件目标。新手撕掉我的头发。你能帮我吗?谢谢。这是功能:
private function textin(event:KeyboardEvent):void
{
var combo:ComboBox = event.target as ComboBox;
var source:XMLListCollection = combo.dataProvider as XMLListCollection;
str += String.fromCharCode(event.charCode);
if (str=="") {
combo.selectedIndex = 0;
}
for (var i:int=0; i<source.length; i++) {
if ( source[i].@name.match(new RegExp("^" + str, "i")) ) {
combo.selectedIndex = i;
event.target.scrollToIndex(i);
break;
}
}
}
控制:
<mx:ComboBox keyDown="textin(event);" id="thislist" change="processForm();" dataProvider="{xmllist}"/>
答案 0 :(得分:1)
如果event.target
是mx.control.ComboBox
,则它没有scrollToIndex
方法,这是mx.controls.ListBase
中定义的方法,ComboBox
不会不继承。检查ComboBox的api参考。你在这里想要达到的结果究竟是什么?如果设置了ComboBox的选定索引,则应显示该索引处的项目。
编辑:尝试替换event.target.scrollToIndex(i)
(无论如何都应该抛出错误)并将其替换为event.stopImmediatePropagation()
。这应该可以防止默认密钥处理程序触发和覆盖事件处理程序。
答案 1 :(得分:0)
这是一个解决方案,基于Kerri的代码和Ryan Lynch的建议。归功于此。
它对我有用,所以我会把完整的代码留给后代。 :)
import com.utils.StringUtils;
import flash.events.KeyboardEvent;
import flash.events.TimerEvent;
import flash.utils.Timer;
import mx.collections.ArrayCollection;
import mx.controls.ComboBox;
public class ExtendedComboBox extends ComboBox
{
private var mSearchText : String = "";
private var mResetStringTimer : Timer;
public function ExtendedComboBox()
{
super();
mResetStringTimer = new Timer( 1000 );
mResetStringTimer.addEventListener( TimerEvent.TIMER, function() : void { mResetStringTimer.stop(); mSearchText = ""; } );
}
override protected function keyDownHandler( aEvent : KeyboardEvent ):void
{
if( aEvent.charCode < 32 )
{
super.keyDownHandler( aEvent );
return;
}
var lComboBox : ComboBox = aEvent.target as ComboBox;
var lDataProvider : ArrayCollection = lComboBox.dataProvider as ArrayCollection;
mSearchText += String.fromCharCode( aEvent.charCode );
if ( StringUtils.IsNullOrEmpty( mSearchText ) )
{
lComboBox.selectedIndex = 0;
aEvent.stopImmediatePropagation();
return;
}
if( mResetStringTimer.running )
mResetStringTimer.reset();
mResetStringTimer.start();
for ( var i : int = 0; i < lDataProvider.length; i++ )
{
if ( lDataProvider[i].label.match( new RegExp( "^" + mSearchText, "i") ) )
{
lComboBox.selectedIndex = i;
aEvent.stopImmediatePropagation();
break;
}
}
}
}
此解决方案需要ArrayCollection作为dataProvider,并使用名为“label”的字段进行搜索。您可以创建一个变量来存储字段的名称,并像这样使用它:
lDataProvider[i][FIELD_NAME_HERE].match( new RegExp( "^" + mSearchText, "i") )
玩得开心!