希望有人可以帮助我。我有一个使用自定义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>
非常感谢你的时间!
答案 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();
}