访问DataGrid中的ItemRenderer

时间:2009-02-07 22:29:41

标签: flex actionscript-3 actionscript flex3

我有一个数据网格,在cloumn中有一个复选框项目渲染器以允许行选择:

主要应用:


<mx:DataGrid id="dg">
    <mx:columns>
        <mx:DataGridColumn id="ir" itemRenderer="renderers.RowCheckbox" /> 
        <mx:DataGridColumn dataField="Name" headerText="Name" /> 
    </mx:columns>
</mx:DataGrid>

项目渲染器:


<-- RowCheckbox -->
<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" horizontalAlign="center"> 
    <mx:CheckBox id="chk"/>
</mx:HBox>

如何获取项目渲染器/复选框的句柄,以便我可以确定检查了哪些行?

4 个答案:

答案 0 :(得分:9)

只是一句忠告:我们在应用程序中遇到了类似的问题,我们通过向datagrid的dataprovider中的实体添加“selected”属性来解决它。然后,checkBox的selected属性绑定到我们实体的selected属性。要知道选择了哪些,我们只是循环数据提供者中的实体而不是项目渲染器。经过很多不同的方法,这确实是最好的选择。

如果我没记错的话,问题是itemrenderers没有正确记住所选状态,当你上下滚动时,datagrid完全搞砸了。滚动后选择了错误的行。

另一种选择是在项目渲染器中调度一个事件,该事件一直冒泡到托管数据网格的控件。然后,您可以侦听这些事件并更新模型以反映更改。

答案 1 :(得分:2)

我在使用DataGrid和多个项目渲染器时遇到了类似的问题,并在滚动时重复使用了项目渲染器。为了访问DataGrid项呈示器,我扩展了DataGrid。我的第一个想法是使用indicesToIndex()后跟indexToItemRenderer()。不幸的是这些方法没有达到我的预期,所以我添加了indicesToItemRenderer()方法:

包com.whatever.controls {

import mx.controls.DataGrid;
import mx.controls.listClasses.IListItemRenderer;

public class CustomDataGrid extends DataGrid
{

    public function CustomDataGrid()
    {
        super();
    }

    public function indicesToItemRenderer(rowIndex:int, colIndex:int):IListItemRenderer
    {
        var firstItemIndex:int = verticalScrollPosition - offscreenExtraRowsTop;
        if (rowIndex < firstItemIndex ||
            rowIndex >= firstItemIndex + listItems.length
            )
        {
            return null;
        }

        return listItems[rowIndex - firstItemIndex][colIndex];
    }

}

要在滚动问题时解决重复使用的项目渲染器,请参阅以下文章:

http://www.adobe.com/devnet/flex/articles/itemrenderers_pt1.html

归结为覆盖数据设置器并将属性存储在数据中。例如,我有一列使用CheckBox itemRenderer而另一列使用ComboBox。对于这两种情况,只要属性发生变化,我就会监听更改事件并在数据中存储selected,selectedIndex等,并覆盖数据设置器以设置这些属性:

        override public function set data(value:Object):void
        {
            if (value != null)
            {
                super.data = value;

                if (data.hasOwnProperty('selected') && data.selected)
                {
                    selected = data.selected;
                }
                else
                {
                    selected = false;
                }
            }
        }

答案 2 :(得分:0)

您可以使用ListBase的所有子类公开的indexToItemRenderer()方法。

例如:

private function someFunction(index:int):void
{
    var rowCheckbox:RowCheckbox = dg.indexToItemRenderer(index) as RowCheckbox;
    trace(rowCheckbox.chk.selected.toString());
}

...其中index表示要测试其“chk”属性的DataGrid项的索引。

答案 3 :(得分:-1)

在ItemRenderer中,尝试将Checkbox Component放入VBox中。解决滚动问题。