2009-07-05 9 views
0

データ提供者に同じレコードが2つ(同じオブジェクトがアレイ内に2回)ある場合、次の例を参照してください - 最後の "Moo"のみを選択できます。フレックスデータグリッドに2つの "同じ"オブジェクトがある場合、そのうちの1つだけを選択することができます

<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()"> 
    <mx:Script> 
     <![CDATA[ 
      private var sourceData:Array = []; 

      private function init():void { 
       var a:Object = {Title:"Moo"}; 
       var b:Object = {Title:"Goo"}; 
       var c:Object = {Title:"Foo"}; 
       sourceData.push(a,b,c,a); //<-- "a" inserted twice 
       dg.dataProvider = sourceData; 
      } 
     ]]> 
    </mx:Script> 

    <mx:DataGrid id="dg"/> 
</mx:WindowedApplication> 

は、私は、これはselectedItemプロパティのbecuaseであるかなり確信している - あなたはdataprovidorで同じオブジェクトのうちの2つを持っている場合、すなわち、あなたはそれが最初に見つかったものを選択しようとし、その上で選択します。

これを解決する最善の方法は不明です。私は、すべてのオブジェクトを複製することで、それぞれのオブジェクトが一意であることを確認することができました。しかし、その後、私は、 'a'オブジェクトの更新が "a"のすべての "クローン"に伝播することを確認する必要があります。

意見や提案はありませんか?

+0

、何を達成しようとしているの? –

答えて

0

同じオブジェクトをデータグリッドに2回配置する必要があるのはなぜですか?問題は、同じタイトルのオブジェクトが2つありますが、同じオブジェクト参照を2回使用しているということではありません。 「あなたは、あなたのデータグリッド内のすべてのプロパティのすべてが同じ値を持つ2つのオブジェクトを持つことができますし、ソースデータがdoesnのことを確認することができない場合は、

  var a:Object={Title: "Moo"}; 
      var b:Object={Title: "Goo"}; 
      var c:Object={Title: "Foo"}; 
      var d:Object={Title: "Moo"}; 
      sourceData.push(a, b, c, d); 

次のコードのようにそれらのすべてを選択することができるようになります重複したオブジェクト参照が含まれている場合は、次のような方法で削除できます。私にとって

  var ac:ArrayCollection=new ArrayCollection(); 
      for (var i:int=0; i < sourceData.length; i++) 
      { 
       var obj:Object=sourceData[i]; 
       if (!ac.contains(obj)) 
       { 
        ac.addItem(obj); 
       } 
      } 
      dg.dataProvider=ac; 
0

おかげでフィル、

主な問題は、このグリッド内のデータがデータのマスターコピーから来ているとユースケースは、ユーザーから同じ項目を追加できるようにすることであるということですこのグリッドへのマスターコピーを複数回実行します。

私は一意の参照を保証することができるので、オブジェクトを複製することです。ただし、マスターコピーの更新はクローンには流れません。

最終的に私は実際にはかなりうまくいくバインディングを使い始めましたが、はるかに大きなデータセットでどのように動作するかはわかりません。

package 
{ 
    import mx.binding.utils.BindingUtils; 

    [Bindable] 
    public class TestVO 
    { 
     public var a:int = 0; 
     public var b:int = 0; 
     public var c:int = 0; 

     public function TestVO() 
     { 
     } 

     public function clone():TestVO { 
      var t:TestVO = new TestVO(); 
      t.a = BindingUtils.bindProperty(t,"a",this,"a").getValue() as int; 
      t.b = BindingUtils.bindProperty(t,"b",this,"b").getValue() as int; 
      t.c = BindingUtils.bindProperty(t,"c",this,"c").getValue() as int; 
      return t; 
     } 
    } 
} 
0

私は最近、同じ問題に遭遇しました。私のソリューションが良かったか悪かったか分かりません。私はバインディングの使用について考えましたが、アプリケーションが構造化された方法で、オブジェクトがクローンであるかどうかを明示的に伝えたいと思っていましたが、依然としてマスターオブジェクトのようなクローンを使用することができました。

私は2つのクラスを用意しました。これは維持するのが苦痛ですが、変更はバインディングの代わりにゲッター/セッターを使って実行されます。正直なところ、私はどちらのアプローチの方が優れているのか分かりませんが、両方のアプローチをベンチマークして見るのは面白いかもしれません。

リフレクションなどを使用してこれを行うより良い方法があるはずですが、タイプチェックとデータバインディングの目的では、おそらくクラスである必要があります。

だから基本的に私はこのような何かを巻き取る:ただ好奇心から

package 
{ 
    import flash.events.EventDispatcher; 

    [Bindable] 
    public class MasterObject extends EventDispatcher 
    { 
     public var a:int = 0; 
     public var b:int = 0; 
     public var c:int = 0; 

     public function MasterObject() 
     { 
      super(); 
     } 

     public function clone():MasterObject 
     { 
      return new CloneObject(this); 
     } 
    } 
} 

package 
{ 
    [Bindable] 
    public class CloneObject extends MasterObject 
    { 
     private var parent:MasterObject; 

     public function CloneObject(parent:MasterObject) 
     { 
      super(); 
      this.parent = parent; 
     } 

     override public function get a():int 
     { 
      return parent.a; 
     } 
     override public function set a(value:int):void 
     { 
      parent.a = value; 
     } 

     override public function get b():int 
     { 
      return parent.b; 
     } 
     override public function set b(value:int):void 
     { 
      parent.b = value; 
     } 

     override public function get c():int 
     { 
      return parent.c; 
     } 
     override public function set c(value:int):void 
     { 
      parent.c = value; 
     } 
    } 
} 
関連する問題