私が書いていないコードを変更していますが、私はActionscriptでの経験がほとんどありません。Actionscript3 - リストエントリが無効のときにComobox Data Provider(XMLlist)からエントリを削除する
現在、メニュー項目は無効になっているとグレー表示されます。これは、次のクラスによって実現されます。
DisabledComboBox
(拡張コンボボックス)DisabledList
(リストを拡張)DisabledListItemRenderer
メニュー制約が大きなXML変数MenuChoiceXML
に格納されている
(拡張ラベル) 。各DisabledComboBox
は、DataProvider
としてMenuChoiceXML
のサブセットであるXMLlist
を指します。 XMLlists
内の各リストエントリには、要素ID(整数)があります。
また、MenuChoiceXML
は、XMLlist
フルメニューの制約で、データベースで使用可能なものに基づいてあらかじめ組み立てられています。 15の制約5、12、23言い換える
一DisabledComboBox
15を選択し、5,12、および他DisabledComboBoxes
23アウトグレー、それらを選択
- :彼らは、次の形式を使用します選択できません。
それらをグレイアウトして選択するMouseEventを無効にするのではなく、
DataProvider
XMLlist
から完全に削除したいと思います。これらは、私は、コードの関連ビットであると信じるものです:
項目制約で
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
内の項目を検索し、それを無効にしているように見えます。無効にすると、DisabledList
とDisabledListItemRenderer
が表示され、選択した項目が灰色に変わり、それに付随するMouseEventが無効になります。私はが通常使用されていることを認識し、私は私がComboBox
またはDataProvider
(elementsID
を使用して調べることができますかわからないよを(私はそれが関連性の100%じゃないと私は、この後のを達成したコードを掲載します)上記のように)。
が、私はその
DataProvider
でXMLlist
エントリを持っており、を使用ComboBox
を調べることができます:ここでは、私が持っているいくつかの質問がありますか?どうやって?
XMLlist
のエントリが無効になっているため、リストから削除することはできますか?私は考慮していない別の方法はありますか?
DataProvide
rのリストエントリをグレイ表示するコードの要約を作成します。灰色の点滅がDataProvider
のDisabledComboBox
を構成するテキスト内で実行されるため、関連性があるかどうかはわかりませんが、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")); } } } }
これは最も確かに正しい答えです。私は新しいバージョンがHTML5で書かれ、これは短期間だけ使用されるため、存在するフレームワークを使った簡単な解決策を望んでいました。 –
XMLリスト内の項目が含まれているデータプロバイダを検索することはできますか? –
これは彼が簡単に解決できる方法です:アイテムを削除するには、データ提供者を変更する必要があります。したがって、より良いアプローチは、アイテムを完全に削除するのではなく、「隠す」ことです。これにより、完全なリストが再び必要になったときに再作成する必要はありません。申し訳ありませんが、私はあなたの2番目のコメントを理解していません – Philarmon