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"
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], "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:[EMAIL PROTECTED] On
> Behalf Of j_lentzz
> Sent: Wednesday, November 07, 2007 5:03 PM
> To: [email protected]
> 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>
> , "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:[email protected] <mailto:flexcoders%40yahoogroups.com>
> ] On
> > Behalf Of j_lentzz
> > Sent: Wednesday, November 07, 2007 9:14 AM
> > To: [email protected] <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>
> > , "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:[email protected]
> <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>
> > > 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>
> > > , "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:[email protected]
> <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>
> > > > 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>
> > > > , 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:[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 6:06 AM
> > > > > > To: [email protected]
> <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
> > > > > >
> > > > >
> > > >
> > >
> >
>