【问题标题】:Itemrenderer crash when selected选中时Itemrenderer崩溃
【发布时间】:2011-05-27 23:23:30
【问题描述】:

拥有一个带有简单自定义 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>

【问题讨论】:

  • 给我们看一些代码。我们很难仅根据错误消息来调试您的自定义 itemRenderer。

标签: apache-flex actionscript itemrenderer advanceddatagrid


【解决方案1】:

看起来 - 虽然有点猜测 - 您正在尝试删除 itemrenderer,同时更改其状态(通过单击它变为“选中”)。

对于想要通过单击移除 itemrenderer 的情况,我的解决方案是:只需让它发送一个冒泡的“移除”事件,然后让某种控制器来处理移除。

所以你的 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>

那里的“真”值对于使事件一直冒泡到 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);
}

这里使用 target 而不是 currentTarget 很重要,因为前者将是 ItemRenderer,而后者将是 List 本身。

【讨论】:

  • 感谢您的回答尝试,但我的问题不在于那里。在将状态引入组合之前,我可以毫无问题地删除该行。我的问题是,当我单击该行时,所选状态的存在以某种方式在 flex 代码深处崩溃。图像永远没有机会显示或被点击。我认为这是 adobe 的一个错误。
  • 好吧,您总是可以将图像隐藏在“正常”状态而不是完全删除它(alpha="0" 或 visible="false")。虽然感觉不是很好的做法:让一个项目从它的集合中删除它自己。您是否尝试过我的方法并查看是否有任何区别?我已经做了很多次了,没有任何问题。
  • 阿尔法建议奏效了。我将 alpha.normal 设置为 0 及其一般 alpha,它适用于所有状态。我以相同的方式测试了可见性,并且效果也很好。我想知道为什么当我尝试 includeIn 或 ExcludeFrom 时它会爆炸?我承认我没有尝试您的代码,但我也不确定 mxadvanceddatagridrenderer 和 spark itemrenderer 之间有什么区别
  • 您可以以相同的方式使用它们,因为它们都实现了 IItemRenderer。因此,在我的示例中,您可以像这样将 替换为 。抱歉,我没有指出这一点。
  • 我最终接受了您的建议,即项目不应从数据网格中删除
猜你喜欢
  • 2017-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-24
  • 1970-01-01
  • 2018-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多