0

船のオブジェクトを含むグリッドテーブルがあり(データプロバイダーは船のオブジェクトの配列コレクションを受け入れます)、グリッドテーブルに船の名前と日付だけを表示します。私のshipオブジェクトには、checkListというブール値というプロパティがあります。チェックボックスアイテムレンダラーでデータバインディングとして使用されます(チェックボックスをオンまたはオフにするには)

Imageオブジェクトをコンテナに追加するときにチェックボックスをオンにします。コンテナに追加されているImageオブジェクトにはIDがあります。その画像IDをデータグリッドテーブルのshipIdと一致させ、その特定のレコードのチェックボックスをオンにします。

つまり、私のImageオブジェクトはaddイベントをリッスンし、Imageオブジェクトがコンテナに追加されたときにリッスンします。addHandler()関数を呼び出し、画像のIDを取得し、データグリッドテーブルをループして一致するIDを見つけ、チェックボックスをチェックします。ループはうまく機能します。Alert.show()を使用すると、IDと一致し、ブール値がtrueに設定されていることがわかります。チェックボックスがオンになっています。ただし、チェックボックスはチェックされていません。

これらは私のコードです。その特定のレコードのcheckListプロパティがtrueに設定されている場合でも。チェックボックスがチェックされていません。何が問題なのかわかりません。私は学生で、フレックスを始めたばかりです。誰かが私を助けてくれますか?

My MXMLビュー:My Grid Table

<s:DataGrid id="arrivalTable" x="-1" y="-1" width="302" height="205" requestedRowCount="4" 
                dataProvider="{myArrivalShips}" >               
        <s:columns>
            <s:ArrayList>                   
                <s:GridColumn dataField="shipName" headerText="Arrival Ships" itemRenderer="DesignItemRenderer.myCustomToolTipRenderer" width="130" ></s:GridColumn>
                <s:GridColumn dataField="ETA" headerText="ETD" itemRenderer="DesignItemRenderer.myCheckBoxRenderer"></s:GridColumn>                                                         
            </s:ArrayList>                  
        </s:columns>                
    </s:DataGrid>

MyImageオブジェクトはaddイベントをリッスンします。

displayImg.addEventListener(FlexEvent.ADD,addHandler);

これは私のaddHandler()イベント関数です:

protected function addHandler(event:FlexEvent):void
{
    var ImageShipId:String = Image(event.currentTarget).id;             
    var destination:BorderContainer = Image(event.currentTarget).owner as BorderContainer;
    var destinationId:String = destination.id;          

    if( destinationId == "bct_HoldingArea" ){

        for(var j:int = 0; j<arrivalTable.dataProvider.length; j++){

            var myShip:Ship = arrivalTable.dataProvider.getItemAt(j) as Ship;
            var myShipId:String = myShip.shipID.toString();

            if(StringUtil.trim(myShipId) == StringUtil.trim(ImageShipId)){                          
                myShip.checkList = true;
                Alert.show("The ship name : " + myShip.shipName +"\n" + "The Ship selected : " + myShip.checkList);
            }
        }           
    }               
}

私のチェックボックスアイテムレンダラー:

<s:GridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
                xmlns:s="library://ns.adobe.com/flex/spark" 
                xmlns:mx="library://ns.adobe.com/flex/mx" clipAndEnableScrolling="true">    
<s:HGroup>
    <s:Label text="{data.ETD}"  paddingTop="8"/>        
    <s:CheckBox id="myCheckBox" enabled="false" selected="{data.checkList}"  />
</s:HGroup> 

4

1 に答える 1

0

オブジェクトを更新した後は、データプロバイダーの「refresh」メソッドを使用する必要があります。

(arrivalTable.dataProvider as ArrayCollection).refresh();

したがって、関数は次のようになります。

protected function addHandler(event:FlexEvent):void
{
var ImageShipId:String = Image(event.currentTarget).id;             
var destination:BorderContainer = Image(event.currentTarget).owner as BorderContainer;
var destinationId:String = destination.id;          

if( destinationId == "bct_HoldingArea" ){

    for(var j:int = 0; j<arrivalTable.dataProvider.length; j++){

        var myShip:Ship = arrivalTable.dataProvider.getItemAt(j) as Ship;
        var myShipId:String = myShip.shipID.toString();

        if(StringUtil.trim(myShipId) == StringUtil.trim(ImageShipId)){                          
            myShip.checkList = true;

            (arrivalTable.dataProvider as ArrayCollection).refresh();

            Alert.show("The ship name : " + myShip.shipName +"\n" + "The Ship selected : " + myShip.checkList);
        }
    }           
}               
}

//編集 中央の行の問題は、いわゆる「中央の行のバグ」のようです。ここでいくつかの情報を見つけました。

この奇妙なことを避けるために、次のようにレンダラーコードを変更してみてください。

<?xml version="1.0" encoding="utf-8"?>
<s:GridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
                xmlns:s="library://ns.adobe.com/flex/spark" 
                xmlns:mx="library://ns.adobe.com/flex/mx" clipAndEnableScrolling="true">   
<fx:Script>
    <![CDATA[
        import mx.utils.ObjectUtil;

        [Bindable]override public function get data():Object
        {
            return ObjectUtil.copy(super.data);;
        }

        override public function set data(value:Object):void
        {
            super.data = value;
        }

    ]]>
</fx:Script>

<s:HGroup>
    <s:Label text="{data.ETD}"  paddingTop="8"/>
    <s:CheckBox id="myCheckBox" enabled="false" selected="{data.checkList}"/>
</s:HGroup> 
</s:GridItemRenderer>

//編集

このトリックの簡単な説明:データの更新は、中央の行を除くすべての行で発生することがわかりました。データグリッドのソースコードをたどろうとしました。このアクションの原因となるコード行は次のとおりです。

renderer.data = dataItem;

GridLayout.asクラス内。

この行により、中央の行を除く各行のデータが更新されます。なんで?Flexはこの式の両側を比較し、それらが等しい場合は何もしません。私たちの場合、それらは等しくありませんが、それは本当のバグのようです。何でも...Flexチームが問題を修正するまで待つ必要があります。

一時的な回避策として、「get」関数でオブジェクトをクローン化することにより、式の左側を残酷に変更しました。したがって、比較はどのような場合でもFALSEを返すはずであり、データプロパティは行ごとに更新される必要があります。

set関数は削除できますが、同じ問題をデバッグするのに適した場所です。

これは良いアプローチではありませんが、何もないよりはましです。

于 2013-02-27T22:37:23.497 に答える