2009-11-10 7 views
1

키보드 이벤트를 통해 입력 한 텍스트를 기반으로 콤보 상자를 검색하려고합니다. 검색이 작동하고 올바른 결과를 선택하고 있지만 찾을 수있는 올바른 항목을 찾을 수있는 scrollToIndex 얻이 수없는 결과 (i). 그것은 내가 콤보 박스의 기본 동작이라고 생각하는 마지막 글자로 스크롤하는 것입니다. 나는 내가 이벤트 목표를 잘못 말하고 있다고 생각한다. 초보자가 내 머리를 찢어. 도울 수 있니? 고맙습니다. 다음은 함수는 다음과 같습니다플렉스 3 scrollToIndex 도움말

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][email protected](new RegExp("^" + str, "i"))) { 
    combo.selectedIndex = i; 
    event.target.scrollToIndex(i); 
    break; 
    } 

} 
} 

제어 : event.targetmx.control.ComboBox 그때는 ComboBox가 상속하지 않습니다 mx.controls.ListBase에 정의 된 방법입니다 scrollToIndex 방법을 가지고 있지 않습니다이다

<mx:ComboBox keyDown="textin(event);" id="thislist" change="processForm();" dataProvider="{xmllist}"/> 
+0

왜 코드를 가져 오는 키보드 이벤트의 대상이 ComboBox입니까? 그게 이벤트라고 확신합니까? 타겟? 코드의 나머지 부분을 게시하면 도움이 될 것입니다. –

답변

1

경우 에서. ComboBox에 대한 API 참조를 확인하십시오. 여기서 얻으려고하는 결과는 정확히 무엇입니까? ComboBox의 선택된 인덱스를 설정하면 해당 인덱스에 항목이 표시됩니다.

편집 :event.target.scrollToIndex(i) (어쨌든 오류가 발생 함)을 교체하고 event.stopImmediatePropagation()으로 바꿉니다. 이렇게하면 기본 키 핸들러가 이벤트 처리기를 시작하고 재정의하는 것을 막아야합니다.

+0

고마워, 라이언. selectedIndex는 해당 인덱스에 항목을 성공적으로 표시합니다. ComboBox가 ListBase에서 상속 한 어딘가를 읽은 것 같습니다. selectedIndex 아래에 합리적인 목록을 표시하려고합니다. 따라서 Anagram이 (Airline, Anagaram, Ant, Apple, Orange, Pear, Nukes) 목록에서 선택된 항목이면 Nukes가 아닌 "n"을 입력하면 Ant가 스크롤의 다음 항목이됩니다. – Kerri

+0

당신이 여기서 성취하려는 것을 이해하고 있다고 생각합니다. 사용자가 텍스트를 입력하는 컨트롤은 무엇입니까? 컨트롤을 보여주는 코드와 이벤트 처리기를 어떻게 첨부했는지 게시하십시오. 이미 게시 한 코드의 형식을 고칠 수 있다면 좋을 것입니다. 올바르게 포맷되지 않은 행 앞에 공백을 추가하기 만하면됩니다. –

+0

약간 청소 해 보았고 마지막에는 컨트롤이 어떻게 보이는지 추가했습니다. 기본적으로 사용자가 콤보 상자를 통해 긴 목록을 검색하고 찾아 볼 수있게하려고합니다. 일단 선택되면 양식을 처리합니다. 콤보 상자가 닫히고 다시 열리면 목록은 예상 한대로 선택한 항목 아래에 올바른 순서로 표시됩니다. – Kerri

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"이라는 필드를 검색하려고합니다. 필드 이름을 저장하는 변수를 만들면 다음과 같이 사용할 수 있습니다.

재미있게 보내십시오!