拥有一个带有简单自定义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>
答案 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本身。