4

我有一个数据网格,在 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

4 回答 4

9

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

如果我没记错的话,问题是 itemrenderers 没有正确记住选定的状态,并且当您上下滚动时数据网格完全混乱了。滚动后选择了错误的行。

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

于 2009-02-08T06:58:10.060 回答
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;
                }
            }
        }
于 2009-05-12T15:03:42.303 回答
0

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

例如:

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

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

于 2009-02-07T23:02:38.490 回答
-1

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

于 2010-05-26T11:12:10.567 回答