2010-09-07 65 views
0

我有一個應用程序,用戶在標題窗口彈出窗口中將所需信息放入文本輸入中,並將輸入的數據發送到數據網格中。這是我第一次調用彈出窗口並輸入信息時,它工作正常。問題出在這裏:下一次我調用組件彈出並彈出彈出窗口上的任何位置(包括textInputs)時,數組中的第一項會自動輸入到textInput中,用戶應該自己輸入數據(順便說一下,這個textInput也是一個自動完成的組件)。除非用戶自己輸入數據,否則我想要的只是輸入textinput。我一直在調整它幾個小時,並陷入困境。任何建議將不勝感激。組件在需要之前從數組中獲取項目

下面的代碼: (這是主頁)

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" 
    creationComplete="init()" > 

<mx:Script> 
    <![CDATA[ 
     import mx.managers.PopUpManager; 
      import mx.collections.ArrayCollection; 
      import mx.core.IFlexDisplayObject; 
      import com.AddTrade; 

      [Bindable]public var dgItems:ArrayCollection = new ArrayCollection(); 

      private var addTradeScreen:AddTrade; 



private function init():void 
{ 
    addTradeScreen = new AddTrade(); 
    addTradeScreen.addEventListener("SaveTrade", saveTrade); 
} 

private function addTrade():void 
{ 
    PopUpManager.addPopUp(addTradeScreen, this, true); 
    PopUpManager.centerPopUp(addTradeScreen); 
    addTradeScreen.country.text = ""; 
    addTradeScreen.Notes.text =""; 
    addTradeScreen.myDate.text=""; 


} 

private function saveTrade(e:Event):void 
{ 
    var trade:Trade= new Trade(); 
    trade.country = addTradeScreen.country.text; 
    trade.myDate = addTradeScreen.myDate.text; 
    trade.direction = addTradeScreen.combo.text; 
    dgItems.addItem(trade); 
    PopUpManager.removePopUp(addTradeScreen); 
} 

    public function deleteItem(event:MouseEvent):void 
        { 
         dgItems.removeItemAt(myDG.selectedIndex); 
         dgItems.refresh(); 
        } 


    public function myColStyleFunc(data:Object,col:AdvancedDataGridColumn):Object 
       { 
        if(data["myProfit"]<0) 
        { 
         return {color:0xFF0000}; 
        } 
        else 
        { 
         return null; 
        } 
       } 



     ]]> 
    </mx:Script> 

<mx:AdvancedDataGrid x="10" y="10" dataProvider="{dgItems}" id="myDG" variableRowHeight="true" wordWrap="true" tabIndex="12" editable="false" height="429" width="942" doubleClickEnabled="true"> 
    <mx:columns> 
     <mx:AdvancedDataGridColumn width="120" headerText="Country:" dataField="country"/> 
     <mx:AdvancedDataGridColumn width="120" headerText="Date:" dataField="myDate"/>   
     <mx:AdvancedDataGridColumn width="160" headerText="Notes:" dataField="tradeNotes"/> 
     <mx:AdvancedDataGridColumn width="129" headerText="Delete" > 
      <mx:itemRenderer> 
       <mx:Component id="deleteButton" > 
      <mx:Image click="outerDocument.deleteItem(event)" buttonMode="true" source="@Embed(source='Assets/trash2.png')" scaleContent="false" verticalAlign="middle" horizontalAlign="center" width="30" height="30"/> 
       </mx:Component> 
      </mx:itemRenderer> 
     </mx:AdvancedDataGridColumn> 
    </mx:columns> 
</mx:AdvancedDataGrid> 
<mx:Button x="733" y="447" click="addTrade();" label="Add New Trade" height="36" width="219" fontSize="14"/> 

