Another question on the Flex Forum about how to move a selected row on the DataGrid up or down, based on a button click. The answer is straight forward, but with a catch.
When you click on the DataGrid, it will give you an index for the row you have clicked. The first row in the DataGrid is 0. If you wanted to simply move a row up and down the DataGrid, then you simply add or subtract 1 from the selected index.
// Move Item Up SelectedIndex--; // Move Item Down SelectedIndex++;
Simple enough. Unless you sort the DataGrid, which throws that out of wack and is pointless. So, if you don’t plan on sorting the data, then adding a couple of buttons to move an item up and down within the DataGrid and the ArrayCollection provider, then here is the code. It also includes checks to make sure you don’t move the item off ofthe grid.
Code for the Move Up Button
protected function moveUpBtn_clickHandler(event:MouseEvent):void { var upSelectedIndex:int = myDataGrid.selectedIndex; // Move Item if(upSelectedIndex > -1) { if(upSelectedIndex > 0) { // Get the selected Object var moveObject:Object = myArrayCollection.getItemAt(upSelectedIndex); // Get actual Object location if grid is sorted var upActualIndex:int = myArrayCollection.getItemIndex(moveObject); // Remove selected item at actualIndex myArrayCollection.removeItemAt(upActualIndex); myArrayCollection.refresh(); // Move both indexes upActualIndex--; upSelectedIndex--; // insert item at actualIndex myDataGrid.dataProvider.addItemAt(moveObject, upActualIndex); myArrayCollection.refresh(); // select grid at selectedIndex myDataGrid.selectedIndex = upSelectedIndex; } else { Alert.show("Item is currently at the top of the list.", "Move Alert", Alert.OK, this); } } else { Alert.show("No Item Selected.", "Move Alert", Alert.OK, this); } }
Code for the Move Down Button
protected function moveDownBtn_clickHandler(event:MouseEvent):void { var downSelectedIndex:int = myDataGrid.selectedIndex; if(downSelectedIndex > -1) { // Move Item if(downSelectedIndex < myArrayCollection.length -1) { // Get the selected Object var moveObject:Object = myArrayCollection.getItemAt(downSelectedIndex); // Get actual Object location if grid is sorted var downActualIndex:int = myArrayCollection.getItemIndex(moveObject); // Remove selected item at actualIndex myArrayCollection.removeItemAt(downActualIndex); myArrayCollection.refresh(); // Move both indexes downActualIndex++; downSelectedIndex++; // insert item at actualIndex myDataGrid.dataProvider.addItemAt(moveObject, downActualIndex); myArrayCollection.refresh(); // select grid at selectedIndex myDataGrid.selectedIndex = downSelectedIndex; } else { Alert.show("Item is currently at the bottom of the list.", "Move Alert", Alert.OK, this); } } else { Alert.show("No Item Selected.", "Move Alert", Alert.OK, this); } }
I did modify the DataGrid, so that the selectioMode is “singleRow”, which simplifies the selectedIndex information. I also set the selectedIndex for the row after the move, so the user can continue to move the row up and down and not have to select it again. Here is the example and source.
UPDATE: Had to set the Down Move to look for the Length of the ArrayCollection -1, because the DataGrid row starts at 0, it is one less than the total length of the ArrayCollection.
About DeanLogic
Dean has been playing around with programming ever since his family got an IBM PC back in the early 80's. Things have changed since BASICA and Dean has dabbled in HTML, JavaScript, Action Script, Flex, Flash, PHP, C#, C++, J2ME and SQL. On this site Dean likes to share his adventures in coding. And since programming isn't enough of a time killer, Dean has also picked up the hobby of short film creation.