ComboBox實現輸入自動過濾

package com.beyondsoft   
{   
    import flash.events.Event;   
       
    import mx.collections.ArrayCollection;   
    import mx.controls.Alert;   
    import mx.controls.ComboBox;   
    import mx.events.FlexEvent;   
    import mx.utils.StringUtil;   
       
    /**  
     * ComboBox過濾自動完成組件  
     * @author 韓敬諾   
     *   
     */  
    public class AutoCompleteComboBox extends ComboBox   
    {   
        public function AutoCompleteComboBox()   
        {   
            if(!width){   
                //如果沒有指定width則設置默認的寬度   
                width=120;   
            }   
            setStyle("paddingLeft","0");   
            selectedIndex=-1;   
            editable=true;   
            addEventListener("creationComplete",init);   
        }   
        private var ac:ArrayCollection;//保存數據源   
           
        /**  
         *   
         * @param event  
         *   
         */  
        private function init(event:Event):void{   
            ac=dataProvider as ArrayCollection;   
        }   
        /**  
         * 重寫下三角按鈕的點擊事件  
         * @param event  
         *   
         */  
        override protected function downArrowButton_buttonDownHandler(event:FlexEvent):void{   
            dataProvider=ac;   
            super.downArrowButton_buttonDownHandler(event);   
        }   
        /**  
         * 當輸入框中的值發生變化時開始過濾  
         * @param event  
         *   
         */  
        override protected function textInput_changeHandler(event:Event):void{   
            super.textInput_changeHandler(event);   
            //當數據源不爲空並且關鍵字不爲空時開始搜索數據源   
            if(ac){   
                var keyWord:String=StringUtil.trim(textInput.text);   
                if(keyWord){   
                    searchKeyWord(keyWord);    
                }   
            }   
        }   
        /**  
         *   
         * @param keyWord關鍵字  
         *   
         */  
        private function searchKeyWord(keyWord:String):void{   
            var dp:ArrayCollection=filterData(ac);   
            //當數據源改變的時候   
            if(dp.length>0){   
                dataProvider=dp;   
                dropdown.selectedIndex=-1;   
                dropdown.verticalScrollPosition=0;   
                textInput.setFocus();   
                //注意先設置關鍵字被選中後打開下拉列表   
                textInput.setSelection(keyWord.length,keyWord.length);   
                open();   
            }else{   
                dataProvider=ac;   
                textInput.text="";   
                selectedIndex=-1;   
                close();   
            }   
        }   
        /**  
         *   
         * @param item  
         * @return   
         *   
         */  
        private function filterData(ac:ArrayCollection):ArrayCollection{   
            var dp:ArrayCollection=new ArrayCollection();   
            for(var i:int=0;i<ac.length;i++){   
                var item:Object=ac.getItemAt(i);   
                if(item.hasOwnProperty(labelField)){   
                    var value:String=item[labelField];   
                    if(value.indexOf(textInput.text)!=-1){   
                        dp.addItem(item);   
                    }   
                }   
            }   
            return dp;   
        }   
    }   
}  

 

 

網上雖然有很多例子,但是寫的都有很多bug,因此自己動手寫了個組件。出現了一個難點就是如何點擊下三角的時候數據源全部出來,看了ComboBox後才知道是這個方法downArrowButton_buttonDownHandler,因此重寫這個方法就ok了。

思路:1監聽textInput_changeHandler事件

          2 對數據源進行過濾

          3 重寫下三角的點擊事件

 

以上代碼不是FLEX4的代碼,使用時需改動

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章