嵌套数据网格:将焦点设置在内部数据网格上

时间:2010-12-06 12:36:48

标签: flex flex3

我有一个datagrid,其中一列用另一个datagrid呈现。我这样做是为了实现类似行的显示(在子数据网格下面有一个hbox),显示每行下面的消息。 当我选中并到达行尾时,我希望焦点传递到下一行,即下一个子数据网格和该行的特定单元格。 这是调用渲染器的简化代码:

<mx:DataGrid width="100%"
                 showHeaders="false"
                 selectable="false"
                 id="ParentDatagrid"
                 dataProvider="{arrayActs}"
                 paddingBottom="0" paddingTop="0"
                 variableRowHeight="true">
        <mx:columns>
            <mx:DataGridColumn itemRenderer="components.ColumnRendererDatagrid"/>
        </mx:columns>
    </mx:DataGrid>

渲染器(ColumnRendererDatagrid)代码:

<mx:DataGrid 
    id="dgLocal" width="100%" height="23" borderSides=""
    dataProvider="{data}" showHeaders="false"
    editable="true" selectable="false">
    <mx:columns>
        <mx:DataGridColumn />
        <mx:DataGridColumn />
        <mx:DataGridColumn />
        <mx:DataGridColumn />
        <mx:DataGridColumn />
    </mx:columns>
</mx:DataGrid>
<mx:HRule width="100%" />
<mx:Label id="message" text="Error Message" width="100%" />

目前,我正在使用ColumnRendererDatagrid中的以下代码片段来检查Tab键何时到达行尾并冒泡事件:

if(dgLocal.editedItemPosition.columnIndex == 13){
                dispatchEvent(new Event(MOVE_FOCUS_DOWN, true));

从那里开始,我一直在努力研究如何在较高的组件获得此事件时深入到渲染器以设置焦点。任何帮助将非常感激。 THX

1 个答案:

答案 0 :(得分:0)

好的,这是我提出的解决方案。这是父事件处理程序中的代码(处理MOVE_FOCUS_DOWN):

//Find the postition of the item that sent the event :
for each( var row:Object in ParentDatagrid.dataProvider ) {     
                if( (event.target as ColumnRendererDatagrid).data == row) {
                    break;
                }
                i++;
            } 

//Get the renderer of the next item :
  var render:IListItemRenderer = ParentDatagrid.itemToItemRenderer(arrayActes.getItemAt(i+1));
  (render as ColumnRendererDatagrid).dgLocal.editedItemPosition = {rowIndex:0, columnIndex:1}

(显然应该在实际代码中进行检查以查看下一个对象是否存在),其类型为ColumnRendererDatagrid。从那里我只设置了焦点/编辑位置。