DataGrid數據源

Flex DataGrid組件
實際上,DataGrid組件是屬於列表組件的,之所以單獨拿出來講解,主要是因爲 DataGrid組件有着很強大的功能,也有很多擴展的應用是在開發中經常用到的。DataGrid組件是按照行和列的形式顯示數據的。有幾個類是隻有 DataGrid組件才能使用的,包括DataGridCellEditor類、DataGridColumn類和HeaderRenderer類。這三 個類會在使用的時候逐個講解。
15.1 數據網格(DataGrid)組件簡介
DataGrid組件適合顯示包含多個屬性的對象。可以通過內部或者外部的數據源把數 據綁定到DataGrid組件中。DataGrid組件有很多強大的功能,使我們在開發中很容易地實現某些代碼,比如,按照特定的規則排序,在單元格中嵌 入其他組件等。DataGrid組件有很多屬性、方法和事件。常用的屬性如表15.1所示,常用的方法如表15.2所示。
表15.1 DataGrid組件常用的屬性
屬    性
說    明
columns
獲取或設置一個DataGridColumn對象數組,每個可以顯示的列爲一個對象
editable
指示用戶能否編輯數據提供者中的項目
editedItemPosition
獲取或設置正在編輯的數據提供者項目的項目渲染器的列索引和行索引
editedItemRenderer
獲取對當前正在編輯的項目所屬的DataGrid組件中項目渲染器的引用
headerHeight
獲取或設置DataGrid標題的高度,以像素爲單位
horizontalScrollPolicy
獲取或設置一個布爾值,指示水平滾動條是否始終打開
imeMode
獲取或設置輸入法編輯器(IME)的模式
itemEditorInstance
對項目編輯器的當前活動實例(如果有)的引用
labelFunction
獲取或設置一個函數,確定各個項目的哪些字段要用作標籤文本
minColumnWidth
獲取或設置DataGrid組件列的最小寬度,以像素爲單位
resizableColumns
指示用戶能否更改列的尺寸
rowCount
獲取或設置在列表中至少部分可見的行的行數
rowHeight
獲取或設置DataGrid組件中每一行的高度以像素爲單位
showHeaders
獲取或設置一個布爾值,該值指示DataGrid組件是否顯示列標題
sortableColumns
指示用戶能否通過單擊列標題單元格對數據提供者中的項目進行排序
sortDescending
獲取當用戶單擊列標題時列的排序順序
sortIndex
獲取要排序的列的索引
表15.2 DataGrid組件常用的方法
方    法
說    明
addColumn
在columns數組的末尾添加列
addColumnAt
在column數組中的指定索引處插入列
createItemEditor
使用itemEditor屬性指定的編輯器爲位於editedItemPosition屬性標識的列索引和行索引處的項目渲染器創建項目編輯器
destroyItemEditor
關閉當前在項目渲染器上打開的項目編輯器
editField
編輯DataGrid組件中的給定字段或屬性
getCellRendererAt
獲取DataGrid中指定位置的單元格渲染器的實例
getColumnAt
檢索位於columns數組中指定索引處的列
getColumnCount
檢索DataGrid組件中的列數
getColumnIndex
檢索具有指定名稱的列的索引;如果未找到匹配項,則爲 -1
getStyleDefinition
檢索當前組件的默認樣式映射
itemToCellRenderer
DataGrid組件對任何給定項都有多個單元格,因此itemToCellRenderer方法始終返回null
removeAllColumns
刪除DataGrid組件中的所有列
removeColumnAt
刪除位於columns數組中指定索引處的列
scrollToIndex
將列表滾動至位於指定索引處的項目
spaceColumnsEqually
將可見列的寬度重置爲相同大小
可以利用這些屬性、方法和事件創建強大的DataGrid組件應用程序。在接下來的幾節,會逐一介紹他們的使用方法。
15.2 使用DataGrid組件顯示數據列表
顯示數據列表是DataGrid組件最基本的應用,只有把數據顯示出來,纔可以實現其 他的功能。數據的來源大概有兩種,一種是內部數據,即在程序內部自定義數據,然後綁定到DataGrid組件中;另一種是外部數據,通過讀取外部文件或者 是數據庫,綁定到DataGrid組件中。接下來,就這兩種情況分別做介紹。
15.2.1 將內部數據綁定到DataGrid組件中
要在DataGrid組件中顯示數據,首先就要建立數據源,建立數據源通常是通過DataProvider API類來實現。下面的示例說明如何在DataGrid組件中顯示數據,示例的步驟如下所示。
* 創建一個ActionScript 3.0文件,命名爲DataGrid_ShowData_Example.as,類名爲DataGrid_ShowData_Example,導入將用到的類庫,代碼如下所示:
package
{
    import fl.controls.DataGrid;
    import fl.controls.ScrollPolicy;
    import fl.data.DataProvider;
    import flash.display.Sprite;
public class DataGrid_ShowData_Example extends Sprite
    {
        /*****************************************
        * 構造函數
        * */
        public function DataGrid_ShowData_Example()
        {
       
        }
}
}
* 創建一個函數GetData1,在內部實現具體的功能。代碼如下所示:
/*********************************
* 加載內部數據,綁定DataGrid組件
* */
private function GetData1():void
{
}
* 在函數的內部,利用DataProvider類創建一個數據模型,這個數據模型有4列及10行數據,代碼如下所示:
// 數據模型
var dp1:DataProvider = new DataProvider();
           
