It seems you are content to stick with the workaround, but I'm curious if you are getting the data from index 4, even though it's saying index 5, or if you are getting the data associated with index 5. I've seen this where the selectedIndex was 5, but the data was from the old index 5 (now 4 or 6), which really does mess things up. I've had to go and programatically clear the DG and re-assign the dataProvider to keep things consistent, but that's not problem free when inserting into the DG. Frustrating :-)
--- In [email protected], "Tracy Spratt" <[EMAIL PROTECTED]> wrote: > > That is correct. I am getting index 5, all the way. Even the > DataGridEvent.rowIndex reports 5. I have not been able to catch index 4 > anywhere. I even considered a mouseDown handler. > > > > And the DataGrid refresh is what is causing the problem, that happens > when I assign the _xlcProjItems = new XMLListCollection() WITHIN an > editing session. > > > > It is a pretty complex series of actions, ending an edit session by > clicking another row, and by adding in the data model update and > dataProvider re-assignment, it just is nuts. > > > > I am now setting a flag in the itenEditEnd handler, and NOT calling > preventDefault. In my hangeWatcher handler, if I am in an edit session, > I do not re-assign the dataProvider. Seems to work fine. > > Tracy > > > > ________________________________ > > From: [email protected] [mailto:[EMAIL PROTECTED] On > Behalf Of jmfillman > Sent: Tuesday, May 06, 2008 7:38 PM > To: [email protected] > Subject: [flexcoders] Re: Complex itemEditEnd processing confuses > subsequent rowIndex on click > > > > Let me see if I understand this. You are saying that if you are > editing selectedIndex 3, and then you click, for example, on index 4, > that you are getting index 5 instead of 4, correct? > > Do you get the data from index 4 or 5? When you update data in the > DG, don't you need to refresh the DG? > > --- In [email protected] <mailto:flexcoders% 40yahoogroups.com> > , "Tracy Spratt" <tspratt@> wrote: > > > > My flag solution works fine, so don't stress on this one unless you > are > > just interested. > > > > Tracy > > > > > > > > ________________________________ > > > > From: [email protected] <mailto:flexcoders% 40yahoogroups.com> > > [mailto:[email protected] <mailto:flexcoders% 40yahoogroups.com> > ] On > > Behalf Of Tracy Spratt > > Sent: Tuesday, May 06, 2008 7:31 PM > > To: [email protected] <mailto:flexcoders% 40yahoogroups.com> > > Subject: [flexcoders] Complex itemEditEnd processing confuses > subsequent > > rowIndex on click > > > > > > > > In a component's editable Datagrid's itemEditEnd handler, I update a > > data model instance, which dispatches events that invoke a > ChangeWatcher > > handler back in that same component. That handler assigns a new > > XMLListCollection to the local var to which the editable dataGrid is > > bound. The handler also sets the selectedIndex of the DG to the > just > > edited row. > > > > This all works fine if I end the editing session using Tab or Enter > or > > Escape, but if I click in the next row, something confuses the > rowIndex > > of the click, and the next row's cell is put in edit mode instead > of the > > one clicked. > > > > So far I have been unable to repro this in a test app (quit because > of > > time issues), but it occurs both places that I use this methodology. > > > > I also have found that there is some kind of event "tangle". When my > > change handler is invoked and re-assigns the DG dataProvider, we are > > still "within" the itemEditEnd handler, but assigning the DP causes > us > > to hit the itemEditend handler AGAIN, recursively. > > > > I am about ready to just set a flag and conditionally skip the > problem > > code, but any other ideas will be appreciated. I'll post some > snippets > > below. > > > > Tracy > > > > Tracing: > > > > onEditEnd() //value updated, click in 2nd row(index > > 1),itemEditEnd handler called > > > > ..onEditEnd rowIndex=0 // > > > > changeProjItemData() //updates the data model > > > > onXmlProjItemsChange: //ChangeWatcher handler > > > > ..<-- here we assign the dg dataProvider --> > > > > onEditEnd() //UNEXPECTED call to itemEditEnd handler > > > > ..onEditEnd rowIndex=0 > > > > selectItemByIndex( 0) > > > > onSelectItem //called by DG change event handler, 2nd > > row(index 1) clicked > > > > ..set _iSelectedIndex to row clicked=2 //WRONG index, clicked > index "1" > > > > ..<-- here , the 3rd row is set to editable, not the 2nd as clicked > > > > Snippets: > > > > /**This gets fired when the itemEditor is about to be destroyed. > */ > > > > private function onEditEnd(event:DataGridEvent):void > > > > { > > > > trace(".ProjItem.onEditEnd()") > > > > var sPropertyName:String = event.dataField; //get the > > dataField > > > > var sValue:String = > > TextInput(event.currentTarget.itemEditorInstance).text; //and value > > > > trace(".....onEditEnd rowIndex=" + event.rowIndex ) > > > > if (_xmlProjItem[sPropertyName] != sValue) { //if value > > changed > > > > changeProjItemData(sPropertyName,sValue) > > > > event.preventDefault(); > > > > } > > > > }//onEditEnd > > > > > > > > /** Sets required save flags, updates the local value, and > updates the > > data model */ > > > > private function changeProjItemData(sPropertyName:String, > > sValue:String):void > > > > { > > > > trace(".ProjItem.changeProjItemData()") > > > > if (sPropertyName && sValue) { > > > > [EMAIL PROTECTED] = "true"; //flas > for > > save > > > > _xmlProjItem[sPropertyName] = sValue; > > > > [EMAIL PROTECTED] = "true"; > > > > [EMAIL PROTECTED] > = "true"; //required > > for SAVE! > > > > [EMAIL PROTECTED] = "true"; // " > > > > [EMAIL PROTECTED] = "true"; > > > > _dsApp.xmlProjItems = > _xmlProjItems; //Update the > > data model. Invokes change handler > > > > } > > > > }//changeProjItemData > > > > /** changeWatcher handler on DSApp.xmlProjItems */ > > > > private function onXmlProjItemsChange( event:PropertyChangeEvent > > ):void > > > > { > > > > trace("...Project.onXmlProjItemsChange:") > > > > var xml:XML = event.newValue as XML; > > > > if (xml) { > > > > _xmlProjItems = xml.copy(); > > > > _xlcProjItems = new > > XMLListCollection(_xmlProjItems.children().(attribute ("rowaction")! > ="del > > ete")); //dgProjItem dataProvider > > > > selectItemByIndex(_iSelectedIndex); > > > > } > > > > else { > > > > _xmlProjItems = <DocumentElement />; > > > > _xmlProjItem = null; > > > > _xlcProjItems = new XMLListCollection(_xmlProjItems.ProjItem); > > > > } > > > > }//onXmlProjItemsChange > > > > > > > > /** Run by change event of dgProjItem */ > > > > private function onSelectItem(event:Event):void > > > > { > > > > trace(".projItem.onSelectItem -- current _iSelectedIndex = " + > > _iSelectedIndex) > > > > _xmlProjItem = XML(event.target.selectedItem); > > //set local var > > > > _iSelectedIndex = event.target.selectedIndex; > > //store index > > > > trace("....set _iSelectedIndex to row clicked=" + > _iSelectedIndex); > > > > bPrevAvail = (_iSelectedIndex > 0); > > //next/prev button state > > > > bNextAvail = (_iSelectedIndex < _xmlProjItems.children().length > () - > > 1); > > > > _dsApp.xmlProjItem = _xmlProjItem; > > //set data model > > > > }//onSelectItem > > > > > > > > /** Selects previously stored row */ > > > > private function selectItemByIndex(iIndex:int):void > > > > { > > > > trace(".projItem.selectItemByIndex( " + iIndex + ")") > > > > _xmlProjItem = _xmlProjItems.ProjItem[iIndex]; //select the > > first Item > > > > dgProjItems.selectedIndex = iIndex; > > > > _iSelectedIndex = iIndex; > > > > bPrevAvail = (_iSelectedIndex > 0); > > > > bNextAvail = (_iSelectedIndex < _xmlProjItems.children().length > () - > > 1); > > > > _dsApp.xmlProjItem = _xmlProjItem; > > > > }//selectItemByIndex > > >

