我有一个数据网格,在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>
如何获取项目渲染器/复选框的句柄,以便我可以确定检查了哪些行?
答案 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中。解决滚动问题。