2010-07-23 4 views
1

Donc, j'ai un AdvancedDataGrid qui a besoin de vivre à l'intérieur d'un canevas. Mon problème est que lorsque vous faites quelque chose comme ça, vous obtenez deux ensembles de barres de défilement. En outre, la barre de défilement horizontale pour AdvancedDataGrid change de taille lorsque vous faites défiler vers la droite et ne vous laisse pas défiler tout le chemin vers la droite, ce qui semble étrange.Problèmes de barre de défilement horizontale/verticale AdvancedDataGrid. (Flex)

J'ai désactivé le défilement horizontal sur AdvancedDataGrid et ne laisse que le Canvas le gérer. Quand je fais cela, cependant, les colonnes ne se permettent pas d'être redimensionnables. Pouah. Ma meilleure solution actuelle est de faire défiler le défilement vertical par AdvancedDataGrid et le défilement horizontal par le Canvas, mais cela semble fou, sans parler du problème que j'ai mentionné ci-dessus où je ne peux plus redimensionner les colonnes .

Toute aide est grandement appréciée! Merci!

Répondre

4

Le défilement horizontal d'AdvancedDataGrid est quelque peu particulier, en ce sens qu'il dimensionne son pouce de défilement horizontal en fonction de la largeur des colonnes visibles. En fait pouvez faire glisser le pouce vers la fin, mais cela peut prendre quelques essais. (Je sais, je sais ...)

Rappelez-vous que dans AdvancedDataGrid, il n'y a rien de rendu en dehors de la fenêtre d'affichage, donc tout dimensionnement est une supposition éclairée (enfin, un peu éduquée). Adobe fait cela pour que les grilles énormes ne s'enfoncent pas dans l'analyse (imaginez des méthodes de mesure en cours sur des itemRenderers de 15 000 cellules chaque fois que vous redimensionnez la fenêtre).

Mon conseil consiste à désactiver les stratégies de défilement vertical et horizontal dans le canevas et à autoriser le défilement à gérer dans l'ADG. C'est moche, mais ça bat l'alternative. L'ADG est un outil encombrant et capricieux de toute façon, ce qui explique peut-être pourquoi Adobe l'a ouvert. J'ai juré plusieurs fois que je ne l'utiliserais plus jamais. J'ai été capable de garder ce vœu seulement jusqu'à la prochaine fois que j'avais besoin de ses fonctionnalités. Ce qui est à peu près chaque semaine.

+0

Merci pour la réponse. Quand vous dites que je peux faire glisser tout le chemin vers la droite, c'est un peu le cas. Qu'est-ce qui se passe, pour une raison quelconque, est que la toile est légèrement plus grande que la grille, même si la grille est la seule chose à l'intérieur de la toile! La raison pour laquelle je ne peux pas faire défiler tout le chemin, comme mentionné précédemment, est parce que le Canvas est défilé tout à fait à gauche et la seule façon de faire tout le chemin vers la droite est d'avoir deux barres de défilement ... l'enfer?! Des idées pour lesquelles le Canvas serait plus grand? La largeur et la hauteur des deux éléments sont définies sur 100% – Craig

+0

Il existe probablement un habillage de bordure invisible autour de AdvancedDataGrid. Dans tous les cas, définissez horizontalScrollPolicy = "false" et verticalScrollPolicy = "false" sur votre canevas. Et autant que j'admire www.Flextras.com ailleurs, je ne conseillerais pas suite à sa suggestion de laisser la toile manipulant le défilement ici. Cela irait à l'encontre des optimisations de rendu ADG et de réduire les performances, IMO. – Robusto

+0

Ok, j'ai corrigé le problème que j'avais en plaçant la largeur de la grille de données à "this.width" au lieu de 100% (à l'intérieur du Canvas), maintenant je peux obtenir la fin de la grille. Cela rend la dernière colonne de la grille beaucoup plus grande que le reste des colonnes de la grille maintenant ... des idées là-dessus? AdvancedDataGrid est une terrible chose terrible. – Craig

1

Le composant AdvancedDataGrid est-il le seul élément de votre canevas?

Je voudrais redimensionner AdvancedDataGrid à sa hauteur et sa largeur et laisser le Canvas gérer le défilement.

Dans la toile, substituez la méthode updateDisplayList et faire quelque chose comme ceci:

protected function updateDisplayList(unscaledWidth: Number, unscaledHeight: Number):void{ 
super.updateDisplayList, unscaledHeight); 
this.myAdvancedDataGrid.setActualSize(this.myAdvancedDataGrid.measuredHeight, this.myAdvancedDataGrid.measuredWidth); 
} 

