我是Flex / AS3开发的新手,我遇到了一个问题,现在让我感到困惑。我使用的AdvancedDataGrid
包含一些列,ArrayCollection
作为提供者。我想制作一个复制/粘贴功能,以便可以选择,复制多个行,然后粘贴到所选(或最后选择的行)下面。
问题是当我将数据从一行复制到另一行时,这些行都会在鼠标悬停时突出显示(上层实例甚至无法选择) - 就像在本主题中一样:Flex DataGrid/DataProvider bug?
首先我认为这是复制引用的问题,但即使我使用ObjectUtil.copy()
方法,它仍然存在。此外,我手动更改了一个名为“order”的属性,以便ArrayCollection
的对象不相同,但它没有帮助。 Dataprovider
被称为newTreatmentData
,而DataGrid
被称为newTreatmentDG
。
欢迎任何建议。
以下是相关代码的一部分:
private function getSelectedRow(event:Event):void
{
selectedRow = newTreatmentDG.selectedIndex;
}
private function copySelection(event:Event):void
{
bufferData = new ArrayCollection();
var sortedIndices:Array = newTreatmentDG.selectedIndices.sort();
for (var i:int = 0; i < newTreatmentDG.selectedIndices.length; i++){ //copy selected rows to the buffer
var j:int = sortedIndices[i];
bufferData.addItem(newTreatmentData[j]);
}
}
private function pasteSelection(event:Event):void
{
var rowsToMove:int = newTreatmentData.length - selectedRow - 1; //number of rows to move after pasting
for (var i:int = 1; i <= bufferData.length; i++){
if (selectedRow + bufferData.length + i > newTreatmentData.length){ // adding objects to the array collection to avoid range error
newTreatmentData.addItem(null);
}
}
for (i = 1; i <= rowsToMove; i++){
newTreatmentData[selectedRow + bufferData.length + i] = ObjectUtil.copy(newTreatmentData[selectedRow + i]) //first move the rows to "give room" for pasting
newTreatmentData[selectedRow + bufferData.length + i].order = selectedRow + bufferData.length + i; //manually changing the "order" property, but it doesn't help
}
for (var j:int = 1; j <= bufferData.length; j++){ //paste the data from the buffer
newTreatmentData[selectedRow + j] = ObjectUtil.copy(bufferData[j-1])
newTreatmentData[selectedRow + j].order = selectedRow + j; //again changing the order property
}
newTreatmentData.refresh();
}
答案 0 :(得分:1)
我通过更改mx_internal_uid
dataprovider
中每个对象的ArrayCollection
属性来解决此问题。似乎AdvancedDataGrid
检查它是否相等。我假设(并且你知道他们对假设的看法)当你将其值复制到另一个对象(因此UID中的U;)时,对象的UID会发生变化。