我正在尝试创建一个数据网格,它将垂直调整大小以确保完整显示所有渲染器。此外,

  • 渲染器的高度可变
  • 渲染器可以调整自己的大小

  • 一般来说,事件的流程如下:
  • 项目渲染器之一调整自身大小(通常响应用户点击等)
  • 它调度一个冒泡事件,父数据网格接收
  • DataGrid 尝试调整大小以确保所有渲染器保持完整可见。

  • 我目前在数据网格中使用此代码来计算高度:
    height = measureHeightOfItems(0, dataProvider.length ) + headerHeight;
    

    这似乎得到了不正确的高度。我尝试了许多变体,包括 callLater(以确保调整大小已完成,以便测量可以正常工作),以及覆盖 meausre() 和调用 invalidateSize()/validateSize(),但都不起作用。

    下面是 3 个类,它们将说明问题。单击项目渲染器中的按钮可调整渲染器的大小。网格还应展开,以便完整显示所有 3 个渲染器。

    任何建议将不胜感激。

    问候

    马蒂

    DataGridProblem.mxml(应用程序文件)
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
        xmlns:view="view.*">
        <mx:ArrayCollection id="dataProvider">
            <mx:String>Item A</mx:String>
            <mx:String>Item B</mx:String>
            <mx:String>Item C</mx:String>
        </mx:ArrayCollection>
        <view:TestDataGrid
            id="dg"
            dataProvider="{ dataProvider }"
            width="400">
            <view:columns>
                <mx:DataGridColumn dataField="text" />
                <mx:DataGridColumn itemRenderer="view.RendererButton" />
            </view:columns>
        </view:TestDataGrid>
    </mx:Application>
    

    view.TestDataGrid.as
    package view
    {
        import flash.events.Event;
    
        import mx.controls.DataGrid;
        import mx.core.ScrollPolicy;
    
        public class TestDataGrid extends DataGrid
        {
            public function TestDataGrid()
            {
                this.verticalScrollPolicy = ScrollPolicy.OFF;
                this.variableRowHeight = true;
                this.addEventListener( RendererButton.RENDERER_RESIZE , onRendererResize );
            }
            private function onRendererResize( event : Event ) : void
            {
                resizeDatagrid();
            }
            private function resizeDatagrid():void
            {
                height = measureHeightOfItems(0, dataProvider.length ) + headerHeight;
            }
        }
    }
    

    view.RendererButton.mxml
    <?xml version="1.0" encoding="utf-8"?>
    <mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml">
        <mx:Button width="50" height="50"
            click="onClick()" />
    
        <mx:Script>
            <![CDATA[
    
                public static const RENDERER_RESIZE : String = "resizeRenderer";
                private function onClick() : void
                {
                    this.height += 20;
                    dispatchEvent( new Event( RENDERER_RESIZE , true ) );
                }
            ]]>
        </mx:Script>
    </mx:HBox>
    

    最佳答案

    您可以使用以下代码通过 AdvancedDataGrid 实现此目标。如果删除 this.headerHeight,它也适用于 List,这让我相信它应该适用于常规的旧 DataGrid。

      override protected function measure():void
      {
       super.measure();
    
       if ( this.dataProvider )
       {
        var newHeight : int = measureHeightOfItems( 0, this.dataProvider.length ) + this.headerHeight;
    
        this.minHeight = newHeight;
        this.height = newHeight;
       }
      }
    

    关于apache-flex - Flex - 自动调整数据网格大小的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/609964/

    10-13 08:54