Flex DataGrid ItemRenderer问题

时间:2010-01-26 01:39:29

标签: flex datagrid itemrenderer

我的网格中包含> 1000个数据集。一列使用自定义itemRenderer,用于显示外键的值。

显示所有未滚动显示的数据集,并显示正确的信息。但是当涉及到滚动时,一些数据集将在itemRenderer中显示错误的值。据我所知,这是因为itemRenderers的重复使用。

但是,尽管重用可能很重要,但显示错误的信息不是结果。 那我该怎么摆脱这个问题?

编辑:我设法摆脱了这个问题,但无论如何我会发布一些代码来指出我的计划:

<?xml version="1.0" encoding="utf-8"?>

    

<mx:Script>
    <![CDATA[
        private var dataAccess : DataAccess = DataAccess.getInstance();
        private var foreign : ArrayCollection = new ArrayCollection();

        private function onCreationComplete() : void
        {

            dataAccess.service.getForeignDatasets.addEventListener("result", onGetForeignDatasets);
            dataAccess.service.getForeignDatasets();
        }

        private function onGetForeignDatasets(event : ResultEvent) : void
        {
            foreign = event.result as ArrayCollection;  
            preSelect();
        }   

        //gets the entry from the foreign entity which matches 
        //the foreign key in this.data
        private function preSelect() : void
        {
            for each(var obj : Object in foreign)
                {
                    if(obj.id == data.foreignKey))
                    {
                        value.text = obj.name;
                        return;
                    }
                }

            value.text = "";    
        }

        private function onDataChange() : void
        {
            preSelect();
        }       
    ]]>
</mx:Script>

我留下了所有不必要的代码......

上面的代码可以解决显示错误数据的问题。

实现此功能还有其他想法吗?

3 个答案:

答案 0 :(得分:0)

如果您的项呈示器将信息缓存在私有变量中(或其他任何地方),则会发生这种情况。项目渲染通过“data”属性获取数据。它不应该使用不在“data”属性中的任何数据。如果您必须到达外部以获取其他数据(您实际上不应该这样做),那么请确保在数据属性更改时使该数据无效(覆盖数据以标记已更改的标志,然后调用super.data)。 / p>

如果这不能解决您的问题,请发布您的项目渲染器代码。

答案 1 :(得分:0)

使用DataGrid控件的自定义ItemRenderer,我也遇到过这种问题。 一切都很好,但是当我滚动DataGrid时,我的ItemRenderers没有显示正确的值。我花了很多时间来了解发生了什么。 原因是IremRenderers的工作方式。请记住,itemRenderers是回收的。 请阅读very good article about Item Renderers

简而言之,您必须在构造函数或CreationComplete事件中设置ItemRenderer的数据,而不是在其他函数中。

对于MX DataGrid-您必须覆盖公共功能集数据,如下所示:

override public function set data( value:Object ) : void 
{ 
    super.data = value; 
    // your code to set your data 
}

对于Spark DataGrid,您必须在

中执行此操作
override public function prepare (hasBeenRecycled)

希望它可以提供帮助。

答案 2 :(得分:0)

useVirtualLayout="false" - 禁止itemRenderers重新使用。这是List基本组件布局的属性。

请参阅http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/spark/layouts/supportClasses/LayoutBase.html#useVirtualLayout