我有一个数据网格,它填充了一系列信息。 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>
答案 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;
}