Flex:在自定义itemrenderer中更改文本时强制重绘DataGrid

时间:2014-11-07 13:45:56

标签: flex actionscript flex4 adobe flash-builder

希望有人可以帮助我。我有一个使用自定义itemrenderers的DataGrid。一切工作正常,除了一种类型的itemrenderers,其中稍后设置多行文本(它根据某些条件来自数据库)。在这种情况下,文本将按原样进行多行,但行的高度不会增加,因此文本与下一行重叠。

如果我调整列的大小,行的大小将调整为正确的大小(因为文本已经存在且标签的高度正确)。此外,如果我向下滚动它看起来很好。

那么在设置文本后如何强制将行调整到正确的新高度?

我在itemrenderer和datagrid上尝试了几乎所有的东西 - validateNow(),我得到了一个新的标签高度等等。

我知道一种好方法是在将数据传递给datagrid之前执行sql查询,但它是一个动态元数据块并且相当复杂。必须有一种方法来重新渲染DataGrid?

它适用于早期的SDK版本,但不适用于我的新设置(Flex SDK 4.13 + AIR 14)

以下是DataGrid的代码:

<s:DataGrid id="dG"
                  variableRowHeight="true"
                  creationComplete="dgCreation()"
                  width="100%"
                  height="100%"
                  dataProvider="{theDataProvider}"
                  doubleClickEnabled="true"
                  initialize="dG.grid.rowBackground = dG.alternatingRowColorsBackground"
                  selectionChanging="dG_selectionChangingHandler(event)">

    <SMT:columns>
        <s:ArrayList>
        </s:ArrayList>
    </SMT:columns>

</s:DataGrid>

还有itemRenderer:

<s:GridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
                xmlns:s="library://ns.adobe.com/flex/spark"
                textAlign="left">
<fx:Script>
    <![CDATA[

        override public function set label(value:String):void
        {

            // do the sql lookup here

        }

        //responder from async dbCall
        public function onLookupComplete(result:SQLResult):void
        {               
                myContent.text = resultString;
        }

    ]]>
</fx:Script>

<s:Label id="myContent"
         left="5"
         top="9"
         text=""
         maxDisplayedLines="5"
         lineBreak="toFit"
         verticalAlign="top"
         width="100%"/>
</s:GridItemRenderer>

非常感谢你的时间!

2 个答案:

答案 0 :(得分:0)

我有时观察到来自服务处理程序/回调中来自DB的处理数据会导致奇怪的行为。我的解决方案是使用“callLater”方法。

如果您在渲染器中修改处理程序,可能会有所帮助,如下所示:

//responder from async dbCall
public function onLookupComplete(result:SQLResult):void
{               
     callLater(function():void{myContent.text = resultString;});
}

答案 1 :(得分:0)

嗯,结果比我想象的容易得多。我已经尝试了validateDisplayList()但需要DataGrid上的invalidateDisplayList()(它在那里做了一些事情)。

itemrenderer的代码:

override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
{
    super.updateDisplayList(unscaledWidth, unscaledHeight);

    // force the grid to re-render again
    column.grid.invalidateDisplayList();
}
相关问题