Flex ArrayCollection 操作筆記 ——(一)

marcbl發表於2012-12-13

filterFunction屬性是由ListCollectionView類定義,它是ArrayCollection的父類。當過濾器函式被傳 遞給繼承自ListCollectionView的任何子類後,這裡為ArrayCollection物件,應用過濾器後必須呼叫refresh方法

flex ArrayCollection 儲存的物件中包含另一個物件。這是如果想要訪問最內層物件的屬性可以直接通過兩次“.”進行,但是這是如果最內層物件如果是空的程式會報錯退出。舉個例子說明:

public dynamic class CustomerInfor

{

    private var _customerId:String;// 客戶ID(關鍵字)

    private var _customerNam:String;// 客戶(唯一)

    private var _phoneNum:String;// 手機號碼

    private var _e_mail:String;// 客戶電子郵箱地址

    private var _address:String;// 客戶地址

    private var _customerType:String;// 客戶型別。批發客戶,零售客戶,

}

public dynamic class CustomerRecords

{

    private var _customerRecordsId:String;// 客戶消費記錄ID(關鍵字)

    private var _customer:CustomerInfor;// 客戶ID(關鍵字)

    private var _consumeAmount:Number;// 交易金額

    private var _consumeTimes:int;// 交易次數

    private var _consumeDate:Date;// 交易日期

    private var _goodsTypeNam:String;// 商品所屬種類(農作物、疫苗等)

}

var record1: CustomerRecords = new CustomerRecords ();

var record2: CustomerRecords = new CustomerRecords ();

var record3: CustomerRecords = new CustomerRecords ();

var records:ArrayCollection = new ArrayCollection(

                                                        [record1, record2, record3

                                                        ]);

這裡我們看到一個CustomerRecords 物件裡面有一個CustomerInfor 型別的變數作為屬性,在新定義的records:ArrayCollection 中新增了三個CustomerRecords 型別的變數。現在我們對records進行操作。

首先是進行過濾:把customer 中“批發客戶”的銷售資訊篩選出來。

protected function id_test_clickHandler(event:MouseEvent):void

{

// TODO Auto-generated method stub



records.filterFunction = filterFuc;

 records .refresh();

}

public function filterFuc( item:Object ):Boolean

{

// Alert.show(item.customer.toString(),'fail',4,this);

var tt:CustomerInfor = item.customer;

if(  “批發客戶” == tt. customerType  )

    return true;

return false;

}

這裡我們需要注意的是如果一個CustomerRecords物件中customer屬性為空,那麼上述函式會報錯中止程式執行。

接要說用records作為資料來源來對元件提供資料:

1.作為DataGrid元件的資料來源

這個很簡單。例如:

            <mx:columns>

                <mx:DataGridColumn headerText="消費記錄ID" dataField="customerRecordsId" visible="false"/>

                <mx:DataGridColumn headerText="客戶名" dataField="customer.customerNam" width="80" fontSize="11" textAlign="center" />

                <mx:DataGridColumn headerText="交易金額" dataField="consumeAmount" width="70" fontSize="11" textAlign="center"/>

                <mx:DataGridColumn headerText="交易次數" dataField="consumeTimes" width="70" fontSize="11" textAlign="center"/>

                <mx:DataGridColumn headerText="交易日期" dataField="consumeDate" width="90" fontSize="11" textAlign="center" labelFunction="getformatDate"/>

                <mx:DataGridColumn headerText="交易商品型別" dataField="goodsTypeNam" width="100" fontSize="11" textAlign="center" />

            </mx:columns>

        </mx:DataGrid>

2.作為DropDownList(以及相似的元件)的資料來源

這裡有些人可能想當然的以為和DataGrid類似即可,如下述程式碼:

在這裡很遺憾的告訴你,你的想法錯了,錯的很厲害。

這個地方是一個很糾結的,下面講一下我的解決辦法,程式碼如下:

也就是新增一個labelFunction函式。

private function droptest( item:Object ):String

{

return item.customer.customerNam;

}

實驗一下,哈哈可以正常顯示目標資料了。

但是這裡還是有一點小問題的。知道labelFunction含義的或許已經想到了。沒錯就是labelFunction執行時已經把繫結的資料改變成String型別了。這時再選中的資料就是一個String型別。所以我們無法得到想要的CustomerRecords物件啊。

這裡說一下我的解決辦法。

雖然labelFunction改變了改變了元件中得資料型別,但是對於資料來源的資料並沒有變化,而且對應的資料位置也沒有變化。所以這裡我們可以先獲取選中項的INDEX再根據這個從資料來源中獲取目標資料。

恩這次就總結這麼多吧。

相關文章