在Flex中应用程序启动时问题设置组合框的文本属性

时间:2011-07-20 13:35:43

标签: flex combobox

我正在使用以下网站中的combocheck示例: http://www.carballares.es/en/arcadio/?p=220

这是一个非常有用的组件,效果很好。

现在,我需要在应用程序启动时使用某些值(根据某些条件动态定义)设置此组合框的text属性。问题是虽然我在应用程序运行的其他时间设置组合框的text属性没有问题,但是在启动时设置属性似乎不幸没有效果。

例如,我想将组合框的text属性设置为“Bob”(这是组合框的数据提供者中的项目之一),并在组合框中调用“set text”方法。执行步骤显示“set text”方法正在接收正确的值项但未设置_text属性。

在“ApplicationComplete”之前我没有尝试过任何事情,但也没有任何欢乐。

提前感谢您提供的任何帮助或线索。

//编辑 这是代码(来自上面的URL的代码和对它的一些其他更改的组合)。但是,正如我上面所说,代码确实有效。问题是它在应用程序启动时不起作用。每当触发事件并调用setComboText时,组合框的文本都会正确设置。

    private function onComboChecked(event:ComboCheckEvent):void {
        var obj:Object=event.obj;
        var index:int=selectedItems.getItemIndex(obj);
        if (index==-1) {
            selectedItems.addItem(obj);
        } else {
            selectedItems.removeItemAt(index);
        }

        setComboText();

        dispatchEvent(new Event("valueCommit"));
        dispatchEvent(new Event("addItem"));
    }

    public function setComboText():void {

        if (selectedItems.length>1) {
            // text='multiple'
            //modified by samuel

           var items:ArrayCollection = selectedItems;
           var selItems:String = "";

           for (var item:String in items) 
           {  
                if (items[item].label != "ALL" ) {
                 selItems = selItems + items[item].label + ",";
                }
           } 

           if (selItems.length > 0){
                selItems = selItems.substr(0,selItems.length - 1);
           }


           text = selItems;
        }
        if (selectedItems.length==1) {
            text=selectedItems.getItemAt(0)[labelField];
        }
        if (selectedItems.length<1) {
            //modified by samuel
            text="ALL";
            //Alert.show("text is "+text);
        }
    }

2 个答案:

答案 0 :(得分:1)

尝试将此方法添加到您要扩展的主ComboBox组件中:

        public function set selectedValueList( val : String ) : void {
            var selectedValueArray :Array = val.toLowerCase().split(',');
            var dp :ArrayCollection = this.dataProvider as ArrayCollection;
            var newSelectedItems:ArrayCollection=new ArrayCollection();
            for each ( var selectedVal :String in selectedValueArray ){
                for( var i :uint=0;i<dp.length;i++){
                    if( String(dp.getItemAt(i)[this.labelField]).toLowerCase() == selectedVal ){
                        newSelectedItems.addItem( dp.getItemAt(i) );
                    }
                }
            }
            selectedItems = newSelectedItems;
            if (selectedItems.length>1) { text='multiple'; }
            if (selectedItems.length==1) { text=selectedItems.getItemAt(0)[labelField]; }
            if (selectedItems.length<1) { text=''; }            
            dispatchEvent(new Event("valueCommit"));
            dispatchEvent(new Event("addItem"));
        }

然后,当您想要设置所选项目时,您将这样调用它:

myComboId.selectedValueList = 'Selected Label 1,Selected Label 2';

或者在组件mxml def:

中设置它
<local:ComboBox selectedValueList="Selected Label 1,Selected Label 2" ...rest of properties.../>

或绑定到它:

<local:ComboBox selectedValueList="{variableHoldingCommaDelimList}" ...rest of properties.../>

让我知道它是怎么回事。 :)

答案 1 :(得分:0)

在组合框的情况下,我不确定“set text”是什么意思。相反,它应该是您应该设置的selectedIndex。除此之外,不是applicationComplete OR creationComplete,而是覆盖commitProperties方法并在那里分配这个初始属性(尽管你可以简单地在mxml中指定selectedIndex)。