2010-03-15 5 views
0

Je travaille sur un problème depuis une semaine bientôt, mais je ne pouvais toujours pas le faire fonctionner comme prévu. J'ai un DataGrid qui a HBox avec un CheckBox et un Label comme itemRenderer (voir le code ci-dessous). Quand j'appuie sur la cellule, l'itemEditor standard apparaît et vous permet d'entrer le contenu de l'étiquette. C'est le comportement standard. Je travaille très bien à l'exception des 2 problèmes:Datagrid sélectionne la mauvaise cellule personnalisée dans mon datagrid

  1. Si je rentre au texte beaucoup, apparaît, et la cellule est remplie la srollbar horizontale avec cette barre de défilement. Comme vous le voyez, j'ai essayé de désactiver horizontalScrollPolicy, mais cela ne marche pas du tout ... J'ai essayé de le faire pour tous les différents éléments, mais l'échec existe toujours.

  2. Lorsque j'ai rempli plus d'une ligne, une autre erreur se produit. Si je tape sur une ligne, la grille de données sélectionne celle située en dessous de cette ligne. C'est seulement si une ligne est déjà sélectionnée. Si je tape en dehors de la grille de données et que j'appuie sur n'importe quelle ligne, l'itemEditeur de la ligne de droite apparaîtra ... Y a-t-il quelque chose qui soit corrigé dans la configuration de ma méthode de données?

__

package components 
{ 
import mx.containers.HBox; 
import mx.controls.CheckBox; 
import mx.controls.Label; 

public class ChoiceRenderer extends HBox 
{ 

    private var correctAnswer:CheckBox; 
    private var choiceLabel:Label; 

    public function ChoiceRenderer() 
    { 
    super(); 
    paint(); 
    } 

    private function paint():void{ 
    percentHeight = 100; 
    percentWidth = 100; 
    setStyle("horizontalScrollPolicy", "off"); 
    super.setStyle("horizontalScrollPolicy", "off"); 

    correctAnswer = new CheckBox; 
    correctAnswer.setStyle("horizontalScrollPolicy", "off"); 
    addChild(correctAnswer); 

    choiceLabel = new Label; 
    choiceLabel.setStyle("horizontalScrollPolicy", "off"); 
    addChild(choiceLabel); 


    } 

    override public function set data(xmldata:Object):void{ 
     if(xmldata.name() == "BackSide"){ 
     var xmlText:Object = xmldata.TextElements.TextElement.(@position == position)[0]; 
     super.data = xmlText; 
     choiceLabel.text = xmlText.toString(); 
     correctAnswer.selected = [email protected]_answer; 

     }    
} 
} 

Merci à l'avance! Markus

Répondre

0
  • Je ne suis pas sûr que ce soit la raison de vos problèmes, mais la façon standard de créer des enfants est de remplacer la méthode createChildren.

  • En outre, il vous manque une instruction else - vous n'appelez pas super.data lorsque la condition if échoue. Cela ne semble pas bien non plus.

Essayez:

package components 
{ 
public class ChoiceRenderer extends HBox { 
    private var correctAnswer:CheckBox; 
    private var choiceLabel:Label; 

    public function ChoiceRenderer() { 
    super(); 
    percentHeight = 100; 
    percentWidth = 100; 
    setStyle("horizontalScrollPolicy", "off"); 
    } 
    override protected function createChildren():void { 
    super.createChildren(); 
    correctAnswer = new CheckBox(); 
    addChild(correctAnswer); 
    choiceLabel = new Label(); 
    choiceLabel.setStyle("horizontalScrollPolicy", "off"); 
    addChild(choiceLabel); 
    } 
    override public function set data(xmldata:Object):void { 
    if(xmldata.name() == "BackSide") { 
     var xmlText:Object = xmldata.TextElements.TextElement.(@position == position)[0]; 
     super.data = xmlText; 
     choiceLabel.text = xmlText.toString(); 
     correctAnswer.selected = [email protected]_answer; 
    } 
    else { 
     //what if xmldata.name() is not "BackSide"? 
     //you are not calling super.data in that case 
    } 
    } 
} 
+0

Merci pour votre réponse. Malheureusement, cela ne résout pas les deux problèmes. La raison pour laquelle je n'ai pas d'autre instruction, est que parfois la fonction appelle la ligne entière (BackSide dans le xml) et parfois elle appelle la cellule avec un TextElement ... Je ne sais pas pourquoi, mais exactement ... – Markus

+0

@ Markus En ce qui concerne le problème de la barre de défilement, essayez de commenter les lignes de pourcentage et de hauteur. – Amarghosh

+0

ne change rien ... mais j'ai ajouté le setStyle ("horizontalAlign", "center"); déclaration, et qui a eu un effet! ... Je ne comprends pas ... – Markus

0
  • afin d'éviter la barre de défilement, vous devez laisser DataGrid ont une hauteur variable
 

<mx:DataGrid id="dg" 
dataProvider="{dp}" 
variableRowHeight="true" 
creationComplete="dg.height=dg.measureHeightOfItems(0,dp.length)+dg.headerHeight+2"/> 
+0

Salut Nishu, Merci pour cette réponse, mais ce n'est pas la barre de défilement verticale qui est mon problème, c'est l'horizontale ... – Markus

+0

apologies pour mal lire. avez-vous essayé de définir wordwrap à true et datagridcolum.width à max de cellule mise à jour et datagridcolumn.width – Nishu

Questions connexes