This issue has been fixed in 3.0. Can you upgrade?
________________________________ From: [email protected] [mailto:[EMAIL PROTECTED] On Behalf Of j_lentzz Sent: Thursday, November 08, 2007 5:57 AM To: [email protected] Subject: [flexcoders] Re: Bouncing Focus in DataGrid Ok, I have a simple example. When you run the app, click on the lower right cell, the upper left cell with get focus first. Thanks for all the help. John *** DGTest.mxml *** <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml <http://www.adobe.com/2006/mxml> " layout="absolute" xmlns:n1="FAB_widgets/widgets"> <mx:Script> <![CDATA[ import mx.collections.ArrayCollection; import mx.events.DataGridEvent; [Bindable] protected var _listData:ArrayCollection = new ArrayCollection([{name:'AA', phone:'555-555-1234',email:'BB'}, {name:'BB', phone:'555-555-4321',email:'AA'}]); private function fireEditEvent(event:DataGridEvent):void { if (dg.itemEditorInstance is ComboBoxRenderer) { // event.preventDefault(); // copy selected value (data) from combobox to renderer var selData:String = ComboBoxRenderer(event.currentTarget.itemEditorInstance).text; var selData2:Object = ComboBoxRenderer(event.currentTarget.itemEditorInstance).selectedItem; if (selData2 != null) { dg.editedItemRenderer.data[event.dataField] = selData2.data; /*EXPENSIVE!!!! */// dg.dataProvider.itemUpdated(event.itemRenderer.data); } dg.destroyItemEditor(); } } protected function itemEditBeginHandler(event:DataGridEvent):void { _listData[event.rowIndex].rowChanged = true; dispatchEvent(new Event("change")); dg.invalidateList(); trace('itemEditBeginHandler - ListWithoutAdd'); } ]]> </mx:Script> <mx:DataGrid headerHeight="21" editable="true" rowHeight = "30" id="dg" dataProvider="{_listData}" visible="true" selectable="false" itemEditEnd="fireEditEvent(event)" itemEditBegin="itemEditBeginHandler(event)"> <mx:columns> <mx:DataGridColumn dataField="name" headerText="Name" itemEditor="ComboBoxRenderer" itemRenderer="LabelWithDownArrow"/> <mx:DataGridColumn dataField="phone" headerText="Phone"/> <mx:DataGridColumn dataField="email" headerText="Email" itemEditor="ComboBoxRenderer" itemRenderer="LabelWithDownArrow"/> </mx:columns> </mx:DataGrid> </mx:Application> *** LabelWithDownArrow.as *** package { import mx.controls.Label; import mx.events.FlexEvent; import mx.controls.dataGridClasses.DataGridListData; import mx.controls.dataGridClasses.DataGridColumn; import mx.controls.DataGrid; import mx.collections.ArrayCollection; import flash.display.Graphics; public class LabelWithDownArrow extends Label { public function LabelWithDownArrow() { super(); addEventListener(mx.events.FlexEvent.SHOW, showEventHandler); } private function showEventHandler(e:FlexEvent):void { trace('LabelWithDownArrow showEventHandler'); listData.label = data[DataGridListData(listData).dataField]; var cbr:ComboBoxRenderer; // will contain renderer for this cell var dgc:DataGridColumn; // will contain column info for the one this cell is in var columnArray:Array; // columns of datagrid var dg:DataGrid; // reference to grid containing this cell var dp:ArrayCollection; // dataProvider of selected cell's comboBox var dgld:DataGridListData = listData as DataGridListData; if (dgld != null) { dg = DataGrid(listData.owner); columnArray = dg.columns; // iterate through columns to find one that matches to this cell var columnArrayLen:int = columnArray.length; for (var i:int=0; i< columnArrayLen; i++) { if (DataGridColumn(columnArray[i]).dataField == dgld.dataField) { // column found if (dg.columns[i].itemEditor.newInstance() is ComboBoxRenderer) { cbr = dg.columns[i].itemEditor.newInstance(); dp = cbr.dataProvider as ArrayCollection; // now iterate through dp to find a matching data value, when found put its label in the Label widget var dpLen:int = dp.length; for (var j:int=0; j<dpLen; j++) { if (dp.getItemAt(j).data == data[dgld.dataField]) { // found match this.text = dp.getItemAt(j).label; // + " " + dp.getItemAt(j).data; trace('found showEvent LabelWithDownArrow'); return; } } } } } // not found, so show comboBox prompt this.text = cbr.prompt; trace('not found showEvent LabelWithDownArrow'); } trace('showEvent'); } override protected function updateDisplayList(w:Number, h:Number):void { super.updateDisplayList(w-15, h); // subtract from width to allow for down arrow var g:Graphics = graphics; g.clear(); // add arrow to box // Draw the triangle. g.beginFill(0x000000); // black g.moveTo(w - 11.5, h / 2 + 3); g.lineTo(w - 15, h / 2 - 2); g.lineTo(w - 8, h / 2 - 2); g.lineTo(w - 11.5, h / 2 + 3); g.endFill(); } // method used to change what is displayed [Bindable] override public function set data(value:Object):void { super.data = value; var cbr:ComboBoxRenderer; // will contain renderer for this cell var dgc:DataGridColumn; // will contain column info for the one this cell is in var columnArray:Array; // columns of datagrid var dg:DataGrid; // reference to grid containing this cell var dp:ArrayCollection; // dataProvider of selected cell's comboBox var dgld:DataGridListData = listData as DataGridListData; if (dgld != null) { dg = DataGrid(listData.owner); columnArray = dg.columns; // iterate through columns to find one that matches to this cell var columnArrayLen:int = columnArray.length; for (var i:int=0; i< columnArrayLen; i++) { if (DataGridColumn(columnArray[i]).dataField == dgld.dataField) { // column found if (dg.columns[i].itemEditor.newInstance() is ComboBoxRenderer) { cbr = dg.columns[i].itemEditor.newInstance(); dp = cbr.dataProvider as ArrayCollection; // now iterate through dp to find a matching data value, when found put its label in the Label widget var dpLen:int = dp.length; for (var j:int=0; j<dpLen; j++) { if (dp.getItemAt(j).data == data[dgld.dataField]) { // found match this.text = dp.getItemAt(j).label; // + " " + dp.getItemAt(j).data; trace('found LabelWithDownArrow'); return; } } } } } // not found, so show comboBox prompt this.text = cbr.prompt; trace('not found LabelWithDownArrow'); } } } } *** ComboBoxRenderer.as *** package { import mx.controls.ComboBox; import flash.events.FocusEvent; import mx.collections.ArrayCollection; import mx.controls.dataGridClasses.DataGridListData; public class ComboBoxRenderer extends ComboBox { public function ComboBoxRenderer() { super(); this.toolTip = this.text; this.dataProvider = DropDown_Names; addEventListener(flash.events.FocusEvent.FOCUS_IN, focusEventHandler); } private var DropDown_Names:ArrayCollection = new ArrayCollection([{data:'AA', label: 'Adam Adams'},{data:'BB', label: 'Bob Bobs'}]); override public function get data():Object { trace('get data cbr renderere'); return super.data; } // this affects what is displayed by widget [Bindable] override public function set data(value:Object):void { trace('********** set cbr data ***********'); var rowData:DataGridListData = this.listData as DataGridListData; if (value != null) { var stringToFind:String = null; var selected:int = -1; if (listData.label != null) stringToFind = listData.label.toUpperCase(); for (var i:int=0; i< dataProvider.length;i++) { var item:String = String(dataProvider[i].data).toUpperCase(); if (item == stringToFind) { selectedIndex = i; trace('found it cbr'); return; } } selectedIndex = selected; } trace('not found cb renderer'); } private function focusEventHandler(e:FocusEvent):void { open(); } } } --- In [email protected] <mailto:flexcoders%40yahoogroups.com> , "Alex Harui" <[EMAIL PROTECTED]> wrote: > > When the focus moves to the selected cell, the ComboBox shows up? > > > > If the renderer is not an extended Label do you still see the problem? > > > > Is there no way to make a simple DG using your extended renderer and > editor and post it? > > > > ________________________________ > > From: [email protected] <mailto:flexcoders%40yahoogroups.com> [mailto:[email protected] <mailto:flexcoders%40yahoogroups.com> ] On > Behalf Of j_lentzz > Sent: Wednesday, November 07, 2007 5:03 PM > To: [email protected] <mailto:flexcoders%40yahoogroups.com> > Subject: [flexcoders] Re: Bouncing Focus in DataGrid > > > > Sorry about that. The editor is an extended ComboBox. The renderer > is an extended Label. Clicking on a cell in the datagrid makes the > first cell on the first row briefly get the focus, then the focus > moves to the selected cell. It only does this the very first time > you click in the grid - either after initially loading it with data, > or after adding a row to it. After the first click, it does not > briefly go to the first cell on the first row. > > I hope this is clearer. I appreciate the help. > > John > --- In [email protected] <mailto:flexcoders%40yahoogroups.com> <mailto:flexcoders%40yahoogroups.com> > , "Alex Harui" <aharui@> wrote: > > > > OK, I'm lost. Please re-state your findings so far. Note also > that if > > your ComboBox editor is wrapped by a Container it isn't a true > > IFocusManagerComponent > > > > > > > > ________________________________ > > > > From: [email protected] <mailto:flexcoders%40yahoogroups.com> <mailto:flexcoders%40yahoogroups.com> > > [mailto:[email protected] <mailto:flexcoders%40yahoogroups.com> <mailto:flexcoders%40yahoogroups.com> > ] On > > Behalf Of j_lentzz > > Sent: Wednesday, November 07, 2007 9:14 AM > > To: [email protected] <mailto:flexcoders%40yahoogroups.com> <mailto:flexcoders%40yahoogroups.com> > > Subject: [flexcoders] Re: Bouncing Focus in DataGrid > > > > > > > > Sorry, I mistyped my last response. The Label is the renderer - not > > editor. I have the Label (or the extended version > LabelWithDownArrow) > > as the renderer. The editor is my extended ComboBox. So, I'm not > > editing with a Label, but I am clicking on it to switch to the > ComboBox. > > > > John > > --- In [email protected] <mailto:flexcoders%40yahoogroups.com> > <mailto:flexcoders%40yahoogroups.com> <mailto:flexcoders% > 40yahoogroups.com> > > , "Alex Harui" <aharui@> wrote: > > > > > > If the editor is not an IFocusManagerComponent, it is not > a 'legal' > > > editor. > > > > > > > > > > > > ________________________________ > > > > > > From: [email protected] <mailto:flexcoders%40yahoogroups.com> > <mailto:flexcoders%40yahoogroups.com> <mailto:flexcoders% > 40yahoogroups.com> > > [mailto:[email protected] <mailto:flexcoders%40yahoogroups.com> > <mailto:flexcoders%40yahoogroups.com> <mailto:flexcoders% > 40yahoogroups.com> > > ] On > > > Behalf Of j_lentzz > > > Sent: Wednesday, November 07, 2007 4:39 AM > > > To: [email protected] <mailto:flexcoders%40yahoogroups.com> <mailto:flexcoders%40yahoogroups.com> > <mailto:flexcoders% > 40yahoogroups.com> > > > Subject: [flexcoders] Re: Bouncing Focus in DataGrid > > > > > > > > > > > > Unfortunately not, it is a dynamically created datagrid. However, > I > > > did discover some interesting things. If I use my custom renderer > and > > > set rendererIsEditor=true, it doesn't do the bouncing focus > thing. If > > > I go back to my original code and set the renderer as a > TextInput, it > > > doesn't do the bouncing thing. When I set the editor to either a > > > Label or my LabelWithDownArrow (an extended Label with the > combobox > > > down arrow), I get the bouncing focus. Could it somehow be > because a > > > Label isn't editable? If so, any ideas how to get around it? > > > > > > Thanks a lot. > > > > > > John > > > --- In [email protected] <mailto:flexcoders%40yahoogroups.com> > <mailto:flexcoders%40yahoogroups.com> > > <mailto:flexcoders%40yahoogroups.com> > > <mailto:flexcoders%40yahoogroups.com> > > > , "Alex Harui" <aharui@> wrote: > > > > > > > > Can you post a small test case? > > > > > > > > > > > > > > > > ________________________________ > > > > > > > > From: [email protected] <mailto:flexcoders%40yahoogroups.com> > <mailto:flexcoders%40yahoogroups.com> > > <mailto:flexcoders%40yahoogroups.com> > > <mailto:flexcoders%40yahoogroups.com> > > > [mailto:[email protected] <mailto:flexcoders%40yahoogroups.com> > <mailto:flexcoders%40yahoogroups.com> > > <mailto:flexcoders%40yahoogroups.com> > > <mailto:flexcoders%40yahoogroups.com> > > > ] On > > > > Behalf Of j_lentzz > > > > Sent: Tuesday, November 06, 2007 3:41 PM > > > > To: [email protected] <mailto:flexcoders%40yahoogroups.com> > <mailto:flexcoders%40yahoogroups.com> <mailto:flexcoders% > 40yahoogroups.com> > > <mailto:flexcoders%40yahoogroups.com> > > > > Subject: [flexcoders] Re: Bouncing Focus in DataGrid > > > > > > > > > > > > > > > > It happens also when I first populate the datagrid or add a > row. In > > > > either case, nothing is selected in the datagrid. When I select > > > > something, the top most left cell briefly gets the focus and > > switches > > > > the component to an editor then back to a renderer and then the > > > > selected item becomes an editor. > > > > > > > > John > > > > --- In [email protected] <mailto:flexcoders%40yahoogroups.com> > <mailto:flexcoders%40yahoogroups.com> > > <mailto:flexcoders%40yahoogroups.com> > > > <mailto:flexcoders%40yahoogroups.com> > > > <mailto:flexcoders%40yahoogroups.com> > > > > , George <yahoo@> wrote: > > > > > > > > > > When you add a new row, dataProvider changed so DG will be > > refreshed > > > > > > > > totally, your item editing process will be eliminated at that > > time. > > > > > You need a callLater() to reselect .selectedIndex to the new > row, > > it > > > > > > > > will be highlighted. Then try to move focus back to the > renderer. > > > > > > > > > > George > > > > > > > > > > Alex Harui wrote: > > > > > > Are the renderers also editors? rendererIsEditor="true". If > so, > > > > is the > > > > > > renderer an IFocusManagerComponent? > > > > > > ________________________________ > > > > > > > > > > > > From: [email protected] <mailto:flexcoders%40yahoogroups.com> > <mailto:flexcoders%40yahoogroups.com> > > <mailto:flexcoders%40yahoogroups.com> > > > <mailto:flexcoders%40yahoogroups.com> > > > > <mailto:flexcoders%40yahoogroups.com> > > > > [mailto:[email protected] <mailto:flexcoders%40yahoogroups.com> > <mailto:flexcoders%40yahoogroups.com> > > <mailto:flexcoders%40yahoogroups.com> > > > <mailto:flexcoders%40yahoogroups.com> > > > <mailto:flexcoders%40yahoogroups.com> > > > > ] On > > > > > > Behalf Of j_lentzz > > > > > > Sent: Tuesday, November 06, 2007 6:06 AM > > > > > > To: [email protected] <mailto:flexcoders%40yahoogroups.com> > <mailto:flexcoders%40yahoogroups.com> > > <mailto:flexcoders%40yahoogroups.com> > > > <mailto:flexcoders%40yahoogroups.com> > > > <mailto:flexcoders%40yahoogroups.com> > > > > > > > > > > Subject: [flexcoders] Bouncing Focus in DataGrid > > > > > > > > > > > > Hello All, > > > > > > > > > > > > I have an app that allows the user to add rows to a > datagrid. > > The > > > > > > rows contain components that have separate item editors and > > > > renderers. > > > > > > What is happening is that after a new row is added to the > > datagrid > > > > > > and the user clicks on a cell that is not the first cell in > the > > > > first > > > > > > row, the focus briefly goes to the first cell in the first > row > > and > > > > > > then to the actual cell selected. It doesn't stay there > long, > > but > > > > > > long enough to see the cell switch to the item editor and > then > > > back > > > > to > > > > > > the renderer. Has anyone else seen this or have a way to > prevent > > > it? > > > > > > > > > > > > Thanks, > > > > > > > > > > > > John > > > > > > > > > > > > > > > > > > > > >

