L'accès à une ItemRenderer dans un DataGrid
J'ai une grille de données qui contient une case à cocher rendu d'élément dans un cloumn à autoriser la ligne de sélections:
Principale de l'application:
<mx:DataGrid id="dg">
<mx:columns>
<mx:DataGridColumn id="ir" itemRenderer="renderers.RowCheckbox" />
<mx:DataGridColumn dataField="Name" headerText="Name" />
</mx:columns>
</mx:DataGrid>
Rendu d'élément:
<-- RowCheckbox -->
<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" horizontalAlign="center">
<mx:CheckBox id="chk"/>
</mx:HBox>
Comment puis-je obtenir un handle pour le rendu d'élément /case afin que je puisse déterminer quelles lignes sont-elles vérifiées?
OriginalL'auteur mmattax | 2009-02-07
Vous devez vous connecter pour publier un commentaire.
Juste un petit conseil: Nous avons eu un problème similaire dans notre application, et nous l'avons résolu en ajoutant un "sélectionnés" à la propriété des entités du dataprovider de la grille de données. La propriété sélectionnée de la case a ensuite été lié à la propriété sélectionnée de notre entité. Pour savoir quels sont ceux qui ont été sélectionnés, nous venons d'en boucle sur les entités du dataprovider au lieu de l'élément convertisseurs. Après beaucoup de différentes approches, c'est vraiment la meilleure option.
Si je me souviens bien, le problème est que la itemrenderers ne me souviens pas de l'état sélectionné correctement et la grille de données a été complètement foiré quand vous défiler vers le haut ou vers le bas. Le mal de lignes ont été sélectionnés après le défilement.
Une autre option serait de distribuer un événement dans le rendu d'élément qui se propage jusqu'à l'hébergement de contrôle de la grille de données. Vous pouvez ensuite écouter ces événements et de mise à jour de votre modèle afin de refléter les changements.
Nous avons utilisé cette approche en tant que bien, et je serais d'accord c'est probablement la méthode la plus simple.
C'est probablement la méthode la plus simple et la plus élégante de la solution ( comme Il est complètement compatible avec la programmation orientée objet des règles d'encapsulation), nous avons trouvé.
C'est une bonne façon d'aller à ce sujet si vous ne me dérange pas d'avoir d'autres conneries dans vos données. Si vous vous voulez aller sur la façon dont dur vous pouvez utiliser le visibleData bien sur la grille de données pour analyser les lignes qui doivent être sélectionnés de la actuellement les lignes visibles. Puis, lorsque le contrôle datagrid est décalée, une réévaluation des lignes doit être sélectionné.
Le itemRenderers doit changer eux-mêmes basés sur les données qu'ils sont donnés pour montrer. C'est parce que ItemRenderers sont recyclés. Si vous modifiez les données de la ce sur l'écran est la 4ème ItemRenderer, vous pouvez effectivement être apporter des modifications à la 11e place. En d'autres termes, vous ne devez pas modifier les valeurs d'un ItemRenderer de l'extérieur. Vous devez avoir chaque ItemRenderer réagir à des changements en eux-mêmes. adobe.com/devnet/flex/articles/itemrenderers_pt1.html
OriginalL'auteur Christophe Herreman
J'ai couru dans des problèmes similaires avec la grille de données et de multiples élément de convertisseurs et de la réutilisation de l'élément de convertisseurs lors du défilement. Pour accéder à DataGrid élément de moteurs de rendu, j'ai étendu le contrôle DataGrid. Ma première pensée a été d'utiliser le indicesToIndex (), suivie par indexToItemRenderer(). Malheureusement, ces méthodes ne font pas ce que j'attendais j'ai donc ajouté le indicesToItemRenderer() méthode:
package com.quoi que ce soit.les contrôles
{
Pour résoudre le réutilisés élément convertisseurs lors du défilement de problème, reportez-vous à cet article:
http://www.adobe.com/devnet/flex/articles/itemrenderers_pt1.html
Elle se résume à l'remplaçant les données de setter et de stockage des propriétés des données. Par exemple, j'avais une colonne à l'aide d'une Case à cocher itemRenderer et une autre colonne à l'aide de zone de liste déroulante. Pour les deux j'écoute pour l'événement de changement et de magasin sélectionné, selectedIndex, etc dans les données chaque fois qu'un changement des propriétés et de remplacer les données setter pour définir ces propriétés:
OriginalL'auteur
Vous pouvez utiliser le
indexToItemRenderer()
méthode exposée par toutes les sous-classes de ListBase.Par exemple:
... où
index
représente l'indice de la grille de données de l'élément dont la "chk" la propriété que vous voulez tester.Bon point, oui. Christophe réponse est en fait mieux; j'ai utilisé l'approche ci-dessus sur une seule colonne, non-défilement des listes et avait de bons résultats, mais ce que vous êtes vraiment la recherche n'est ni une propriété des données sous-jacentes, ni de l'affichage visible des objets, mais plutôt quelque chose dans le milieu.
Vous pouvez modifier votre fonction ci-dessus pour vérifier à la fois la ligne et la colonne de la coutume moteur de Rendu... someFunction(ligne:int,cellulaire:int):void
OriginalL'auteur Christian Nunciato
Dans le ItemRenderer, essayez de mettre du Composant Checkbox dans une VBox..résout le problème de défilement.
OriginalL'auteur himanshu