Я новичок в разработке Flex / AS3, и я столкнулся с проблемой, которая меня беспокоит некоторое время.Я использую AdvancedDataGrid
с некоторыми столбцами и ArrayCollection
в качестве поставщика.Я хотел бы создать функцию копирования / вставки, чтобы можно было выбирать, копировать и вставлять несколько строк под выбранной (или последней выбранной строкой).
Проблема заключается в том, что я копирую данные из одной строкис другой стороны, обе эти строки подсвечиваются при наведении курсора мыши (верхний экземпляр даже не выбирается) - как в этом разделе: Ошибка Flex DataGrid / DataProvider?
Сначала я подумалэто была проблема копирования ссылки, но она сохраняется, даже если я использую ObjectUtil.copy()
метод.Кроме того, я вручную изменяю одно из свойств, называемых «порядок», чтобы объекты 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();
}