2016-03-30 1 views
1

私が書いていないコードを変更していますが、私はActionscriptでの経験がほとんどありません。Actionscript3 - リストエントリが無効のときにComobox Data Provider(XMLlist)からエントリを削除する

現在、メニュー項目は無効になっているとグレー表示されます。これは、次のクラスによって実現されます。

  1. DisabledComboBox(拡張コンボボックス)
  2. DisabledList(リストを拡張)
  3. DisabledListItemRendererメニュー制約が大きなXML変数MenuChoiceXMLに格納されている

(拡張ラベル) 。各DisabledComboBoxは、DataProviderとしてMenuChoiceXMLのサブセットであるXMLlistを指します。 XMLlists内の各リストエントリには、要素ID(整数)があります。

また、MenuChoiceXMLは、XMLlistフルメニューの制約で、データベースで使用可能なものに基づいてあらかじめ組み立てられています。 15の制約5、12、23言い換える

DisabledComboBox 15を選択し、5,12、および他DisabledComboBoxes 23アウトグレー、それらを選択

  • :彼らは、次の形式を使用します選択できません。

    それらをグレイアウトして選択するMouseEventを無効にするのではなく、DataProviderXMLlistから完全に削除したいと思います。

    これらは、私は、コードの関連ビットであると信じるものです:

    項目制約でXMLlist

    <Constraints> 
         <Cstr choice="DataProvider1" selectedValue="2" constrains="DataProvider2" denies="4,7,12" /> 
    </Constraints> 
    

    TotalStateofProgram.as

    public function applyConstraints():void 
    { 
    
    
        // before updating menus all constrained menus enable all menu choices, then turn on restricted options 
    
        for each(var menulist:String in constrainedMenuList) 
        { 
         for each(var xmlentry:XML in MenuChoicesXML.descendants(menulist).MenuItem) 
         { 
          [email protected]=true; 
         } 
        } 
    
        // Save constraints in XMLlist 
        var cstrs:XMLList = MenuChoicesXML.descendants("Constraints").Cstr; 
        // go through each contraint in list of constraints 
        for each(var cstr:XML in cstrs) 
        { 
         var choice:String = [email protected]; 
         var value:String = [email protected]; 
    
         // for each constraint - find if it is required constraint selectedValue matches current selection 
         var applies:Boolean = (design.getData(choice) == value); 
         if(applies) 
         { 
          var menuname:String = [email protected]; 
          var denies:String = [email protected]; 
          var deniesarray:Array = denies.split(','); 
    
          // Go throught items which are denied by selection 
          for(var i:int = 0; i<deniesarray.length;i++) 
          { 
           var d:String = deniesarray[i]; 
    
           // If something that is to be constrained is currently selected, unselect it from DisabledComboBox 
           if(design.getData(menuname) == d) 
            design.setData(menuname, "0"); // default elementsId for unselected is 0 
    
    
           // set disable menu choice for this elementsId 
           (MenuChoicesXML.descendants(menuname).MenuItem.(@elementsId == d))[email protected] = "false"; 
    
          } 
         } 
        } 
    } 
    

    上記のコードはすべての制約をリセットし、現在選択されているメニュー項目を使用して他のメニュー項目に制約を適用します。重要なビットは、この行です:

    (MenuChoicesXML.descendants(menuname).MenuItem.(@elementsId == d))[email protected] = "false";

    XMLlist内の項目を検索し、それを無効にしているように見えます。無効にすると、DisabledListDisabledListItemRendererが表示され、選択した項目が灰色に変わり、それに付随するMouseEventが無効になります。私は​​が通常使用されていることを認識し、私は私がComboBoxまたはDataProviderelementsIDを使用して調べることができますかわからないよ

    を(私はそれが関連性の100%じゃないと私は、この後のを達成したコードを掲載します)上記のように)。

    • が、私はそのDataProviderXMLlistエントリを持っており、​​を使用ComboBoxを調べることができます:ここで

      は、私が持っているいくつかの質問がありますか?どうやって?

    • XMLlistのエントリが無効になっているため、リストから削除することはできますか?

    • 私は考慮していない別の方法はありますか?

    DataProvide rのリストエントリをグレイ表示するコードの要約を作成します。灰色の点滅がDataProviderDisabledComboBoxを構成するテキスト内で実行されるため、関連性があるかどうかはわかりませんが、DisabledComboboxから要素を削除したい(これは作業が少ないようです)。

    おそらく関連するコード:

    DisabledComboBox.as

    package com.cwmlib.controls 
    { 
        import mx.controls.ComboBox; 
        import mx.core.ClassFactory; 
        import mx.events.FlexEvent; 
    
        public class DisabledComboBox extends ComboBox 
        { 
         public function DisabledComboBox() 
         { 
    
          super(); 
    
          this.dropdownFactory = new ClassFactory(DisabledList); 
    
          this.itemRenderer = new ClassFactory(DisabledListItemRenderer); 
    
         } 
        } 
    } 
    

    DisabledList.as

    package com.cwmlib.controls 
    { 
        import flash.events.MouseEvent; 
        import flash.events.KeyboardEvent; 
        import mx.controls.ComboBox; 
        import mx.core.ClassFactory; 
        import mx.controls.List; 
        import mx.controls.listClasses.IListItemRenderer; 
        import mx.controls.listClasses.ListItemRenderer; 
    
        public class DisabledList extends List 
        { 
    
    
         public function DisabledList() 
         { 
    
          super(); 
          this.itemRenderer = new ClassFactory(DisabledListItemRenderer); 
    
         } 
    
         private function itemDisable(event:MouseEvent):Boolean 
         { 
          var item:IListItemRenderer = mouseEventToItemRenderer(event); 
    
          if (item != null && item.data != null 
           && ((item.data is XML && [email protected] == 'false') 
           || item.data.enabled==false || item.data.enabled=='false') 
           ) 
          { 
            return true; 
          } 
          else 
          { 
            return false; 
          } 
    
         } 
        } 
    } 
    

    DisabledListItemRenderer.as

    package com.cwmlib.controls 
    { 
        import mx.controls.Label; 
    
        public class DisabledListItemRenderer extends Label 
        { 
         private var _enabled:Boolean = true; 
    
         public function DisabledListItemRenderer() 
         { 
    
           super(); 
    
         }  
    
    
    
         override public function set data(value:Object):void 
         { 
    
          if (value != null && ((value is XML && [email protected] == 'false') 
           || value.enabled == false || value.enabled == 'false') 
          ){ 
    
           this._enabled = false; 
    
          } 
          else 
          { 
            this._enabled = true; 
    
          } 
    
          super.data = value; 
    
         }  
    
    
    
         override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void 
         { 
    
          super.updateDisplayList(unscaledWidth, unscaledHeight); 
    
          if (!this._enabled) { 
           textField.setColor(getStyle("disabledColor")); 
          } 
          else 
          { 
           textField.setColor(getStyle("color")); 
          } 
         } 
        } 
    } 
    

