Are you resetting the dataprovider or some other dataprovider? I would not recommend doing that.
________________________________ From: [email protected] [mailto:[EMAIL PROTECTED] On Behalf Of j_lentzz Sent: Tuesday, November 27, 2007 11:32 AM To: [email protected] Subject: [flexcoders] Losing Focus in DataGrid Hi, I've got a dataGrid that I want to allow someone to set a value in a 'selectAll' column and that value will be passed to all the other appropriate columns on that row upon the DataGridEvent.ITEM_EDIT_END. I also have a custom keyDownHandler, to allow them to use the arrow keys to navigate in the grid. The arrow keys navigate just fine (and the focus is correct) for all the columns except for the 'selectAll' column. When a value is typed in this column and the arrow keys are used, the value is passed to the other columns properly, but the grid is getting a CANCELLED edit event and the row is deselected. If I use the TAB key to navigate from the 'selectAll' column, the other columns are updated and the row stays selected. It seems like I'm missing a call of some kind in my keyDownHandler, to allow it to function properly. A sample of the code follows. If anyone can tell me what I'm doing wrong, I'd greatly appreciate it. Thanks, John override protected function keyDownHandler(event:KeyboardEvent):void { var eip:Object = this.editedItemPosition; var numColumns:int = this.columns.length; var dgc:DataGridColumn; var numRows:int = (this.dataProvider as ArrayCollection).length; if (event.keyCode == Keyboard.TAB) return; if (eip != null) { switch (event.keyCode) { case Keyboard.RIGHT: // go one cell over (or to the next visible and non-0 width column), // or if at end of line, then go to start of next line // if no line exists, then create the new line var colFound:Boolean = false; while (!colFound) { if (eip.columnIndex < numColumns) { eip.columnIndex++; dgc = this.columns[eip.columnIndex] as DataGridColumn; if (dgc != null && dgc.visible && dgc.width > 0 && dgc.editable) colFound = true; } else { // at end of row, so go to start of next row if (eip.rowIndex < numRows) { eip.rowIndex++; eip.columnIndex = -1; // start before row, so next loop can increment and check } else { // end of last row, so add row // DO THIS } } } // set new values this.editedItemPosition = eip; this.dataProvider.refresh(); break; SAME FOR OTHER ARROW KEYS... } } private function handleEditEnd(event:DataGridEvent):void { trace('dgevent reason: ' + event.reason + ' dataField: ' + event.dataField ); if (event.reason != "CANCELLED" && event.dataField == "selectAll") { var tempString:String = NumericInEmbedded(event.currentTarget.itemEditorInstance).text; trace('tempString: ' + tempString); if (tempString != null && tempString != "" && tempString != " ") callLater(updateRow, [event, Number(NumericInEmbedded(event.currentTarget.itemEditorInstance).text)]) ; } } private function updateRow(event:DataGridEvent, newData:Number):void { trace('updateRow called'); var dpAC:ArrayCollection = LPA_ItemList.dataProvider; var dgCols:Array = LPA_ItemList.dg.columns; // set all qty columns to this number var obj:Object = dpAC.getItemAt(event.rowIndex); if (obj["startDate"] != null) obj["startDate"] = newData; if (obj["endDate"] != null) obj["endDate"] = newData; for (var i:int=0; i< dgCols.length; i++) { // go through defined cols and set date columns to selectAll value if ((dgCols[i] as DataGridColumn).dataField.indexOf("date") == 0) { obj[(dgCols[i] as DataGridColumn).dataField] = newData; } } dpAC.setItemAt(obj,event.rowIndex); LPA_ItemList.dataProvider = dpAC; (LPA_ItemList.dg.dataProvider as ArrayCollection).itemUpdated(obj); // LPA_ItemList.dg.dataProvider.refresh(); }

