2

1000を超えるデータセットで満たされたグリッドがあります。1つの列は、外部キーの値を表示するために使用されるカスタムitemRendererを使用します。

スクロールせずに表示されるすべてのデータセットは、正しい情報で表示されます。ただし、スクロールに関しては、一部のデータセットがitemRendererに間違った値を表示します。私が理解している限り、これはitemRenderersの再利用によるものです。

しかし、再利用することは素晴らしいかもしれませんが、間違った情報を表示することは結果にはなり得ません。では、どうすればこの問題を取り除くことができますか?

編集:私はこの問題をなんとか取り除くことができましたが、とにかく私の計画を示すためにいくつかのコードを投稿します:

<?xml version="1.0" encoding="utf-8"?>

<mx:Script>
    <![CDATA[
        private var dataAccess : DataAccess = DataAccess.getInstance();
        private var foreign : ArrayCollection = new ArrayCollection();

        private function onCreationComplete() : void
        {

            dataAccess.service.getForeignDatasets.addEventListener("result", onGetForeignDatasets);
            dataAccess.service.getForeignDatasets();
        }

        private function onGetForeignDatasets(event : ResultEvent) : void
        {
            foreign = event.result as ArrayCollection;  
            preSelect();
        }   

        //gets the entry from the foreign entity which matches 
        //the foreign key in this.data
        private function preSelect() : void
        {
            for each(var obj : Object in foreign)
                {
                    if(obj.id == data.foreignKey))
                    {
                        value.text = obj.name;
                        return;
                    }
                }

            value.text = "";    
        }

        private function onDataChange() : void
        {
            preSelect();
        }       
    ]]>
</mx:Script>

不要なコードはすべて残しました...

上記のコードは機能し、間違ったデータを表示する問題を解決します。

この機能を実装する他のアイデアはありますか?

4

3 に答える 3

0

これは、アイテムレンダラーがプライベート変数(または実際には他の場所)に情報をキャッシュする場合に発生します。アイテムレンダリングは、「data」プロパティを介してデータを取得します。「data」プロパティ内にないデータは使用しないでください。他のデータを取得するために絶対に外部にアクセスする必要がある場合(実際には実行しないでください)、データプロパティが変更されるたびにそのデータを無効にするようにしてください(データをオーバーライドして変更されたフラグをマークしてから、super.dataを呼び出します)。

これで問題が解決しない場合は、アイテムレンダラーコードを投稿してください。

于 2010-01-26T01:57:49.407 に答える
0

useVirtualLayout="false"- itemRenderers の再利用を禁止します。これは、リスト ベース コンポーネントのレイアウトのプロパティです。

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/spark/layouts/supportClasses/LayoutBase.html#useVirtualLayoutを参照してください。

于 2012-12-05T22:47:36.680 に答える
0

DataGrid コントロールのカスタム ItemRenderer を使用すると、この種の問題も発生しました。すべて問題ありませんでしたが、DataGrid をスクロールすると、ItemRenderers に正しい値が表示されませんでした。何が起きているのか理解するのに多くの時間がかかりました。その理由は、IremRenderers の動作方法にあります。itemRenderer はリサイクルされることに注意してください。Item Renderers に関する非常に優れた記事をお読みください。

つまり、コンストラクターや CreationComplete イベントではなく、他の関数で ItemRenderer のデータを設定する必要があります。

MX DataGrid の場合、次のようにパブリック関数セット データをオーバーライドする必要があります。

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

Spark DataGrid の場合は、

override public function prepare (hasBeenRecycled)

それが役立つことを願っています。

于 2012-04-24T15:38:59.870 に答える