2010-03-23 33 views
0

Flex新手的排序在這裏,所以忍受着我。我有定義一個DataGrid如下:DataGrid列名似乎不具有約束力

<mx:Script> 
... 
private function getColumns(names:ArrayCollection):Array { 
    var ret:Array = new Array(); 
    for each (var name:String in names) { 
     var column:DataGridColumn = new DataGridColumn(name); 
     ret.push(column); 
    } 
    return ret; 
} 
</mx:Script> 
<mx:DataGrid id="grid" width="100%" height="100%" paddingTop="0" 
    columns="{getColumns(_dataSetLoader.columnNames)}" 
    horizontalScrollPolicy="auto" labelFunction="labelFunction" 
    dataProvider="{_dataSetLoader.data}" 
/> 

...其中_dataSetLoader是一個對象,看起來的一個實例,如:

[Bindable] 
public class DataSetLoader extends EventDispatcher { 
    ... 
    private var _data:ArrayCollection = new ArrayCollection(); 
    private var _columnNames:ArrayCollection = new ArrayCollection(); 
    ... 
    public function reset():void { 
     _status = NOTLOADED; 
     _data.removeAll(); 
     _columnNames.removeAll(); 
    } 
    ... 

復位時()被調用的dataSetLoader例如, DataGrid會按預期清空單元格中的數據,但會留下列名稱,即使reset()會調用_columnNames.removeAll()。不應該在集合中更改觸發DataGrid中的更改嗎?

回答

0

由於您直接將變量作爲dataProvider引用,因此您的數據已被正確綁定。 對於列,您引用一個函數調用。

您可以將_dataSetLoader.columnNames的值分配給可綁定的ArrayCollection嗎? 然後使用該ArrayCollection作爲列。

+0

好吧,列是一個數組而不是ArrayCollection。但無論如何,我還嘗試將一個名爲_columnNamesAsArray的數組添加到DataSetLoader類中,並在column =子句中引用它,並在reset()中清空它,但得到了相同的結果。另外,我的理解是數據綁定也可以跨函數調用,只要函數的參數是綁定的呢?也就是說,_columnNames中的更改應該觸發對getColumns()的調用。我錯了嗎? – Jason 2010-03-23 22:08:35

0

那麼有各種替代方案或變通方法。這取決於你的要求到底是什麼。

以下是你可以用你的DataGrid組件

  1. 做什麼。如果你已經知道列名即在你的UI界面列名不會改變。您可能想要硬編碼而不是動態提供它們。

  2. 如果列名稱隨數組集合或數據提供者發生更改,我建議您刪除數據網格的列屬性並顯示默認列名稱。

  3. 您還可以在運行時添加列,具體取決於通過下拉或複選框或其他一些條件提供的輸入。

查看Flex Documentation瞭解更多信息。

+0

是的,這些選項都不適合我。 DataGrid基本上實現了一個CSV閱讀器。 CSV的第一行是列名,第二行是字段類型,其餘行是數據。所以列名稱一直在改變,這取決於正在讀取的文件。這就是爲什麼我想將它們存儲在ArrayCollection中並使用數據綁定來管理視圖的更新。 – Jason 2010-03-23 23:13:30

+0

如果你沒有篩選出任何列,那麼選項2應該工作。 – 2010-03-24 00:01:46