Flex:当自定义 itemrenderers 中的文本更改时,强制重绘 DataGrid
Posted
技术标签:
【中文标题】Flex:当自定义 itemrenderers 中的文本更改时,强制重绘 DataGrid【英文标题】:Flex: Force redraw of the DataGrid when text changes in custom itemrenderers 【发布时间】:2015-01-04 07:54:05 【问题描述】:希望有人可以在这里帮助我。我有一个使用自定义 itemrenderers 的 DataGrid。除了在稍后设置多行文本的一种类型的 itemrenderer 之外,一切都工作正常(根据某些条件,它来自数据库)。在这种情况下,文本将按原样变为多行,但行高没有增加,因此文本与下一行重叠。
如果我调整列的大小,则将行调整为正确的大小(因为文本已经存在并且标签具有正确的高度)。另外,如果我向下滚动它看起来很好。
那么在设置文本后如何强制将行调整为正确的新高度?
我已经尝试了几乎所有的东西 - 在我获得新的标签高度之后,在 itemrenderer 和数据网格上进行 validateNow() 等等。
我知道一个好方法是在将数据传递到数据网格之前执行 sql 查询,但它是一个动态元数据块并且相当复杂。一定有办法重新渲染 DataGrid 吗?
它适用于早期的 SDK 版本,但不适用于我的新设置(Flex SDK 4.13 + AIR 14)
这是 DataGrid 的代码:
<s:DataGrid id="dG"
variableRowHeight="true"
creationComplete="dgCreation()"
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"
/>
</s:GridItemRenderer>
非常感谢您的宝贵时间!
【问题讨论】:
【参考方案1】:我观察到有时在服务处理程序/回调中处理来自数据库的数据会导致奇怪的行为。我的解决方案是使用“callLater”方法。
如果你像这样在渲染器中修改你的处理程序可能会有所帮助:
//responder from async dbCall
public function onLookupComplete(result:SQLResult):void
callLater(function():voidmyContent.text = resultString;);
【讨论】:
不幸的是,这对我没有帮助。我也尝试通过 commitProperties() 设置文本,不管我如何设置它,渲染器大小仍然没有重置。我需要一种方法来强制数据网格以某种方式重新渲染。【参考方案2】:嗯,结果比我想象的要容易得多。我已经尝试过 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();
【讨论】:
以上是关于Flex:当自定义 itemrenderers 中的文本更改时,强制重绘 DataGrid的主要内容,如果未能解决你的问题,请参考以下文章
Flex 4.5:带有自定义 ItemRenderes 的 Spark DataGrid
Flex 3:如何在其 ItemRenderer 中获取 DataGridColumn 的 dataField?
如何更改 flex 4 spark 数据组的一个成员的 itemRenderer 的状态?