我有以下代码,每个元素都有关联的事件。当我单击单选按钮时,属于onItemClick
的{{1}}事件正在table
事件后执行。我认为这是由于onSelect
是父亲,table
是孩子。
rb2
我需要以相反的顺序执行这两个事件:private function onItemClick(e:ListEvent):void {
selectedRow = parseInt(e.itemRenderer.data.Id)-1;
trace("selectedRow: "+selectedRow);
}
public function selectPoint(event:MouseEvent):void{
trace("selectPoint");
}
<mx:DataGrid id="table" dataProvider="{listCol}"
itemClick="onItemClick(event)">
<mx:columns>
<mx:DataGridColumn id="posibilidades" rendererIsEditor="true"
editorDataField="selected" headerText="Posibilidades" width="100" textAlign="center"
draggable="false" editable="false" resizable="false" sortable="false">
<mx:itemRenderer>
<mx:Component>
<mx:RadioButton name="rb2" label="Punto 2" fontSize="13" enabled="false"
groupName="_rb" value="1" textAlign="center"
preinitialize="event.target.styleName='rbstyle'"
click="outerDocument.selectPoint(event)"
creationComplete="outerDocument.rbCreated(event)"/>
</mx:Component>
</mx:itemRenderer>
</mx:DataGridColumn>
</mx:columns>
</mx:DataGrid>
,然后是onItemClick
。
如何在onSelect
之前执行onItemClick
?我读了一些与onSelect
相关的优先级,但它没有用,因为事件是针对不同的组件的。
修改: 我会尝试解释我的问题以及为什么我在Flex中做这个奇怪的事情。
我有一个Datagrid组件,它由一个名为“Add measure”的按钮动态更新。这个Datagrid有4列;添加到此Datagrid的每个度量都包含两个单选按钮作为最后一个单元格(在第4列上)。
addEventListener
问题是:当我删除一行时,数据将从显示中删除并正常工作。但是当我添加一个新的时候,Flex会重复使用单选按钮,我无法知道新的无线电按钮在哪一排(如果Flex重复使用它们,我删除3行并添加一个新的,无线电 - 按钮属于这个新行可以属于删除的最后一行,或另一行;它是不可能保证的。)
所以,我想:“好的Fran,也许你可以在Datagrid中向|-----------------------------------------------------------------------------|
| | | | |
| #1 cell | #2 cell | #3 cell | (o) Radiobutton1 (o) Radiobutton2 |
| | | | |
|-----------------------------------------------------------------------------|
添加一个事件监听器,当用户点击单选按钮时,你可以知道哪一行是单选按钮最近点击(因为itemClick
处理程序)“。但是Flex没有按照我预期的顺序执行处理程序,所以我现在真的被卡住了。
我正在尝试itemClick
事件而不是onRollOver
并且效果很好,但并非总是如此。
答案 0 :(得分:0)
您可以在两个事件处理程序中添加两个事件全局数组(或使用单个事件处理程序)。每次检查数组大小是否为长度为2,并包含ListEvent和MouseEvent,并使用if(event是ListEvent)处理事件对象,否则....
然后清除阵列,为下一个要触发的事件做好准备。
答案 1 :(得分:0)
为什么不在DataGrid上保留一个监听器(onItemClick(e:Event))并使用'currentTarget'和'target'来识别是谁导致了点击并按照您希望的方式执行序列。在这种情况下,target.id将为'rb2',currentTarget.id将为'tabe'。
protected function onItemClick(event:Event):void
{
//handle your table click here.
selectedRow = parseInt(event.itemRenderer.data.Id)-1;
if(event.target.id == 'rb2')
{
//do something
}
}
希望它有所帮助。
答案 2 :(得分:0)
如果问题是在flex回收itemrender时识别当前行,我们可以在itemRenderer中使用一个eventlistener。创建一个新的CustomItemRender类,它扩展uiComponent并实现IDropInListItemRenderer和IListItemRenderer。使用listdata和data属性访问行信息和数据信息。
例如CustomRenderer代码如下:
包 { import flash.events.MouseEvent;
import mx.controls.DataGrid;
import mx.controls.RadioButton;
import mx.controls.listClasses.BaseListData;
import mx.controls.listClasses.IDropInListItemRenderer;
import mx.controls.listClasses.IListItemRenderer;
import mx.core.UIComponent;
public class CustomItemRender extends UIComponent implements IDropInListItemRenderer,IListItemRenderer
{
public function CustomItemRender()
{
super();
}
private var _data:Object
public function get data():Object
{
return _data;
}
public function set data(value:Object):void
{
_data = value;
}
private var _listData:BaseListData
public function get listData():BaseListData
{
return _listData;
}
public function set listData(value:BaseListData):void
{
_listData = value;
}
private var radioButton:RadioButton;
override protected function createChildren():void {
super.createChildren();
if(!radioButton){
radioButton = new RadioButton();
radioButton.addEventListener(MouseEvent.CLICK, handleRadioButtonClick, false, 0, true);
this.addChild(radioButton);
}
}
override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void{
super.updateDisplayList(unscaledWidth, unscaledHeight);
radioButton.move(10, unscaledHeight*0.5);
}
private function handleRadioButtonClick(event:MouseEvent):void{
trace("row data: "+data);
trace("currently visible row Info: "+listData.rowIndex+" "+listData.columnIndex);
trace("dataprovider "+DataGrid(listData.owner).dataProvider.toString())
}
}
}
此示例无法解决您的问题。我希望这会对你有所帮助。