Flex 3 scrollToIndex帮助

时间:2009-11-10 02:48:47

标签: flex combobox

我正在尝试根据通过键盘事件输入的文本搜索组合框。搜索正在运行并且正在选择正确的结果但我似乎无法使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}"/>

2 个答案:

答案 0 :(得分:1)

如果event.targetmx.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") )

玩得开心!