dp1.addItem({Name:"Tom", Phone:23579086, QQ:77788899, Software:"Flash"});
dp1.addItem({Name:"Kelly", Phone:33579080, QQ:56788823, Software:"Flex"});
dp1.addItem({Name:"Jim", Phone:83579085, QQ:56788882, Software:"Java"});
dp1.addItem({Name:"Sam",Phone:73579084,QQ:78988811,Software:"Dreamweaver"});
dp1.addItem({Name:"Kaiven",Phone:33576681,QQ:32188897,Software:"Photoshop"});
dp1.addItem({Name:"Gray", Phone:23229086, QQ:12388900, Software:"Fireworks"});
dp1.addItem({Name:"Luar", Phone:23579087, QQ:24681899, Software:"DAEMON Tools"});
dp1.addItem({Name:"Kite", Phone:85579082, QQ:68080894, Software:"FlashDevelop"});
dp1.addItem({Name:"Polar", Phone:32579086, QQ:21586899, Software:"Beyond Compare"});
* 初始化DataGrid組件,並實例化,然後設置屬性,包括位置、寬度、高度、滾動條的樣式等。代碼如下所示:
// 初始化DataGrid組件,並實例化
var dg1:DataGrid = new DataGrid();
// 設置位置
dg1.move(20,20);
// 設置寬和高
dg1.setSize(350, 150);
dg1.verticalScrollPolicy = ScrollPolicy.AUTO;
* 定義列的標題,然後把數據模型和DataGrid組件綁定在一起,放到舞臺上,代碼如下所示:
// 定義列的標題
dg1.columns = ["Name", "Phone", "QQ", "Software"];
// 綁定數據源
dg1.dataProvider = dp1;
addChild(dg1);
* 編譯代碼並運行,效果如圖15.1所示。
圖15.1 讀取內部數據,在DataGrid中顯示
15.2.2 將外部數據綁定到DataGrid組件中
外部數據通常指的是數據庫、文本本件和XML文件。在實際開發中,與數據層傳入數據大多是通過XML格式傳輸的。所以,下面就創建一個讀取外部XML文件的數據,然後在DataGrid組件中顯示的例子。步驟如下。
* 創建一個XML文件,命名爲DataGrid_Data.xml,內容結構如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <node label="Flash">
        <Name>Flash</Name>
        <Company>Adobe</Company>
        <Version>9.0</Version>
    </node>
    <node label="Java">
        <Name>Java</Name>
        <Company>Sun</Company>
        <Version>6.0</Version>
    </node>
    <node label=".Net">
        <Name>.Net</Name>
        <Company>Microsoft</Company>
        <Version>2.0</Version>
    </node>
    <node label="Flex">
        <Name>Flex</Name>
        <Company>Adobe</Company>
        <Version>2.0</Version>
    </node>
    <node label="OICQ">
        <Name>OICQ</Name>
        <Company>騰訊</Company>
        <Version>2007</Version>
    </node>
