2010-12-06 4 views
0

Ich habe ein Datagrid mit einer einzelnen Spalte, die mit einem anderen Datagrid gerendert wurde. Ich mache das, um eine rowspan-ähnliche Anzeige (mit einer hbox unter dem Kind-Datagrid) zu implementieren, die Nachrichten unter jeder Zeile anzeigt. Wenn ich das Ende einer Zeile ankreuze und erreiche, möchte ich, dass der Fokus an die nächste Zeile, d. H. An das nächste untergeordnete Datagrid und an eine bestimmte Zelle dieser Zeile, weitergegeben wird. Dies ist der vereinfachte Code Aufruf der Renderer:Verschachteltes Datagrid: Fokus auf das interne Datagrid setzen

<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> 

Und den Renderer (ColumnRendererDatagrid) Code:

<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%" /> 

Im Moment bin ich in ColumnRendererDatagrid den folgenden Ausschnitt verwenden, wenn erreicht Tabbing zu überprüfen das Ende der Reihe und sprudeln die Veranstaltung:

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

von dort ich bin zu kämpfen, wie in den Renderer zu bohren, um die Schärfe einzustellen auf Die höhere Komponente erhält dieses Ereignis. Jede Hilfe würde wirklich geschätzt werden. Thx

Antwort

0

Ok, hier ist die Lösung, die ich mir ausgedacht habe. Dies ist der Code in den Ereignisbehandlungsroutine der Eltern (die MOVE_FOCUS_DOWN Handling):

//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} 

(natürlich sollte überprüft in Echt Code vorgenommen werden, um zu sehen, ob das nächste Objekt existiert), die vom Typ ColumnRendererDatagrid ist. Von dort aus stelle ich nur die Fokus-/Bearbeitungsposition ein.