【问题标题】:Get selectedIndex in Datagrid from itemRenderer从 itemRenderer 获取 Datagrid 中的 selectedIndex
【发布时间】:2013-05-10 11:54:12
【问题描述】:

我有一个 DataGrid,第一列单元格有一个 itemRenderer,其中包含嵌入图像和链接的 doubleClick 事件。

所以,当双击事件发生时,这个渲染器会捕获事件和处理程序。问题是我想用 Datagrid 中所选项目的索引发送一个事件,但我不知道如何获取它。

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)"/>

有什么想法吗?

【问题讨论】:

    标签: actionscript-3 apache-flex flex4.5 flexbuilder


    【解决方案1】:

    你能用grid.selectedIndex吗?

    老实说,我认为这是一个坏主意。渲染器不应该知道有关 DataGrid 的任何信息,包括 selectedIndex。如果您想调度一个自定义事件,以便您可以在显示列表层次结构中的某个位置对渲染器数据进行操作;你应该包括数据,而不是索引。您的处理程序方法对数据进行操作。

    【讨论】:

    • 你能举个例子吗?
    • 我没有时间做一个深入的例子。首先阅读有关事件的 Flex 文档:help.adobe.com/en_US/flex/using/… 并尝试使其正常工作,然后返回一个具体问题。
    【解决方案2】:

    你可以通过它的 owner 属性访问它:

    (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 的事件添加一个属性。你必须将值传递给渲染器内的事件(例如构造函数中的第二个参数)这个例子只是调度事件

    【讨论】:

    • 嗨@michaPohh,我刚刚实现了你的代码,但它不起作用。调用 this.owner.dispatchEvent(new EditItemEvent(EditItemEvent.EDIT_CLICKED)); --------- 接收者:preciosGrid.addEventListener(EditItemEvent.EDIT_CLICKED, showMessage, false, 0, true);
    • rowIndex不是和屏幕显示的行数有关吗?我认为这与 dataProvider 中渲染器数据的索引无关。
    • 我的意思是监听器没有收到事件。当通过侦听器调用函数时,我只有一个警报。
    • 尝试让活动冒泡。我不是 Spark DataGrid 架构方面的专家。但我怀疑渲染器的父级不是 DataGrid 的实例,而是它的子级。
    • 明天我会添加一个itemrenderer的代码以使其更清晰......确实rowIndex不是像Rebboog已经提到的好选择(坚持使用selectedIndex),因为基础数据可以排序,过滤,滚动等......
    猜你喜欢
    • 2012-03-10
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 2011-11-03
    • 2010-11-18
    • 2012-01-21
    • 2012-02-11
    相关资源
    最近更新 更多