2010-12-06 17 views
0

J'ai une grille de données avec une seule colonne rendue avec une autre grille de données. Je fais ceci pour implémenter un affichage semblable à rowspan (avec une hbox sous le datagrid d'enfant) montrant des messages sous chaque rangée. Lorsque je tabule et que j'atteins la fin d'une ligne, je souhaite que le focus passe à la ligne suivante, c'est-à-dire à la prochaine grille de données enfant et à une cellule spécifique de cette ligne. Ce est le code simplifié appelant le moteur de rendu:DataGrid imbriqué: mise au point sur la grille de données interne

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

Et le moteur de rendu (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%" /> 

Pour le moment, j'utilise l'extrait suivant dans ColumnRendererDatagrid pour vérifier si atteint tabulant la fin de la ligne et bouillonner l'événement:

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

de là, je me bats sur la façon de forer vers le bas dans l'renderer de mettre l'accent sur Ce composant supérieur obtient cet événement. Toute aide sera grandement appréciée. Thx

Répondre

0

Ok, voici la solution que j'ai trouvée. Voici le code dans le gestionnaire d'événements du parent (manipulation du 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} 

(évidemment les chèques doivent être en code réel pour voir si l'autre objet existe) qui est de type ColumnRendererDatagrid. De là, je viens de définir la position de mise au point/d'édition.