這裏的彈出組件代碼:

    <mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" 
        layout="absolute" width="422" height="294" 
        title="Log Ur Trade" showCloseButton="true" close="close(event)" 
        xmlns:comp="com.adobe.flex.extras.controls.*" 
        initialize="data1 = new ArrayCollection(countries); 
      data2 = new ArrayCollection(countries);"> 


        <mx:Metadata> 
     [Event(name="SaveTrade")] 
     </mx:Metadata> 

     <mx:Script> 
      <![CDATA[ 
       import mx.managers.PopUpManager; 
       import mx.events.CloseEvent; 
       import mx.events.FlexEvent; 
       import mx.collections.ArrayCollection; 



     [Bindable] private var data1: ArrayCollection; 
     [Bindable] private var data2: ArrayCollection; 



     [Bindable]   
     public var countries: Array = [ 
             {id: 0, name:"Monaco"}, 
             {id: 1, name:"Macau"}, 
             {id: 2, name:"Hong Kong"}, 
             {id: 3, name:"Singapore"}, 
             {id: 4, name:"Gibraltar"}, 
             {id: 5, name:"Vatican City"}, 
             {id: 6, name:"Malta"}, 
             {id: 7, name:"Bermuda"}, 
             {id: 8, name:"Maldives"}, 
             {id: 9, name:"Bahrain"}, 
             {id: 10, name:"Bangladesh"}, 
             {id: 11, name:"Channel Islands"}, 
             {id: 12, name:"Nauru"}, 
             {id: 13, name:"Taiwan"}, 
             {id: 14, name:"Barbados"}, 
             {id: 15, name:"Palestinian territories"}, 
             {id: 16, name:"Mauritius"}, 
             {id: 17, name:"Aruba"}, 
             {id: 18, name:"South Korea"}, 
             {id: 19, name:"San Marino"}, 
             {id: 20, name:"Puerto Rico"}, 
             {id: 21, name:"Tuvalu"}, 
             {id: 22, name:"Netherlands"}, 
             {id: 23, name:"Martinique"}, 
             {id: 24, name:"Comoros"}, 
             {id: 25, name:"Lebanon"}, 
             {id: 26, name:"Rwanda"}, 
             {id: 27, name:"Marshall Islands"}, 
             {id: 28, name:"Belgium"}, 
             {id: 29, name:"Japan"}, 
             {id: 30, name:"India"}, 
             {id: 31, name:"El Salvador"}, 
             {id: 32, name:"American Samoa"}, 
             {id: 33, name:"U.S. Virgin Islands"}, 
             {id: 34, name:"Sri Lanka"}, 
             {id: 35, name:"R union"}, 
             {id: 36, name:"Guam"}, 
             {id: 37, name:"Haiti"}, 
             {id: 38, name:"Saint Vincent and the Grenadines"}, 
             {id: 39, name:"Israel"}, 
             {id: 40, name:"Saint Lucia"}, 
             {id: 41, name:"Philippines"}, 
             {id: 42, name:"Burundi"}, 
             {id: 43, name:"Guadeloupe"}, 
             {id: 44, name:"Grenada"}, 
             {id: 45, name:"Trinidad and Tobago"}, 
             {id: 46, name:"Vietnam"}, 
             {id: 47, name:"United Kingdom"}, 
             {id: 48, name:"Jamaica"}, 
             {id: 49, name:"Germany"}, 
             {id: 50, name:"Netherlands Antilles"}, 
             {id: 51, name:"Liechtenstein"}, 
             {id: 52, name:"Pakistan"}, 
             {id: 53, name:"Italy"}, 
             {id: 54, name:"North Korea"}, 
             {id: 55, name:"Nepal"}, 
             {id: 56, name:"Antigua and Barbuda"}, 
             {id: 57, name:"Dominican Republic"}, 
             {id: 58, name:"Luxembourg"}, 
             {id: 59, name:"Seychelles"}, 
             {id: 60, name:"Switzerland"}, 
             {id: 61, name:"Northern Mariana Islands"}, 
             {id: 62, name:"Cayman Islands"}, 
             {id: 63, name:"Saint Kitts and Nevis"}, 
             {id: 64, name:"Sao Tome and Principe"}, 
             {id: 65, name:"Federated States of Micronesia"}, 
             {id: 66, name:"Kuwait"}, 
             {id: 67, name:"British Virgin Islands"}, 
             {id: 68, name:"Andorra"}, 
             {id: 69, name:"Nigeria"}, 
             {id: 70, name:"People's Republic of China"}, 
             {id: 71, name:"Tonga"}, 
             {id: 72, name:"Kiribati"}, 
             {id: 73, name:"The Gambia"}, 
             {id: 74, name:"Anguilla"}, 
             {id: 75, name:"Isle of Man"}, 
             {id: 76, name:"Czech Republic"}, 
             {id: 77, name:"Denmark"}, 
             {id: 78, name:"Cape Verde"}, 
             {id: 79, name:"Thailand"}, 
             {id: 80, name:"Moldova"}, 
             {id: 81, name:"Uganda"}, 
             {id: 82, name:"Poland"}, 
             {id: 83, name:"Indonesia"}, 
             {id: 84, name:"Guatemala"}, 
             {id: 85, name:"Tokelau"}, 
             {id: 86, name:"Portugal"}, 
             {id: 87, name:"Slovakia"}, 
             {id: 88, name:"France (Metropolitan)"}, 
             {id: 89, name:"Albania"}, 
             {id: 90, name:"Malawi"}, 
             {id: 91, name:"Hungary"}, 
             {id: 92, name:"Togo"}, 
             {id: 93, name:"Serbia"}, 
             {id: 94, name:"Dominica"}, 
             {id: 95, name:"Syria"}, 
             {id: 96, name:"Cuba"}, 
             {id: 97, name:"Armenia"}, 
             {id: 98, name:"Austria"}, 
             {id: 99, name:"Azerbaijan"}, 
             {id: 100, name:"Slovenia"}, 
             {id: 101, name:"Turkey"}, 
             {id: 102, name:"Ghana"}, 
             {id: 103, name:"Romania"}, 
             {id: 104, name:"Cyprus"}, 
             {id: 105, name:"Spain"}, 
             {id: 106, name:"Costa Rica"}, 
             {id: 107, name:"Greece"}, 
             {id: 108, name:"Croatia"}, 
             {id: 109, name:"Republic of Macedonia"}, 
             {id: 110, name:"Cambodia"}, 
             {id: 111, name:"Wallis and Futuna"}, 
             {id: 112, name:"Sierra Leone"}, 
             {id: 113, name:"Ukraine"}, 
             {id: 114, name:"Malaysia"}, 
             {id: 115, name:"Bosnia and Herzegovina"}, 
             {id: 116, name:"Cook Islands"}, 
             {id: 117, name:"Benin"}, 
             {id: 118, name:"Myanmar"}, 
             {id: 119, name:"Egypt"}, 
             {id: 120, name:"Qatar"}, 
             {id: 121, name:"Morocco"}, 
             {id: 122, name:"Ethiopia"}, 
             {id: 123, name:"Bulgaria"}, 
             {id: 124, name:"Iraq"}, 
             {id: 125, name:"Samoa"}, 
             {id: 126, name:"Brunei"}, 
             {id: 127, name:"Honduras"}, 
             {id: 128, name:"Georgia"}, 
             {id: 129, name:"French Polynesia"}, 
             {id: 130, name:"Jordan"}, 
             {id: 131, name:"East Timor"}, 
             {id: 132, name:"Tunisia"}, 
             {id: 133, name:"Turks and Caicos Islands"}, 
             {id: 134, name:"Swaziland"}, 
             {id: 135, name:"Uzbekistan"}, 
             {id: 136, name:"Senegal"}, 
             {id: 137, name:"Lesotho"}, 
             {id: 138, name:"Ireland"}, 
             {id: 139, name:"Kenya"}, 
             {id: 140, name:"te d'Ivoire"}, 
             {id: 141, name:"Mexico"}, 
             {id: 142, name:"United Arab Emirates"}, 
             {id: 143, name:"Lithuania"}, 
             {id: 144, name:"Burkina Faso"}, 
             {id: 145, name:"Belarus"}, 
             {id: 146, name:"Ecuador"}, 
             {id: 147, name:"Fiji"}, 
             {id: 148, name:"Bhutan"}, 
             {id: 149, name:"Afghanistan"}, 
             {id: 150, name:"Tajikistan"}, 
             {id: 151, name:"Montenegro"}, 
             {id: 152, name:"Montserrat"}, 
             {id: 153, name:"Guinea-Bissau"}, 
             {id: 154, name:"Palau"}, 
             {id: 155, name:"Panama"}, 
             {id: 156, name:"Nicaragua"}, 
             {id: 157, name:"Iran"}, 
             {id: 158, name:"Tanzania"}, 
             {id: 159, name:"Saint Helena"}, 
             {id: 160, name:"Colombia"}, 
             {id: 161, name:"Yemen"}, 
             {id: 162, name:"South Africa"}, 
             {id: 163, name:"Guinea"}, 
             {id: 164, name:"Eritrea"}, 
             {id: 165, name:"Latvia"}, 
             {id: 166, name:"Cameroon"}, 
             {id: 167, name:"Djibouti"}, 
             {id: 168, name:"Faroe Islands"}, 
             {id: 169, name:"Zimbabwe"}, 
             {id: 170, name:"Madagascar"}, 
             {id: 171, name:"United States"}, 
             {id: 172, name:"Estonia"}, 
             {id: 173, name:"Liberia"}, 
             {id: 174, name:"Venezuela"}, 
             {id: 175, name:"Kyrgyzstan"}, 
             {id: 176, name:"Laos"}, 
             {id: 177, name:"Mozambique"}, 
             {id: 178, name:"Democratic Republic of the Congo"}, 
             {id: 179, name:"Saint-Pierre and Miquelon"}, 
             {id: 180, name:"The Bahamas"}, 
             {id: 181, name:"Brazil"}, 
             {id: 182, name:"Peru"}, 
             {id: 183, name:"Chile"}, 
             {id: 184, name:"Sweden"}, 
             {id: 185, name:"Uruguay"}, 
             {id: 186, name:"Equatorial Guinea"}, 
             {id: 187, name:"Vanuatu"}, 
             {id: 188, name:"Solomon Islands"}, 
             {id: 189, name:"Finland"}, 
             {id: 190, name:"Zambia"}, 
             {id: 191, name:"Paraguay"}, 
             {id: 192, name:"New Zealand"}, 
             {id: 193, name:"Sudan"}, 
             {id: 194, name:"Argentina"}, 
             {id: 195, name:"Algeria"}, 
             {id: 196, name:"Pitcairn Islands"}, 
             {id: 197, name:"Somalia"}, 
             {id: 198, name:"Angola"}, 
             {id: 199, name:"New Caledonia"}, 
             {id: 200, name:"Papua New Guinea"}, 
             {id: 201, name:"Norway"}, 
             {id: 202, name:"Belize"}, 
             {id: 203, name:"Republic of the Congo"}, 
             {id: 204, name:"Saudi Arabia"}, 
             {id: 205, name:"Niger"}, 
             {id: 206, name:"Mali"}, 
             {id: 207, name:"Turkmenistan"}, 
             {id: 208, name:"Russia"}, 
             {id: 209, name:"Bolivia"}, 
             {id: 210, name:"Oman"}, 
             {id: 211, name:"Chad"}, 
             {id: 212, name:"Central African Republic"}, 
             {id: 213, name:"Niue"}, 
             {id: 214, name:"Kazakhstan"}, 
             {id: 215, name:"Gabon"}, 
             {id: 216, name:"Guyana"}, 
             {id: 217, name:"Libya"}, 
             {id: 218, name:"Canada"}, 
             {id: 219, name:"Botswana"}, 
             {id: 220, name:"Mauritania"}, 
             {id: 221, name:"Iceland"}, 
             {id: 222, name:"Suriname"}, 
             {id: 223, name:"Australia"}, 
             {id: 224, name:"Namibia"}, 
             {id: 225, name:"French Guiana"}, 
             {id: 226, name:"Mongolia"}, 
             {id: 227, name:"Western Sahara"}, 
             {id: 228, name:"Falkland Islands"}, 
             {id: 229, name:"Greenland"} 
      ]; 


     private function save():void 
      { 
       this.dispatchEvent(new Event("SaveTrade")); 
      } 

     private function close(evt:CloseEvent):void 
      { 
       PopUpManager.removePopUp(this); 
      } 
      ]]> 
     </mx:Script> 


    <mx:Button x="197" y="203" label="Submit" width="114" id="submitTrade" click="save()" tabIndex="11"/>     
    <mx:TextArea x="12" y="118" height="107" id="Notes" tabIndex="10" fontStyle="normal"/> 
     <mx:Label x="10" y="97" text="Notes:" fontWeight="bold" height="18" fontFamily="Georgia" fontSize="12"/> 
      <mx:DateField x="83" y="40" width="89" height="20" id="myDate" tabIndex="2"/> 
       <mx:Label x="10" y="42" text="Date:" fontWeight="bold" height="20" width="87" fontFamily="Georgia"/> 
    <comp:AutoCompleteModified 
       width="80" 
       dataProvider="{data2}" 
       labelField="name" 
       x="83" y="68" height="21" id="country" tabIndexChange="2" tabIndex="3"/> 
      <mx:Label x="10" y="70" text="Instrument:" width="75" fontWeight="bold" fontFamily="Georgia"/> 
    <mx:ComboBox id = "combo" x="83" y="10" width="89" rowCount="2" tabIndex="1"> 
     <mx:ArrayCollection> 
       <mx:String>Long</mx:String> 
       <mx:String>Short</mx:String> 
     </mx:ArrayCollection> 
    </mx:ComboBox> 
      <mx:Label x="10" y="12" text="Direction:" width="65" fontWeight="bold" fontFamily="Georgia"/> 

