1

我有几行文本数据,可以在 0 到 100 之间变化,并且一次都需要在屏幕上可见。默认行为适用于网格,直到行 * rowHeight > gridHeight。

基本上我需要一个挂钩到项目高度或行高来根据网格的高度计算它。我已将 paddingTop 和 paddingBottom 设置为零,但行之间仍有大量空白。

我的数据网格组件...

<mx:DataGrid xmlns:mx="http://www.adobe.com/2006/mxml"
creationComplete="OnCreationComplete()"
paddingTop="0"
paddingBottom="0"
>

<mx:Script>
    <![CDATA[

    private function OnCreationComplete():void
    {
        //setRowHeight(10);
    }

    override protected function setRowHeight(v:Number):void
    {
        super.setRowHeight(v);
    }

    ]]>
</mx:Script>

</mx:DataGrid>

setRowHeight() 有帮助,但如果我将行高设置为 10,则单元格的 itemRender 比单元格大。

4

2 回答 2

1

您可能希望查看 DataGrid.variableRowHeight 属性,当它设置为 false(默认值)时,所有行的高度都将与最大的 itemRenderer 相同。您还可以考虑为每个 DataColumn 编写自己的 itemRenderer。

如果你真正想做的只是根据 dataProvider 中的项目数设置行高,你可以像这样设置 DataGrid.rowHeight 属性(假设你的网格有一个固定的高度,比如 100%):

myDataGrid.dataProvider = myArray;
myGrid.rowHeight = Math.floor((myGrid.height - myGrid.headerHeight)/myArray.length);

(我在这里发言是因为如果你最终得到一个四舍五入的小数值,你需要一个滚动条)

正如我认为您已经注意到的那样,这种方法的唯一问题是 itemRenderer 可能无法在太小的一行中正确显示。我想您可以通过根据其高度更改渲染器中的字体来解决此问题。

于 2009-01-07T10:48:13.890 回答
0

谢谢inferis,这对我帮助很大。这是我的最后一个网格组件。由于一些调用,它并不是真正独立的,但如果它可以帮助其他人让他们的工作,那就太好了!

<?xml version="1.0" encoding="utf-8"?>
<mx:DataGrid xmlns:mx="http://www.adobe.com/2006/mxml"
paddingTop="-3"
paddingBottom="-3"
resize="OnResize(event)"
>

<mx:Script>
    <![CDATA[
        import mx.containers.Panel;
    import mx.core.Application;
    import mx.events.ResizeEvent;

    protected function OnResize(event:ResizeEvent):void
    {
        this.invalidateDisplayList();
    }

/**
 *  @private
 *  Sizes and positions the column headers, columns, and items based on the
 *  size of the DataGrid.
 */
override protected function updateDisplayList(unscaledWidth:Number,
                                              unscaledHeight:Number):void
{
    if( this.collection.length > 0 ) // so don't divide by zero
    {
        var appHeight:Number = Application.application.height;
        var appMinusMenuHeight:Number = appHeight - Application.application.hboxPrintBar.height;
        var boxHeight:Number = Application.application.vboxViewAll.height;
        if( boxHeight > 0 )
        {
            var gridHeight:Number = (appMinusMenuHeight - this.headerHeight) * 0.93;
            var calcHeight:Number = gridHeight / this.collection.length;
            var calcHeightFloor:Number = Math.floor( calcHeight );
            setRowHeight( calcHeightFloor );
            //var p:Panel = this.parent as Panel;
            //p.title = calcHeightFloor.toString();
            if( calcHeightFloor <= 10 )
                this.setStyle("fontSize",calcHeightFloor);
        }
    }
    super.updateDisplayList(unscaledWidth,unscaledHeight);
}

    ]]>
</mx:Script>

</mx:DataGrid>
于 2009-01-13T00:21:35.707 回答