我想创建一个由两列组成的自定义Flex DataGrid,一列用于标签,另一列用于复选框。 该复选框包含在名为CustomRenderer的类中,该类从GridItemRenderer继承并实现IFactory。在Flex DataGrid中显示复选框列
在CustomRenderer的每个实例中,我都有一个名为number的变量,这样当单击一个复选框时,它可以传回该数字,以便我知道哪个行已被单击。
问题是我的CustomRenderer在程序运行时不显示。
请有人帮忙。
这是我的代码。
MyProgram.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
initialize="initData()">
<fx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.controls.Alert;
import mx.controls.CheckBox;
import mx.rpc.events.AbstractEvent;
private var ArrayItems:Array = [
{Label:'Table'},
{Label:'Chair'},
{Label:'Stool'},
{Label:'Bench'},
{Label:'Sofa'}];
[Bindable]
private var ArrayCollectionItems:ArrayCollection;
private var t:CustomRenderer;
public function initData():void
{
ArrayCollectionItems=new ArrayCollection(ArrayItems);
t = new CustomRenderer();
t.cb.addEventListener(MouseEvent.CLICK, HandleClick);
MainGrid.columns[1].itemRenderer = t.newInstance();
}
public function HandleClick(event:Event):void
{
var c:CustomRenderer = (event.currentTarget) as CustomRenderer
var RowClicked:int = c.number;
}
]]>
</fx:Script>
<s:states>
<s:State name="State1"/>
</s:states>
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<s:Panel x="99" y="14" width="379" height="268" skinClass="spark.skins.spark.PanelSkin">
<s:DataGrid id="MainGrid" x="19" y="17" width="340" height="199"
dataProvider="{ArrayCollectionItems}" requestedRowCount="4" requireSelection="false"
resizableColumns="false" selectionMode="singleRow" showDataTips="false">
<s:columns>
<s:ArrayList>
<s:GridColumn minWidth="200" dataField="Label" headerText="Label"></s:GridColumn>
<s:GridColumn minWidth="30" dataField="" headerText="">
</s:GridColumn>
</s:ArrayList>
</s:columns>
<s:typicalItem>
<fx:Object dataField1="Sample Data" dataField2="Sample Data" dataField3="Sample Data"></fx:Object>
</s:typicalItem>
</s:DataGrid>
</s:Panel>
</s:Application>
CustomRenderer.as
import mx.controls.Alert;
import mx.controls.CheckBox;
import mx.core.IFactory;
import spark.components.gridClasses.GridItemRenderer;
public class CustomRenderer extends GridItemRenderer implements IFactory
{
private static var count:int = 0;
public var number:int;
public var cb:CheckBox;
public function CustomRenderer()
{
cb = new CheckBox();
number = count++;
cb.x = 22;
cb.y = 4;
addElement(cb);
}
public function newInstance():*
{
return new CustomRenderer();
}
}
我已经修改了我的代码,以便现在可以使用自定义事件将选中的复选框的行和列发送回主类。 – user3468174
我需要添加另一列将显示一个按钮,并单击时将删除该按钮所在的行,所以我现在报废行和列编号。我想要做的是将复选框值绑定到ArrayCollection变量中的元素。但是,如何将一个类中的checkbox值绑定到另一个类中声明的arraycollection? – user3468174
您需要在您的itemrenderer中覆盖set数据(),createChildren()和commitProperties()方法。将复选框的创建移动到createChildren()方法 - 这是标准的Flex生命周期练习。设置data()是对象传递给你的itemrenderer的地方。在这里你可以查看你的对象的属性值(例如“selected”)并将属性存储在本地变量中。然后在commitProperties()中,根据“selected”值设置复选框的状态。 – Philarmon