Flex Data Grid - 在重复发生之前防止重复?

时间:2013-11-06 15:08:41

标签: flex datagrid duplicate-removal

我有一个数据网格,它填充了一系列信息。 datagrid由用户使用,因此他们可以在datagrid上添加记录或删除记录。示例:如果用户添加以下信息:“名称:Apples / Description:Fruit”如果数据网格上已存在此信息,我该如何阻止它们再次添加?也许有一个提示“此项目已经列出,请再试一次”。任何人都有任何关于我如何使代码发挥作用的想法?

功能性:

        public function addRow():void {
        var st:AttributeVO = AttributeVO(attCombo.selectedItem);
        st.countryCode = countriesAvailable.selectedLabel;
        var nt:AttributeVO = st.clone();
        var list:ArrayCollection = model.selectedCategory.tai;
        nt.attributeValue = "";
        list.addItem(nt);
        templatePropertiesDG.invalidateList();
    }


    <mx:HBox>
            <mx:ComboBox  id="attCombo" dataProvider="{model.selectedCategory.completeList}" width="300" prompt="Select a Template Attribute" enabled="{model.userInEditMode}" labelField="attributeName" />
            <mx:Button id="addButton" click="addRow();" styleName="addButtonOff" enabled="{model.userInEditMode}" label="ADD" />
    </mx:HBox>

    <mx:DataGrid id="templatePropertiesDG" dataProvider="{model.selectedCategory.tai}" width="100%" height="100%" editable="{model.userInEditMode}">
      <mx:columns>
        <mx:DataGridColumn id="Name" dataField="Name" headerText="Name" width="25" editable="false"/>
        <mx:DataGridColumn id="Value" dataField="Value" headerText="Value" width="25" editable="{model.userInEditMode}"/>
        <mx:DataGridColumn id="Country" dataField="Code" headerText="Country" width="10" editable="false"/>
        <mx:DataGridColumn id="Info" dataField="Info" headerText="Information" width="40" editable="false"/>
      </mx:columns>
    </mx:DataGrid>

2 个答案:

答案 0 :(得分:0)

这个问题的答案取决于几个方面。如果列表不是太大,您可以简单地遍历dataProvider并将每个项目与您要添加的项目进行比较,如果它们相同,则显示消息或其他内容。

for (var i:int = 0; i < list.length; i++)
{
    if (list[i].name == nt.name && list[i].description == nt.description)
    {
         Alert.show("This item already exists", "Error" /*etc*/);
         return;
    }
}

问题显然是,如果有一长串复杂的物体,这会变得非常慢。

(在旁注中,ArrayCollections的.contains()函数按引用而不是按值工作 - 后者会更昂贵 - 这就是为什么你必须自己编写代码的原因。如果所有属性都必须与您使用ObjectUtil.compare函数相同)

数据来自哪里?任何类型的SQL数据库都旨在快速有效地获取数据,并限制可以添加哪种信息(包括防止重复的索引)。尝试从Flex客户端运行此类测试可能不是最好的操作方法,除非您处理相对较小的列表。

如果可能,服务器端检查可能是最好的方法

答案 1 :(得分:0)

我回答了我自己的问题:以下是可能遇到此问题的其他人使用的内容。

        public function addRow():void {
        var st:AttributeVO = AttributeVO(attCombo.selectedItem);
        var country:String = countriesAvailable.selectedLabel;

        if(selectAtt == null) {
            Alert.show("select an attribute.");
            return;
        }

        if(!isDuplicate(selectAtt, country)){
            var newAtt:AttributeVO = selectAtt.clone() as AttributeVO;
            newAtt.country = country;
            var list:ArrayCollection = model.category.tAttributes;
            newAtt.attributeValue = "";
            list.addItem(newAtt);
            templatePropertiesDG.invalidateList();
        }
        else{
            Alert.show("Country exists.");
        }
    }

    public function isDuplicate(selectAtt:TempAttributeVO, country:String ):Boolean {
        var result:Boolean = false;
        var attributes:ArrayCollection = model.category.tAttributes;
        for(var i:int = 0; i < attributes.length; i++) {
            if(attributes[i].attributeId == selectAtt.attributeId && attributes[i].country == country){
                result = true;
                break;
            }
        }

        return result;
    }