0

各要素にイベントが関連付けられた次のコードがあります。ラジオボタンをクリックすると、onItemClickイベントが属するイベントがイベント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ですか? に関連付けられている優先順位について何かを読みましたaddEventListenerが、イベントは異なるコンポーネント用であるため、機能しませんでした。

編集:私の問題と、なぜFlexでこの奇妙なことをしているのかを説明しようと思います。

「メジャーの追加」というボタンによって動的に更新される Datagrid コンポーネントがあります。この Datagrid には 4 つの列があります。この Datagrid に追加されたすべてのメジャーには、最後のセル (4 列目) として 2 つのラジオボタンがあります。

|-----------------------------------------------------------------------------|
|            |             |             |                                    |
|  #1 cell   |   #2 cell   |   #3 cell   | (o) Radiobutton1  (o) Radiobutton2 |
|            |             |             |                                    |
|-----------------------------------------------------------------------------|

問題は、行を削除すると、データが表示から削除され、正常に動作することです。しかし、新しいものを追加すると、ラジオボタンは Flex によって再利用され、新しいラジオボタンがどの行にあるかを知ることができません (Flex がそれらを再利用し、3 つの行を削除して新しい行を追加すると、ラジオボタン)この新しい行に属しているボタンは、削除された最後の行または別の行に属している可能性があります; それを保証することは不可能です)。

だから、私は思った:「OKフラン、おそらくitemClickDatagridにイベントリスナーを追加できます。ユーザーがラジオボタンをクリックすると、ラジオボタンが最近クリックされた行を知ることができます(itemClickハンドラーのため)」 . しかし、Flex は私が期待した順序でハンドラーを実行しなかったので、私は今本当に立ち往生しています。

onRollOver代わりにイベントを試してonItemClickいますが、うまくいきますが、常にではありません。

4

3 に答える 3

0

両方のイベント ハンドラーに両方のイベントをグローバル配列に追加する (または単一のイベント ハンドラーを使用する) ことができます。配列のサイズが長さ 2 で、ListEvent と MouseEvent が含まれているかどうかを毎回確認し、if(event is ListEvent) を使用してイベント オブジェクトを処理します。

次に、配列をクリアして、次のイベントが発生する準備をします。

于 2012-06-20T10:49:46.753 に答える
0

問題が、flex が itemrender をリサイクルするときに現在の行を識別することである場合は、itemRenderer 内の 1 つのイベントリスナーで行うことができます。uiComponent を拡張し、IDropInListItemRenderer と IListItemRenderer を実装する新しい CustomItemRender クラスを作成します。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())
    }
}

}

この例では問題は解決しません。これがお役に立てば幸いです。

于 2012-06-20T13:19:59.570 に答える
0

DataGrid に 1 つのリスナー (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
        }
    }

それが役に立てば幸い。

于 2012-06-20T11:34:17.023 に答える