</root>
* 繼續使用15.2.1節的文件,在DataGrid_ShowData_Example.as文件中,創建一個名爲GetData2的函數,在函數中讀取剛纔創建的XML文件,代碼如下所示:
/*********************************
* 加載外部XML數據
* */
private function GetData2():void
{
    // 加載外部XML文件
    data_xml = new XML();
    myXMLURL = new URLRequest("DataGrid_Data.xml");
    myLoader = new URLLoader(myXMLURL);
}
* 在類的外部,引入剛纔使用的命名空間,包括URLRequest和URLLoader,代碼如下:
import flash.net.URLRequest;
import flash.net.URLLoader;
* 創建上面的全局變量,data_xml、myXMLURL和myLoader。代碼如下所示:
private var data_xml:XML;
private var myXMLURL:URLRequest;
private var myLoader:URLLoader;
* 創建XML對象的加載文件事件,並且在GetData2函數中添加偵聽事件的語句,添加的偵聽語句代碼如下:
myLoader.addEventListener("complete", xmlLoaded);
XML對象的加載文件事件函數代碼如下:
/*********************************
* 綁定DataGrid組件
* */
function xmlLoaded(event:Event):void
{
    data_xml = XML(myLoader.data);
    //trace(data_xml.elements("node").toXMLString());
}
* 在偵聽事件函數中,把從外部讀取的數據文件綁定到DataGrid組件中,代碼如下:
// DataProvider
var dp:DataProvider = new DataProvider(data_xml);
           
