我正在尝试根据通过键盘事件输入的文本搜索组合框。搜索正在工作,并且选择了正确的结果,但我似乎无法让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}"/>发布于 2009-11-10 11:12:08
如果event.target是一个mx.control.ComboBox,那么它就没有scrollToIndex方法,该方法是在mx.controls.ListBase中定义的方法,ComboBox不会继承它。请查看ComboBox的api参考。你在这里想要达到的结果到底是什么?如果您设置了ComboBox的选定索引,则应显示该索引处的项目。
EDIT:尝试替换event.target.scrollToIndex(i) (无论如何都会抛出错误),并将其替换为event.stopImmediatePropagation()。这将防止默认的键处理程序触发和重写您的事件处理程序。
发布于 2011-08-06 20:35:56
这里有一个解决方案,基于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;
}
}
}
}这个解决方案需要一个标签作为标签,并使用一个名为“dataProvider”的字段来执行搜索。您可以创建一个变量来存储字段的名称,并按如下方式使用它:
lDataProvider[i][FIELD_NAME_HERE].match( new RegExp( "^" + mSearchText, "i") )玩得开心!
https://stackoverflow.com/questions/1705359
复制相似问题