Actionscript 3 从itemRenderer获取Datagrid中的selectedIndex
我有一个DataGrid,第一列单元格有一个itemRenderer,它带有一个被篡改的图像和双击事件链接 因此,当o双击事件发生时,此呈现程序将捕获事件和处理程序。问题是,我想发送一个事件,其中包含Datagrid中所选项目的索引,但我不知道如何对其进行更新Actionscript 3 从itemRenderer获取Datagrid中的selectedIndex,actionscript-3,apache-flex,flex4.5,flexbuilder,Actionscript 3,Apache Flex,Flex4.5,Flexbuilder,我有一个DataGrid,第一列单元格有一个itemRenderer,它带有一个被篡改的图像和双击事件链接 因此,当o双击事件发生时,此呈现程序将捕获事件和处理程序。问题是,我想发送一个事件,其中包含Datagrid中所选项目的索引,但我不知道如何对其进行更新 s:GridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark
s:GridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" clipAndEnableScrolling="true"
width="50" height="30">
<fx:Script>
<![CDATA[
import events.EditItemEvent;
import mx.controls.Alert;
override public function prepare(hasBeenRecycled:Boolean):void {}
protected function btn_edit_doubleClickHandler(event:MouseEvent):void {
/* here I dispatchEvent with the 'index' of the selectedItem of the datagrid */
}
]]>
</fx:Script>
<s:Image id="btn_edit" horizontalCenter="0" source="@Embed('assets/images/edit_icon.png')"
verticalCenter="0"
doubleClickEnabled="true"
doubleClick="btn_edit_doubleClickHandler(event)"/>
s:GridItemRenderer xmlns:fx=”http://ns.adobe.com/mxml/2009"
xmlns:s=”library://ns.adobe.com/flex/spark"
xmlns:mx=”library://ns.adobe.com/flex/mx“ClipanEnableScrolling=“true”
width=“50”height=“30”>
有什么想法吗?你能用吗
老实说,我认为这是个坏主意。渲染器不应该知道关于DataGrid的任何信息,包括selectedIndex。如果要分派自定义事件,以便可以在displaylist层次结构中的某个位置对渲染器数据进行操作;您应该包括数据,而不是索引。处理程序方法对数据进行操作 您可以通过其所有者属性访问它:
(this.owner as DataGrid).selectedIndex
发送自定义事件的简单itemRenderer:
<s:GridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx">
<fx:Script>
<![CDATA[
override public function prepare(hasBeenRecycled:Boolean):void {
lblData.text = data[column.dataField]
}
protected function onClickButton(ev:MouseEvent):void {
trace("ButtonDispatchItemRenderer::onClickButton");
//dispatch the Event which has a static const GET_SELECTED_INDEX for the event type
this.owner.dispatchEvent(new MyEvent(MyEvent.GET_SELECTED_INDEX));
}
]]>
</fx:Script>
<s:HGroup verticalAlign="baseline">
<s:Label id="lblData" top="9" left="7"/>
<s:Button label="dispatch" click="onClickButton(event)"/>
</s:HGroup>
</s:GridItemRenderer>
带有DataGrid的简单应用程序侦听事件
<mx: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" creationComplete="onCreationComplete()">
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<fx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import spark.components.gridClasses.GridColumn;
[Bindable]
public static var initDG:ArrayCollection = new ArrayCollection([
{label:"firstItem"}, {label:"secondItem"}, {label:"thirdItem"}
]);
protected function onCreationComplete():void {
dataGrid.addEventListener(MyEvent.GET_SELECTED_INDEX, onRendererButtonClick, false, 0, true);
}
protected function onRendererButtonClick(ev:MyEvent):void {
trace("Application::RenderButtonClick");
}
]]>
</fx:Script>
<s:VGroup>
<s:DataGrid id="dataGrid" verticalCenter="0" horizontalCenter="0" dataProvider="{initDG}">
<s:columns>
<s:ArrayList>
<s:GridColumn dataField="label" itemRenderer="renderers.ButtonDispatchItemRenderer"></s:GridColumn>
</s:ArrayList>
</s:columns>
</s:DataGrid>
</s:VGroup>
</mx:Application>
您必须向事件中添加一个属性,该属性包含selectedIndex。您必须将值传递给渲染器内的事件(例如构造函数中的第二个参数)。此示例只是分派事件Hi@michaPohh,我刚刚实现了您的代码,但它不起作用。调用this.owner.dispatchEvent(新建EditItemEvent(EditItemEvent.EDIT_单击));-----------接收者:preciosGrid.addEventListener(EditItemEvent.EDIT_单击,showMessage,false,0,true);rowIndex是否与屏幕上显示的行数相关?我认为这与dataProvider中呈现器数据的索引无关,我的意思是侦听器不接收事件。我只有在通过侦听器调用函数时才会收到警报。请尝试使事件冒泡。我不是Spark DataGrid体系结构方面的专家;但我怀疑渲染器的父级不是DataGrid的实例,而是DataGrid的子级。。。的确,rowIndex并不像Rebboog已经提到的那样是一个好的选择(坚持使用selectedIndex),因为底层数据可以被排序、过滤、滚动等等……你能举个例子吗?我没有时间做一个深入的例子。从阅读关于事件的Flex文档开始:试着让它工作起来,然后带着一个特定的问题回来。
<mx: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" creationComplete="onCreationComplete()">
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<fx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import spark.components.gridClasses.GridColumn;
[Bindable]
public static var initDG:ArrayCollection = new ArrayCollection([
{label:"firstItem"}, {label:"secondItem"}, {label:"thirdItem"}
]);
protected function onCreationComplete():void {
dataGrid.addEventListener(MyEvent.GET_SELECTED_INDEX, onRendererButtonClick, false, 0, true);
}
protected function onRendererButtonClick(ev:MyEvent):void {
trace("Application::RenderButtonClick");
}
]]>
</fx:Script>
<s:VGroup>
<s:DataGrid id="dataGrid" verticalCenter="0" horizontalCenter="0" dataProvider="{initDG}">
<s:columns>
<s:ArrayList>
<s:GridColumn dataField="label" itemRenderer="renderers.ButtonDispatchItemRenderer"></s:GridColumn>
</s:ArrayList>
</s:columns>
</s:DataGrid>
</s:VGroup>
</mx:Application>