// 初始化DataGrid組件,並實例化
var dg2:DataGrid = new DataGrid();
// 設置寬和高
dg2.setSize(200, 300);
// 定義列的標題
dg2.columns = ["Name", "Company", "Version"];
// 綁定數據源
dg2.dataProvider = dp;
addChild(dg2);
最後,在構造函數中,調用GetData2函數,代碼如下:
/*****************************************
* 構造函數
* */
public function DataGrid_ShowData_Example()
{
    GetData2();
}
編譯代碼並運行,效果如圖15.2所示。
圖15.2 讀取外部數據綁定DataGrid組件
15.3 定義DataGrid組件樣式外觀
在實際程序開發中,有時候需要對DataGrid組件可視化的外觀進行修改,以滿足功能需要。例如,修改數據顯示格式、修改DataGrid的樣式和外觀、自定義單元格等。
15.3.1 修改數據顯示格式
當DataGrid組件顯示出數據後,有些數據格式可能不是我們所需要的。這個時候,就要修改數據格式,把數據修改成有意義的,可以使讀者更容易讀懂的格式。比如貨幣格式前面要加美元符號或者人民幣符號,有時候從數據庫中讀出的是0或1的布爾值,再比如電話號碼等。
下面就以15.2.1節的實例爲例,把Phone列修改成前面有區號的電話號碼,步驟如下。
修改GetData1函數,在綁定數據源的語句之後,增加格式化語句,增加的代碼如下所示:
// 格式化數據
dg1.getColumnAt(1).labelFunction = phoneFormatter;
phoneFormatter是格式化數據的函數,把電話號碼前面加上區號“0755”,代碼如下所示:
/*********************************
* 格式化電話號碼
* */
private function phoneFormatter(item:Object):String
{
    return "0755-" + item.Phone;
}
再次編譯代碼並運行,效果如圖15.3所示。
圖15.3 格式化電話號碼
15.3.2 自定義DataGrid組件的標題
在顯示完DataGrid組件的數據之後,有時候列的標題是數據庫中已經定義好的列名 稱,對於用戶來說,不容易讀懂,需要重新定義,那就需要自定義DataGrid組件的標題了。自定義標題要用到的類是 HeaderRenderer,HeaderRenderer類在類dataGridClasses中。下面就利用HeaderRenderer類來實現 自定義標題的功能。
還是以15.2.1節的實例爲基礎,加一些代碼。在GetData1函數中加入如下代碼:
// 自定義標題
var dgc0:DataGridColumn = dg1.getColumnAt(0);
dgc0.headerText = "姓名";
var dgc1:DataGridColumn = dg1.getColumnAt(1);
dgc1.headerText = "電話";
var dgc3:DataGridColumn = dg1.getColumnAt(3);
dgc3.headerText = "軟件名稱";
代碼的作用是把第一行的標題改成“姓名”,第二行的標題改爲“電話”,第三行的標題改爲“軟件名稱”。再次編譯運行,最終效果如圖15.4所示。
圖15.4 自定義DataGrid組件標題
15.4 DataGrid組件的分頁與排序
當DataGrid組件中的數據顯示很多行的時候,使用者需要不停地下拉滾動條。這對 於用戶的體驗極爲不便,分頁顯示數據的方式就可以很好地解決這個問題。在應用軟件開發中,分頁也是常用的操作。排序的作用是爲了用戶可以更好地按照自己的 方式排列數據,更加方便地閱讀數據信息。
15.4.1 DataGrid組件的分頁
在很多語言中,分頁技術都是很常見的。每種技術都有自己的優勢和特點,但是基本思路都 差不多。基本思路是,把全部數據一次性讀到一個數據集中,然後,再與DataGrid組件關聯,分頁的讀取顯示。另外一種思路是,先從數據庫中讀取一頁的 數據,在DataGrid組件中顯示出來,然後再讀取,再顯示。
下面,用第一種思路設計一個分頁的程序,數據集採用數組的形式,利用數組的slice()方法,讀取一部分數據,然後分頁顯示。步驟如下。
創建一個ActionScript 3.0文件,命名爲DataGridPageExample,類名爲DataGridPage- Example,繼承自Sprite類,導入用到的類庫。代碼如下:
package
{
    import fl.controls.Button;
    import fl.controls.DataGrid;
    import fl.controls.ScrollPolicy;
    import fl.data.DataProvider;
    import flash.display.Sprite;
    import flash.events.MouseEvent;
   
    public class DataGridPageExample extends Sprite
    {
   
}
}
創建構造函數。代碼如下所示:
/************************
* 構造函數
* **********************/
public function DataGridPageExample()
{
    CreateDataModel();
    CreateDataGrid();
    CreatePageButton();
}
創建數據模型。實際開發中,是從外部數據庫或者文件讀取數據的,這裏只是模擬數據源,便於講解。在這裏,插入了9條數據,然後傳遞到數組中,代碼如下所示:
private var dp:DataProvider;
private var array:Array;
/************************
* 創建數據模型
* **********************/
private function CreateDataModel():void
{
    // 數據模型
    dp = new DataProvider();
           
    // 插入9條數據
    dp.addItem({Name:"Tom", Phone:23579086, QQ:77788899, Software:"Flash"});
    dp.addItem({Name:"Kelly", Phone:33579080, QQ:56788823, Software:"Flex"});
    dp.addItem({Name:"Jim", Phone:83579085, QQ:56788882, Software:"Java"});
    dp.addItem({Name:"Sam", Phone:73579084, QQ:78988811, Software:"Dreamweaver"});
    dp.addItem({Name:"Kaiven", Phone:33576681, QQ:32188897, Software:"Photoshop"});
           
    dp.addItem({Name:"Gray", Phone:23229086, QQ:12388900, Software:"Fireworks"});
    dp.addItem({Name:"Luar",Phone:23579087,QQ:24681899, Software:"DAEMON Tools"});
    dp.addItem({Name:"Kite", Phone:85579082, QQ:68080894, Software:"FlashDevelop"});
dp.addItem({Name:"Polar",Phone:32579086,QQ:21586899,Software:"BeyondCompare"});
           
    array = dp.toArray();
}
創建DataGrid組件,封裝在函數CreateDataGrid中,代碼如下所示:
private var dg:DataGrid;
// 數據副本
private var array_page:Array;
/************************
* 創建DataGrid組件
* **********************/
private function CreateDataGrid():void
{
    // 初始化DataGrid組件,並實例化
    dg = new DataGrid();
           
    // 設置位置
    dg.move(20,20);
    // 設置寬和高
    dg.setSize(350, 125);
    dg.verticalScrollPolicy = ScrollPolicy.AUTO;
    // 定義列的標題
    dg.columns = ["Name", "Phone", "QQ", "Software"];
           
    // 初始化數據
    array_page = array.slice(0, 5);
    // 綁定DataGrid組件
    BingDataGrid(array_page);
           
    addChild(dg);
}
綁定數據源,先是移除DataGrid組件中的所有數據,然後遍歷參數數組中的數據,增加到DataGrid組件中。最後封裝在函數BingDataGrid中,便於分頁時重複調用。代碼如下所示:
/************************
* 綁定數據源
* **********************/
private function BingDataGrid(array:Array):void
{
    // 綁定數據源
    dg.removeAll();
    var i:uint = 0;
    for(i=0; i<array.length; i++)
    {
        dg.addItem(array[i]);
    }
}
* 創建“上一頁”和”下一頁“按鈕,封裝在函數CreatePageButton中,代碼如下:
/************************
* 創建“上一頁”和”下一頁“按鈕
* **********************/
private function CreatePageButton():void
{
    var btnPre:Button = new Button();
    var btnNext:Button = new Button();
           
    btnPre.move(30, 170);
    btnNext.move(240, 170);
           
    btnPre.label = "上一頁";
    btnNext.label = "下一頁";
           
    btnPre.addEventListener(MouseEvent.CLICK, btnPreClick);
    btnNext.addEventListener(MouseEvent.CLICK, btnNextClick);
           
    addChild(btnPre);
    addChild(btnNext);
}
創建“上一頁”按鈕的單擊事件的函數,讀取前5條數據,命名爲btnPreClick,代碼如下:
/************************
* “上一頁”按鈕的單擊事件
* **********************/
public function btnPreClick(e:MouseEvent)
{
    array_page = array.slice(0, 5);
    BingDataGrid(array_page);
}
創建“下一頁”按鈕的單擊事件的函數,讀取後面的4條數據,命名爲btnNextClick,代碼如下:
/************************
* “下一頁”按鈕的單擊事件
* **********************/
public function btnNextClick(e:MouseEvent)
{
    array_page = array.slice(5, 10);
    BingDataGrid(array_page);
}
把三個創建組件的函數增加到構造函數中,代碼如下所示:
/************************
* 構造函數
* **********************/
public function DataGridPageExample()
{
    CreateDataModel();
    CreateDataGrid();
    CreatePageButton();
}
最後編譯運行,效果如圖15.5所示。
圖15.5 DataGrid組件分頁
15.2 自定義DataGrid組件的單元格
DataGrid組件顯示完數據之後,有些數據是需要用戶自己定義或者修改的。這個時候就需要把需要用戶修改的單元格變成可編輯的,以便於用戶自己編輯。
15.5.1 編輯DataGrid組件的單元格
本節主要介紹如何定義一個單元格的編輯狀態,下面的例子跟15.2.1節的例子差不多,但不同的是,應用了DataGridColumn類定義每個列的基本屬性,然後再添加到DataGrid組件中。具體步驟如下。
* 創建一個ActionScript 3.0文件,命名爲DataGridCellEditorExample,類名爲DataGridCellEditorExample,繼承自Sprite類,並導入用到的類庫。代碼如下所示:
package
{
    import fl.controls.DataGrid;
    import fl.controls.dataGridClasses.DataGridCellEditor;
    import fl.controls.TextInput;
    import fl.data.DataProvider;
    import flash.display.Sprite;
    import flash.text.TextFormat;
    import fl.controls.dataGridClasses.DataGridColumn;
    import fl.controls.ComboBox;
    public class DataGridCellEditorExample extends Sprite
    {
    }
}
創建構造函數。代碼如下所示:
/************************
* 構造函數
* **********************/
public function DataGridCellEditorExample()
{
}
創建DataGrid組件,封裝在函數CreateDataGrid中。首先在函數中創建數據模型,代碼如下所示:
/************************
* 創建DataGrid組件
* **********************/
private function CreateDataGrid():void
{
dg = new DataGrid();
           
    // 設置大小
    dg.setSize(350,300);
    // 設置單元格的編輯狀態
    dg.editable = true;
           
     // 創建數據模型
    var dp:DataProvider = new DataProvider();
    dp.addItem({Name:"Tom",Sex:"male",Phone:23579086,QQ:77788899,Software:"Flash"});
    dp.addItem({Name:"Kelly",Sex:"female",Phone:33579080,QQ:56788823,Software:"Flex"});
    dp.addItem({Name:"Jim",Sex:"male",Phone:83579085,QQ:56788882,Software:"Java"});
    dp.addItem({Name:"Sam",Sex:"male",Phone:73579084,QQ:78988811,Software:"Dreamweaver"});
    dp.addItem({Name:"Kaiven",Sex:"male",Phone:33576681,QQ:32188897,Software:"Photoshop"});
    dp.addItem({Name:"Gray",Sex:"male",Phone:23229086,QQ:12388900,Software:"Fireworks"});
    dp.addItem({Name:"Luar",Sex:"male",Phone:23579087,QQ:24681899,Software:"DAEMON Tools"});
    dp.addItem({Name:"Kite",Sex:"female",Phone:85579082,QQ:68080894,Software:"FlashDevelop"});
    dp.addItem({Name:"Polar",Sex:"male",Phone:32579086,QQ:21586899,Software:"Beyond Compare"});
在函數中,定義每個列,將性別和電話列的單元格設置成可編輯狀態,添加的代碼如下所示:
// 增加列,定義每個列的屬性
var cellEditor:DataGridCellEditor = GetCustomEditor();
var sexcellEditor:DataGridCellEditor = GetCustomEditor_List();
           
// 增加定義“名字”列
var dgc_name:DataGridColumn = new DataGridColumn();
dgc_name.editable = false;
dgc_name.dataField = "Name";
//dgc_name.itemEditor = CellEditor;
dgc_name.sortable = true;
dg.addColumn(dgc_name);
           
// 增加定義“性別”列
var dgc_sex:DataGridColumn = new DataGridColumn();
dgc_sex.editable = true;
/dgc_sex.itemEditor = sexcellEditor;
dgc_sex.dataField = "Sex";
dgc_sex.sortable = true;
dgc_sex.width = 90;
dg.addColumn(dgc_sex);
           
// 增加定義“電話”列
var dgc_phone:DataGridColumn = new DataGridColumn();
dgc_phone.editable = true;
dgc_phone.dataField = "Phone";
dgc_phone.itemEditor = cellEditor;
dgc_phone.sortable = true;
dg.addColumn(dgc_phone);
           
// 增加定義“QQ”列
var dgc_qq:DataGridColumn = new DataGridColumn();
dgc_qq.editable = false;
dgc_qq.dataField = "QQ";
dgc_qq.sortable = true;
dg.addColumn(dgc_qq);
           
// 增加定義“軟件”列
var dgc_soft:DataGridColumn = new DataGridColumn();
dgc_soft.editable = false;
dgc_soft.dataField = "Software";
dgc_soft.sortable = true;
dg.addColumn(dgc_soft);
dg.dataProvider = dp;
把DataGrid組件添加到舞臺中,代碼如下所示:
addChild(dg);
使用DataGridCellEditor對象,定義DataGrid組件單元格的樣式,代碼如下所示:
/************************
* 定義單元格樣式
* **********************/
private function GetCustomEditor():DataGridCellEditor
{
var dgce:DataGridCellEditor = new DataGridCellEditor();
dgce.textField.background = true;
dgce.textField.backgroundColor = 0xCC99FF;
dgce.maxChars = 2;
dgce.restrict = "1234567890";
return dgce;
}
編譯代碼並運行,效果如圖15.6所示。
圖15.6 編輯DataGrid單元格
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章