最後的自動完成功能的代碼組件(AutocompleteModified):

package com.adobe.flex.extras.controls 
{ 
    import flash.events.Event; 
    import flash.events.FocusEvent; 
    import flash.events.KeyboardEvent; 
    import flash.net.SharedObject; 
    import flash.ui.Keyboard; 

    import mx.collections.ListCollectionView; 
import mx.controls.ComboBox; 
import mx.core.UIComponent; 

[Event(name="typedTextChange", type="flash.events.Event")] 


public class AutoCompleteModified extends ComboBox 
    { 


public function AutoCompleteModified() 
{ 
    super(); 

    //Make ComboBox look like a normal text field 
    editable = true; 
    if(keepLocalHistory) 
     addEventListener("focusOut",focusOutHandler); 

    setStyle("arrowButtonWidth",0); 
    setStyle("fontWeight","normal"); 
    setStyle("cornerRadius",0); 
    setStyle("paddingLeft",0); 
    setStyle("paddingRight",0); 
    rowCount = 7; 
} 


private var cursorPosition:Number=0; 


private var prevIndex:Number = -1; 


private var removeHighlight:Boolean = false;  


private var showDropdown:Boolean=false; 


private var showingDropdown:Boolean=false; 


private var tempCollection:Object; 


private var usingLocalHistory:Boolean=false; 


private var dropdownClosed:Boolean=true; 


//---------------------------------- 
// editable 
//---------------------------------- 
/** 
* @private 
*/ 
override public function set editable(value:Boolean):void 
{ 
    //This is done to prevent user from resetting the value to false 
    super.editable = true; 
} 
/** 
* @private 
*/ 
override public function set dataProvider(value:Object):void 
{ 
    super.dataProvider = value; 
    if(!usingLocalHistory) 
     tempCollection = value; 
} 

//---------------------------------- 
// labelField 
//---------------------------------- 
/** 
* @private 
*/ 
override public function set labelField(value:String):void 
{ 
    super.labelField = value; 

    invalidateProperties(); 
    invalidateDisplayList(); 
} 


//-------------------------------------------------------------------------- 
// 
// Properties 
// 
//-------------------------------------------------------------------------- 


//---------------------------------- 
// filterFunction 
//---------------------------------- 

/** 
* @private 
* Storage for the filterFunction property. 
*/ 
private var _filterFunction:Function = defaultFilterFunction; 

/** 
* @private 
*/ 
private var filterFunctionChanged:Boolean = true; 

[Bindable("filterFunctionChange")] 
[Inspectable(category="General")] 

/** 
* A function that is used to select items that match the 
* function's criteria. 
* A filterFunction is expected to have the following signature: 
* 
* <pre>f(item:~~, text:String):Boolean</pre> 
* 
* where the return value is <code>true</code> if the specified item 
* should displayed as a suggestion. 
* Whenever there is a change in text in the AutoComplete control, this 
* filterFunction is run on each item in the <code>dataProvider</code>. 
* 
* <p>The default implementation for filterFunction works as follows:<br> 
* If "AB" has been typed, it will display all the items matching 
* "AB~~" (ABaa, ABcc, abAc etc.).</p> 
* 
* <p>An example usage of a customized filterFunction is when text typed 
* is a regular expression and we want to display all the 
* items which come in the set.</p> 
* 
* @example 
* <pre> 
* public function myFilterFunction(item:~~, text:String):Boolean 
* { 
*  public var regExp:RegExp = new RegExp(text,""); 
*  return regExp.test(item); 
* } 
* </pre> 
* 
*/ 
public function get filterFunction():Function 
{ 
    return _filterFunction; 
} 

/** 
* @private 
*/ 
public function set filterFunction(value:Function):void 
{ 
    //An empty filterFunction is allowed but not a null filterFunction 
    if(value!=null) 
    { 
     _filterFunction = value; 
     filterFunctionChanged = true; 

     invalidateProperties(); 
     invalidateDisplayList(); 

     dispatchEvent(new Event("filterFunctionChange")); 
    } 
    else 
     _filterFunction = defaultFilterFunction; 
} 

//---------------------------------- 
// filterFunction 
//---------------------------------- 

/** 
* @private 
* Storage for the keepLocalHistory property. 
*/ 
private var _keepLocalHistory:Boolean = false; 

/** 
* @private 
*/ 
private var keepLocalHistoryChanged:Boolean = true; 

[Bindable("keepLocalHistoryChange")] 
[Inspectable(category="General")] 

/** 
* When true, this causes the control to keep track of the 
* entries that are typed into the control, and saves the 
* history as a local shared object. When true, the 
* completionFunction and dataProvider are ignored. 
* 
* @default "false" 
*/ 
public function get keepLocalHistory():Boolean 
{ 
    return _keepLocalHistory; 
} 

/** 
* @private 
*/ 
public function set keepLocalHistory(value:Boolean):void 
{ 
    _keepLocalHistory = value; 
} 

//---------------------------------- 
// lookAhead 
//---------------------------------- 

/** 
* @private 
* Storage for the lookAhead property. 
*/ 
private var _lookAhead:Boolean=false; 

/** 
* @private 
*/ 
private var lookAheadChanged:Boolean; 

[Bindable("lookAheadChange")] 
[Inspectable(category="Data")] 

/** 
* lookAhead decides whether to auto complete the text in the text field 
* with the first item in the drop down list or not. 
* 
* @default "false" 
*/ 
public function get lookAhead():Boolean 
{ 
    return _lookAhead; 
} 

/** 
* @private 
*/ 
public function set lookAhead(value:Boolean):void 
{ 
    _lookAhead = value; 
    lookAheadChanged = true; 
} 

//---------------------------------- 
// typedText 
//---------------------------------- 

/** 
* @private 
* Storage for the typedText property. 
*/ 
private var _typedText:String=""; 
/** 
* @private 
*/ 
private var typedTextChanged:Boolean; 

[Bindable("typedTextChange")] 
[Inspectable(category="Data")] 

/** 
* A String to keep track of the text changed as 
* a result of user interaction. 
*/ 
public function get typedText():String 
{ 
    return _typedText; 
} 

/** 
* @private 
*/ 
public function set typedText(input:String):void 
{ 
    _typedText = input; 
    typedTextChanged = true; 

    invalidateProperties(); 
    invalidateDisplayList(); 
    dispatchEvent(new Event("typedTextChange")); 
} 


override protected function commitProperties():void 
{ 
    super.commitProperties(); 

    if(!dropdown) 
     selectedIndex=-1; 

    if(dropdown) 
    { 
     if(typedTextChanged) 
     { 
      cursorPosition = textInput.selectionBeginIndex; 

      updateDataProvider(); 

      //In case there are no suggestions there is no need to show the dropdown 
      if(collection.length==0 || typedText==""|| typedText==null) 
      { 
       dropdownClosed=true; 
       showDropdown=false; 
      } 
      else 
      { 
       showDropdown = true; 
       selectedIndex = 0; 
      } 
     } 
    } 
} 


override protected function focusOutHandler(event:FocusEvent):void 
{ 
    super.focusOutHandler(event) 
    if(keepLocalHistory && dataProvider.length==0) 
     addToLocalHistory(); 
} 

override public function getStyle(styleProp:String):* 
{ 
    if(styleProp != "openDuration") 
     return super.getStyle(styleProp); 
    else 
    { 
     if(dropdownClosed) 
      return super.getStyle(styleProp); 
     else 
      return 0; 
    } 
} 

override protected function keyDownHandler(event:KeyboardEvent):void 
{ 
    super.keyDownHandler(event); 

    if(!event.ctrlKey) 
    { 
     //An UP "keydown" event on the top-most item in the drop-down 
     //or an ESCAPE "keydown" event should change the text in text 
     // field to original text 
     if(event.keyCode == Keyboard.UP && prevIndex==0) 
     { 
      textInput.text = _typedText; 
      textInput.setSelection(textInput.text.length, textInput.text.length); 
      selectedIndex = -1; 
     } 
     else if(event.keyCode==Keyboard.ESCAPE && showingDropdown) 
     { 
      textInput.text = _typedText; 
      textInput.setSelection(textInput.text.length, textInput.text.length); 
      showingDropdown = false; 
      dropdownClosed=true; 
     } 
     else if(event.keyCode == Keyboard.ENTER) 
     { 
      if(keepLocalHistory && dataProvider.length==0) 
       addToLocalHistory(); 



      /* 
      textInput.text = selectedLabel; 
      textInput.setSelection(cursorPosition, textInput.text.length); 
      textInput.setSelection(textInput.text.length,_typedText.length); 
      */ 

     } 
     else if(lookAhead && event.keyCode == Keyboard.BACKSPACE 
     || event.keyCode == Keyboard.DELETE) 
      removeHighlight = true; 
    } 
    else 
     if(event.ctrlKey && event.keyCode == Keyboard.UP) 
      dropdownClosed=true; 

    prevIndex = selectedIndex; 
} 

override protected function measure():void 
{ 
    super.measure(); 
    measuredWidth = mx.core.UIComponent.DEFAULT_MEASURED_WIDTH; 
} 

override protected function updateDisplayList(unscaledWidth:Number, 
          unscaledHeight:Number):void 
{ 

    super.updateDisplayList(unscaledWidth, unscaledHeight); 

    //An UP "keydown" event on the top-most item in the drop 
    //down list otherwise changes the text in the text field to "" 
    if(selectedIndex == -1) 
     textInput.text = typedText; 

    if(dropdown) 
    { 
     if(typedTextChanged) 
     { 
      //This is needed because a call to super.updateDisplayList() set the text 
      // in the textInput to "" and thus the value 
      //typed by the user losts 
      if(lookAhead && showDropdown && typedText!="" && !removeHighlight) 
      { 
       var label:String = itemToLabel(collection[0]); 
       var index:Number = label.toLowerCase().indexOf(_typedText.toLowerCase()); 
       if(index==0) 
       { 
        textInput.text = _typedText+label.substr(_typedText.length); 
        textInput.setSelection(textInput.text.length,_typedText.length); 
       } 
       else 
       { 
        textInput.text = _typedText; 
        textInput.setSelection(cursorPosition, cursorPosition); 
        removeHighlight = false; 
       } 

      } 
      else 
      { 
       textInput.text = _typedText; 
       textInput.setSelection(cursorPosition, cursorPosition); 
       removeHighlight = false; 
      } 

      typedTextChanged= false; 
     } 
     else if(typedText) 

      textInput.setSelection(_typedText.length,textInput.text.length); 
    } 
    if(showDropdown && !dropdown.visible) 
    { 

     super.open(); 
     showDropdown = false; 
     showingDropdown = true; 

     if(dropdownClosed) 
      dropdownClosed=false; 
    } 
} 



override protected function textInput_changeHandler(event:Event):void 
{ 
    super.textInput_changeHandler(event); 
    //Stores the text typed by the user in a variable 
    typedText=text; 
} 

private function addToLocalHistory():void 
{ 
    if (id != null && id != "" && text != null && text != "") 
    { 
     var so:SharedObject = SharedObject.getLocal("AutoCompleteData"); 

     var savedData : Array = so.data.suggestions; 
     //No shared object has been created so far 
     if (savedData == null) 
      savedData = new Array(); 

     var i:Number=0; 
     var flag:Boolean=false; 
     //Check if this entry is there in the previously saved shared object data 
     for(i=0;i<savedData.length;i++) 
      if(savedData[i]==text) 
      { 
       flag=true; 
       break; 
      } 
     if(!flag) 
     { 
      //Also ensure it is not there in the dataProvider 
      for(i=0;i<collection.length;i++) 
       if(defaultFilterFunction(itemToLabel(ListCollectionView(collection).getItemAt(i)),text)) 
       { 
        flag=true; 
        break; 
       } 
     } 
     if(!flag) 
      savedData.push(text); 

     so.data.suggestions = savedData; 
     //write the shared object in the .sol file 
     so.flush(); 
    } 
} 

private function defaultFilterFunction(element:*, text:String):Boolean 
{ 
    var label:String = itemToLabel(element); 
    return (label.toLowerCase().substring(0,text.length) == text.toLowerCase()); 
} 

private function templateFilterFunction(element:*):Boolean 
{ 
    var flag:Boolean=false; 
    if(filterFunction!=null) 
     flag=filterFunction(element,typedText); 
    return flag; 
} 


private function updateDataProvider():void 
{ 
    dataProvider = tempCollection; 
    collection.filterFunction = templateFilterFunction; 
    collection.refresh(); 


    if(collection.length==0 && keepLocalHistory) 
    { 
     var so:SharedObject = SharedObject.getLocal("AutoCompleteData"); 
     usingLocalHistory = true; 
     dataProvider = so.data.suggestions; 
     usingLocalHistory = false; 
     collection.filterFunction = templateFilterFunction; 
     collection.refresh(); 
    } 
} 

//-------------------------------------------------------------------------- 
// 
// modified source 
// 
//-------------------------------------------------------------------------- 

/** 
* Closes the combox and set the selection which is lost using Flex 3 
* 
* @event Event Trigger event to close the combobox 
*/  
override public function close(event:Event = null):void 
{ 
    super.close(event); 

    if(selectedIndex == 0) 
    { 
     // set the text using the selected label 
     textInput.text = selectedLabel; 
     // select the text from typed text position to texts length 
     textInput.setSelection(cursorPosition, textInput.text.length);  
    } 

} 

}

}

+0

你想做什麼,請詳細說明。 – Eugene 2010-09-07 23:04:57

回答

1

這可能的ComboBox機制的dataProvider每次更改後設置其selectedIndex屬性設置爲0的結果。你必須在你的代碼的某個地方將它重新設置爲-1(比如在popup的creationComplete處理程序中)。