2010-07-23 51 views
1

所以,我有一个AdvancedDataGrid需要在Canvas中生存。我的问题是,当你做这样的事情时,你会得到两套滚动条。另外,AdvancedDataGrid的水平滚动条在从右向左滚动时会改变大小,并且不会让您向右滚动,这似乎很奇怪。AdvancedDataGrid水平/垂直滚动条问题。 (Flex)

我已经把AdvancedDataGrid上的水平滚动关掉了,只让Canvas处理它。但是,当我这样做时,这些列不允许自己调整大小。啊。

我目前的“最佳”解决方案是让AdvancedDataGrid处理垂直滚动,Canvas处理水平滚动,但这看起来很疯狂,更不用提我上面提到的问题,我无法再调整列的大小。

任何帮助,非常感谢! 谢谢!

回答

4

AdvancedDataGrid的水平滚动有点奇怪,因为它根据可见列的宽度调整其水平滚动条的大小。你实际上可以可以拖动大拇指到最后,但它可能需要几次尝试。 (我知道,我知道...)

请记住,在AdvancedDataGrid中没有任何实际渲染的视口外,所以任何大小只是一个受过教育(很好,有点教育)的猜测。 Adobe会这么做,以便大型网格不会陷入爬行(想象一下,每次调整窗口大小时,都会对15,000个单元的itemRenderer运行度量方法)。

我的建议是关闭画布中的垂直和水平滚动策略,并允许在ADG中处理滚动。这很丑陋,但它击败了替代品。无论如何,ADG是一个繁琐的,反常的装置,这可能是Adobe开源的原因。我已经多次宣誓,我永远不会再使用它。直到下一次我需要它的功能时,我才能保留这个誓言。大约每周一次。

+0

感谢您的响应。 当你说我开心地把它拖到最右边时,情况就是这样。无论出于何种原因,发生的事情是,画布比网格稍大,即使网格是画布内唯一的东西!正如前面提到的,我无法完全滚动的原因是因为Canvas一直滚动到左边,唯一的方法是让两个滚动条成为一条直线......什么地狱?! 任何想法为什么帆布会更大?宽度和高度都设置为100% – Craig 2010-07-23 20:41:51

+0

AdvancedDataGrid周围可能有一些不可见的边框蒙皮。无论如何,在画布上设置horizo​​ntalScrollPolicy =“false”和verticalScrollPolicy =“false”。尽管我很欣赏www.Flextras.com其他地方,但我不会建议让画布在这里处理滚动。这会挫败ADG渲染优化并降低性能,IMO。 – Robusto 2010-07-23 20:55:24

+0

好吧,我通过将datagrid的宽度设置为“this.width”而不是100%(在Canvas中)来解决我之前遇到的问题,所以现在我可以实际得到网格的末端。它使网格中的最后一列比现在网格中的其余列更大......对此有何想法? AdvancedDataGrid是一件可怕的事情。 – Craig 2010-07-23 21:35:32

1

AdvancedDataGrid是您画布中唯一的东西吗?

我会调整AdvancedDataGrid的高度和宽度,并让Canvas处理滚动。

在画布中,重写方法的updateDisplayList,做这样的事情:

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

这样在AdvancedDataGrid应该没有滚动条。但是,如果它向下拉得太远或太靠右,那么滚动条就会出现在画布上。

您可能会从Flex Coordinate System上阅读。 AdvancedDataGrid是你的“内容”,而画布将是你的本地。


我正在添加一个完整的运行代码示例来演示我的建议。

这与在其内部移动AdvancedDataGrid画布组件: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> 

这是主应用程序文件:

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

嗨,谢谢你的回应。我非常喜欢canvas处理在AdvancedDataGrid上滚动的方式,在我的情况下,性能不会成为问题,因为网格永远不会令人难以置信。但是,我无法让您的代码正常工作。所有这些都使电网变得非常小。我不确定我是否在做一些疯狂的事情,但大部分时候我只是将代码复制到Canvas中。 – Craig 2010-07-23 21:38:52

+0

您能向我们展示更多代码吗?我实际上并不确定AdvancedDataGrid如何计算它的大小。 – JeffryHouser 2010-07-23 22:16:49

+0

我添加了一个完整的运行示例来演示我的建议。 – JeffryHouser 2010-07-23 22:27:06