Actionscript 3 Flex 4和Actionscript 3根据所选项目的数量创建表单元素

Actionscript 3 Flex 4和Actionscript 3根据所选项目的数量创建表单元素,actionscript-3,apache-flex,forms,list,Actionscript 3,Apache Flex,Forms,List,所以我有一个列表控件,我将其设置为allowMultipleSelection…基本上我要做的是创建一个表单,为我在列表中选择的每个项目创建一个文本输入…我有一种工作方式,所以当我选择第一个项目时,它添加了表单输入,但是,当我选择第二个项目时,它会添加两个表单输入,并保留第一个表单输入,总共三个……显然,我不只是添加它们,而是希望它得到更新,我还对如何处理取消选择项目和更新表单感到困惑……这是我的代码,提前感谢您的帮助 protected function multipleFormulaList

所以我有一个列表控件,我将其设置为allowMultipleSelection…基本上我要做的是创建一个表单,为我在列表中选择的每个项目创建一个文本输入…我有一种工作方式,所以当我选择第一个项目时,它添加了表单输入,但是,当我选择第二个项目时,它会添加两个表单输入,并保留第一个表单输入,总共三个……显然,我不只是添加它们,而是希望它得到更新,我还对如何处理取消选择项目和更新表单感到困惑……这是我的代码,提前感谢您的帮助

protected function multipleFormulaListChangeHandler(event:Event):void {
            var numberSelected:uint = multFormulaList.selectedItems.length;
            trace(numberSelected);
            for(var i:int = 0; i < numberSelected; i++) {
                var formitem:FormItem = new FormItem;
                var forminput:TextInput = new TextInput;
                formitem.addElement(forminput);
                theform.addElement(formitem);
            }
        }

如果您的项是已知的,则最好通过表单项的visible和includeInLayout属性来处理

但是,如果您想要完全的动态性,我会保留一个关联数组作为一个对象,您可以在其中存储表单中已经包含的项。在创建和再次添加事件之前,您的事件应检查此对象

取消选择元素时,只需将其从窗体中删除,并将其从关联数组对象中删除即可

假设您的关联数组称为alreadyShown。您需要在代码内部执行的唯一操作是:

if(alreadyShown[idOfTheItemYouWantToAdd]!=1){
  /*
  paste the code that adds your item here
  */
  alreadyShown[idOfTheItemYouWantToAdd] = 1
}

删除项目时,应将alreadyShown[idOfTheItemYouWantToAdd]设置为0

我使用和在类似情况下取得了很好的效果

使用基本上是关联数组的ArrayCollection,您可以通过存储项目本身来跟踪当前选择的项目:

private var currSelected:ArrayCollection = new ArrayCollection();

protected function multipleFormulaListChangeHandler(event:Event):void {
    var numberSelected:uint = multFormulaList.selectedItems.length;
    for each(var item:Object in multFormulaList.selectedItems) {
        //add item to currSelected AC
        currSelected.addItem(item);
    }
}
为了防止引入重复项以及在第一时间甚至提到游标或数组集合的全部原因,您还可以在现在的选定项数组集合上创建一个视图游标,并利用该游标的findAny方法来防止进一步循环,以确定选定项中是否存在项数组集合。在循环中以条件形式设置您当前正在进行的操作,您将得到如下结果:

    import mx.collections.ArrayCollection;
import mx.collections.IViewCursor;

import mx.collections.Sort;
import mx.collections.SortField;

private var currSelected:ArrayCollection = new ArrayCollection();
//Be sure to run a sort on currSelected because cursors can only be created on sorted array collections
/*
    var sort:Sort = new Sort();
    sort.fields = [new SortField(null, true)];
    currSelected.sort = sort;

*/

protected function multipleFormulaListChangeHandler(event:Event):void {
    //create cursor 
    var cursor:IViewCursor = currSelected.createCursor();
    //loop through selected items list comparing each looped item with the currSelected array for matches
    for each(var item:Object in multFormulaList.selectedItems) {
        if(!cursor.findAny(item)){
            //no match found - add item to currSelected AC and create form field 
            currSelected.addItem(item);
            //for add logic
            var formitem:FormItem = new FormItem;
            var forminput:TextInput = new TextInput;
            formitem.addElement(forminput);
            theform.addElement(formitem);
        }else{
            //match found - not adding
        }

    }
}

我曾考虑过visible和includeInLayout属性,但对于包含200多个项目的列表,我认为这是行不通的,如果您能告诉我使用关联数组执行类似操作的方向,这将非常有帮助……感谢您的回复!太好了,谢谢!但是我有两个问题,我如何通过单击一个已经选定的项目从选定的数组中删除一个项目,然后删除关联的表单项目?此外,列表的原始数据来自由xml填充的数组集合,我在将数据从原始arraycollection传输到新选定的数组集合时遇到问题。我如何处理此问题?非常感谢你帮了我大忙