De cette façon, le AdvancedDataGrid ne devrait pas avoir des barres de défilement. Cependant, si elle s'étend trop loin ou trop loin, les barres de défilement apparaîtront dans le canevas. Vous pourriez bénéficier de la lecture sur le Flex Coordinate System. L'AdvancedDataGrid est votre "contenu" tandis que le canevas serait votre locale. J'ajoute un exemple de code de fonctionnement complet pour démo de ma suggestion.

Ceci est le composant de la toile avec un AdvancedDataGrid intérieur: com.flextras.stackOverflow.CanvasWithGrid

<?xml version="1.0" encoding="utf-8"?> 
<mx:Canvas xmlns:fx="http://ns.adobe.com/mxml/2009" 
      xmlns:s="library://ns.adobe.com/flex/spark" 
      xmlns:mx="library://ns.adobe.com/flex/mx" width="400" height="300"> 
    <fx:Declarations> 
     <!-- Place non-visual elements (e.g., services, value objects) here --> 
    </fx:Declarations> 

    <fx:Script> 
     <![CDATA[ 
      import mx.collections.ArrayCollection; 

      override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void{ 
       super.updateDisplayList(unscaledWidth, unscaledHeight); 
       this.myADG.setActualSize(this.myADG.measuredWidth, this.myADG.measuredWidth); 
      } 

      [Bindable] 
      private var dpFlat:ArrayCollection = new ArrayCollection([ 
       {Region:"Southwest", Territory:"Arizona", 
        Territory_Rep:"Barbara Jennings", Actual:38865, Estimate:40000}, 
       {Region:"Southwest", Territory:"Arizona", 
        Territory_Rep:"Dana Binn", Actual:29885, Estimate:30000}, 
       {Region:"Southwest", Territory:"Central California", 
        Territory_Rep:"Joe Smith", Actual:29134, Estimate:30000}, 
       {Region:"Southwest", Territory:"Nevada", 
        Territory_Rep:"Bethany Pittman", Actual:52888, Estimate:45000}, 
       {Region:"Southwest", Territory:"Northern California", 
        Territory_Rep:"Lauren Ipsum", Actual:38805, Estimate:40000}, 
       {Region:"Southwest", Territory:"Northern California", 
        Territory_Rep:"T.R. Smith", Actual:55498, Estimate:40000}, 
       {Region:"Southwest", Territory:"Southern California", 
        Territory_Rep:"Alice Treu", Actual:44985, Estimate:45000}, 
       {Region:"Southwest", Territory:"Southern California", 
        Territory_Rep:"Jane Grove", Actual:44913, Estimate:45000} 
      ]); 

     ]]> 
    </fx:Script> 

    <mx:AdvancedDataGrid id="myADG" 

         initialize="gc.refresh();"> <!-- width="100%" height="100%" -->  
     <mx:dataProvider> 
      <mx:GroupingCollection id="gc" source="{dpFlat}"> 
       <mx:grouping> 
        <mx:Grouping> 
         <mx:GroupingField name="Region"/> 
         <mx:GroupingField name="Territory"/> 
        </mx:Grouping> 
       </mx:grouping> 
      </mx:GroupingCollection> 
     </mx:dataProvider>   

     <mx:columns> 
      <mx:AdvancedDataGridColumn dataField="Region"/> 
      <mx:AdvancedDataGridColumn dataField="Territory"/> 
      <mx:AdvancedDataGridColumn dataField="Territory_Rep" 
             headerText="Territory Rep"/> 
      <mx:AdvancedDataGridColumn dataField="Actual"/> 
      <mx:AdvancedDataGridColumn dataField="Estimate"/> 
     </mx:columns> 
    </mx:AdvancedDataGrid> 

</mx:Canvas> 

Ceci est le fichier de l'application principale:

<?xml version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" xmlns:stackOverflow="com.flextras.stackOverflow.*"> 
    <fx:Declarations> 
     <!-- Place non-visual elements (e.g., services, value objects) here --> 
    </fx:Declarations> 

    <stackOverflow:CanvasWithGrid width="200" height="200" /> 


</s:Application> 
+0

Salut, merci pour la réponse. J'aime vraiment la façon dont canvas gère le défilement sur AdvancedDataGrid et dans mon cas, la performance ne sera pas un problème car la grille ne sera jamais incroyablement grande. Cependant, je n'ai pas réussi à faire fonctionner correctement votre code. Tout cela a été de rendre la grille incroyablement petite. Je ne suis pas sûr si je faisais quelque chose de fou, mais pour la plupart je viens de copier le code dans le Canvas .. – Craig

+0

Pouvez-vous nous montrer plus de code? Je ne suis pas sûr de savoir comment AdvancedDataGrid calcule sa taille. – JeffryHouser

+0

J'ai ajouté un échantillon complet pour démontrer ma suggestion. – JeffryHouser