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中刷新itemrenderer

Flex 3:如何在其 ItemRenderer 中获取 DataGridColumn 的 dataField?

如何更改 flex 4 spark 数据组的一个成员的 itemRenderer 的状态?

我如何知道何时单击了 Flex DataGrid itemRenderer 中的按钮?

flex 覆盖公共函数集数据