答えて

0

別のコンボボックスで何かを選択すると、あるコンボボックス内のいくつかのアイテムを削除したいのですか?あなたが何か他のものを選んだら、もう一度それらを表示するでしょうか?この場合、filterFunctionはそのための適切なツールであると考えられます。テストしたが、これはあなたのアイデアを与えるわけではありません:

// make a dedicated _myDataProvider for the filtered combobox and assign a filterfunction to it 
_myDataProvider.filterFunction = filterCollection; 

// Assign the dataProvider 
filteredCombobox.dataProvider = _myDataProvider; 

// filter the dataprovider when selection in the first combobox will change 
selectionComboBox.addEventListener(Event.CHANGE, onComboBoxChange); 


private function onComboBoxChange(e:Event):void 
{ 
    // refresh the dataprovider, that will apply the filter 
    _myDataProvider.refresh(); 
} 

private function filterCollection(item:Object):Boolean 
{ 
    // here you need to know the condition for the filter depending on the selection in the first combobox (prbably the selected item in the selection combobox?) 
    // this filterCollection function will run trough each item in the _myDataProvider and return true (keep the item in the list) or false (the item will disappear)    
    if (condition) 
     return true; 
    else 
     return false; 
} 

フィルタが適用されたとき_myDataProviderのみ現在可視項目が含まれていることに留意してください。あなたは再び完全なコレクションを必要とするだろう場合は、

_myDataprovider.filterFunction = null; 
_myDataprvider.refresh(); 

でデータプロバイダをリセットすることができEDIT:

この全体のXML操作は、私には苦痛のように聞こえます。カスタムコンボボックスとXMLを取り除く。あなたのXMLを解析し、2つのDataProviderを作る - これで値オブジェクトを持つことになります選択コンボボックスに1つのプロパティを拒否:

public class SelectionVO 
{ 
    public var label:String; 
    public var denies:Array; // for example, ["2", "3", "4"]; 
} 

そして、これかどうかを確認するためのIDを持っています値オブジェクトとフィルタコンボボックスのための別の1項目は除外するかしない:

public class FilteredItemVO 
{ 
    public var label:String; 
    public var myID:String; // for example, "3" 
} 

そして選択コンボボックスを使用して、コレクションをフィルタリング変更したとき:

private function filterCollection(item:Object):Boolean 
{ 
    var selectedVO:SelectionVO = selectionComboBox.selectedItem as SelectionVO; 

    // show this item if its myID is NOT included in the selected vo's denies array 
    if (selectedVO:SelectionVO.denies.indexOf(item.myID) == -1) 
     return true; 
    else 
     return false; 
} 
+0

これは最も確かに正しい答えです。私は新しいバージョンがHTML5で書かれ、これは短期間だけ使用されるため、存在するフレームワークを使った簡単な解決策を望んでいました。 –

+0

XMLリスト内の項目が含まれているデータプロバイダを検索することはできますか? –

+0

これは彼が簡単に解決できる方法です:アイテムを削除するには、データ提供者を変更する必要があります。したがって、より良いアプローチは、アイテムを完全に削除するのではなく、「隠す」ことです。これにより、完全なリストが再び必要になったときに再作成する必要はありません。申し訳ありませんが、私はあなたの2番目のコメントを理解していません – Philarmon

関連する問題