Itemrenderer在选中时崩溃

时间:2011-05-27 23:23:31

标签: flex actionscript itemrenderer advanceddatagrid

拥有一个带有简单自定义mxadvanceddatagriditemrenderer的高级数据网格。我希望渲染器仅在悬停或选择行时显示图像。现在我通过在我的图像上使用excludeFrom =“normal”标记来做到这一点。

当我将状态悬停并且正常定义时,它工作正常(减去所选状态,在选中时消失)。当我尝试定义选定的状态时,在单击行时出现以下错误:

RangeError: Index 0 is out of range.
    at spark.components::Group/checkForRangeError()[E:\dev\4.x\frameworks\projects\spark\src\spark\components\Group.as:1106]
    at spark.components::Group/setElementIndex()[E:\dev\4.x\frameworks\projects\spark\src\spark\components\Group.as:1265]
    at spark.components::Group/addElementAt()[E:\dev\4.x\frameworks\projects\spark\src\spark\components\Group.as:1167]
    at mx.states::AddItems/addItemsToContentHolder()[E:\dev\4.x\frameworks\projects\framework\src\mx\states\AddItems.as:737]
    at mx.states::AddItems/apply()[E:\dev\4.x\frameworks\projects\framework\src\mx\states\AddItems.as:545]
[E:\dev\4.x\frameworks\projects\framework\src\mx\core\UIComponent.as:9961] ... etc

以前有没有人经历过这个或知道解决方案?

由于

编辑:涉及的代码非常简单:

<s:MXAdvancedDataGridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" focusEnabled="false">
<fx:Script>
<![CDATA[
import mx.collections.IList;
protected function removeRow(event:MouseEvent):void
{
var ind :int = IList(parentDocument.dataGrid.dataProvider).getItemIndex(data);
IList(parentDocument.dataGrid.dataProvider).removeItemAt(ind);
}   
]]>
</fx:Script>
<s:states>
<s:State name="normal" />
<s:State name="hovered"/>
<s:State name="selected"/>
</s:states>
<mx:Image id="removeButton" excludeFrom="normal" source="@Embed(source='../assets/icons/close_icon.gif')" click="removeRow(event)" width="10" height="10" alpha=".5" toolTip="{resourceManager.getString('localization', 'REMOVE')}"/>
</s:MXAdvancedDataGridItemRenderer>

1 个答案:

答案 0 :(得分:1)

看起来 - 尽管有点猜测 - 你试图在同时改变其状态(通过点击它来'选择')时删除itemrenderer。

这是我想要通过点击删除itemrenderer的情况的解决方案:只需让它调度一个冒泡的“remove”事件并让某种控制器处理删除。

所以你的itemrender可能看起来像这样:

<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
                xmlns:s="library://ns.adobe.com/flex/spark">

    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;
        ]]>
    </fx:Script>

    <s:states>
        <s:State name="normal" />
        <s:State name="hovered" />
        <s:State name="selected" />
    </s:states>

    <!-- some other stuff -->

    <s:Button label="remove me" excludeFrom="normal"
              click="dispatchEvent(new FlexEvent(FlexEvent.REMOVE, true))" />

</s:ItemRenderer>

的'true'值对于使事件一直向下到List组件非常重要。

然后在具有对List(或DataGrid)或类似List(或DataGrid)的子类的引用的控制器中,捕获该事件并删除该项。

theList.addEventListener(FlexEvent.REMOVE, handleRemoveRequest);

private function handleRemoveRequest(event:FlexEvent):void {
    var itemRender:IItemRenderer = event.target as IITemrenderer;
    var item:SomeClass = itemRender.data;
    var index:int = theDataProvider.getItemIndex(item);
    theDataProvider.removeItemAt(index);
}

使用目标而不是currentTarget非常重要,因为前者将是ItemRenderer,后者将是List本身。