轉(zhuǎn)帖|其它|編輯:郝浩|2010-08-20 11:57:36.000|閱讀 3795 次
概述:在實(shí)際工作中,樹狀結(jié)構(gòu)中的 items 經(jīng)常來自數(shù)據(jù)庫的一個(gè)或若干個(gè)關(guān)系表中,若想利用 TTreeView 控件生成相關(guān)的樹狀結(jié)構(gòu),設(shè)計(jì)時(shí)方式很難實(shí)現(xiàn),運(yùn)行時(shí)方式雖然可以實(shí)現(xiàn),但需要程序員設(shè)計(jì)大量的代碼,而且容易出錯(cuò)。因此,為了提高開發(fā)效率,減少重復(fù)開發(fā),我們必須使用 data-aware 樹型控件。本文介紹了TdxDBTreeList 的使用方法和技巧,特別是由多關(guān)系表構(gòu)成樹型結(jié)構(gòu)的情況。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
簡(jiǎn)介
樹型控件是一種有效的表示方法,在數(shù)據(jù)庫應(yīng)用程序的開發(fā)中經(jīng)常用它可視化表示對(duì)象之間的層次關(guān)系,便于用戶的操作和使用。比如:表示一個(gè)公司部門的層次結(jié)構(gòu);磁盤文件系統(tǒng)等。Borland 公司的Delphi 開發(fā)系統(tǒng)提供了一般的樹型控件TTreeView,它可以在設(shè)計(jì)時(shí)或運(yùn)行時(shí)生成必要的樹型結(jié)構(gòu)圖,方法是通過生成控件對(duì)象的 Items 屬性。設(shè)計(jì)時(shí)方式通過手工方式增加items,主要適用于靜態(tài)、少量的 items 的情況;運(yùn)行時(shí)方式通過程序生成樹型結(jié)構(gòu)的 items,它既適合靜態(tài)又可用于動(dòng)態(tài)的情況。在實(shí)際工作中,樹狀結(jié)構(gòu)中的 items 經(jīng)常來自數(shù)據(jù)庫的一個(gè)或若干個(gè)關(guān)系表中,若想利用 TTreeView 控件生成相關(guān)的樹狀結(jié)構(gòu),設(shè)計(jì)時(shí)方式很難實(shí)現(xiàn),運(yùn)行時(shí)方式雖然可以實(shí)現(xiàn),但需要程序員設(shè)計(jì)大量的代碼,而且容易出錯(cuò)。因此,為了提高開發(fā)效率,減少重復(fù)開發(fā),我們必須使用 data-aware 樹型控件。Developer Express inc. 的ExpressQuantumGrid Suite 中樹型控件TdxDBTreeList 屬于 data-aware 型,items 不僅可以來自數(shù)據(jù)庫的關(guān)系表,而且可以為數(shù)組等其它數(shù)據(jù)源。本文介紹了TdxDBTreeList 的使用方法和技巧,特別是由多關(guān)系表構(gòu)成樹型結(jié)構(gòu)的情況。
TdxDBTreeList 概述
Developer Express inc. 開發(fā)的The ExpressQuantumGrid Suite 包含三個(gè)功能強(qiáng)大的控件,它們分別是:TdxTreeList 、 TdxDBTreeList 和 TdxDBGrid。TdxDBTreeList 直接繼承于 TCustomdxDBTreeListControl ,它是 data-aware 型的,不僅結(jié)合標(biāo)準(zhǔn)的樹型視圖和列表控件的特性,而且具有獨(dú)特的特性:運(yùn)行時(shí)列定制、一個(gè)樹結(jié)點(diǎn)內(nèi)編輯任意列的能力和由dataset 生成樹結(jié)構(gòu)。
使用該樹型控件關(guān)鍵是設(shè)定屬性頁中幾個(gè)重要的屬性,分別為:DataSource、KeyField、ParentField 和 Bands。其中 DataSource 為提供樹型結(jié)構(gòu)的數(shù)據(jù)源,可以為來自一個(gè)或若干個(gè)關(guān)系表的元組的集合,因此它是必須的且不為空;KeyField 為 DataSource 的元組中唯一標(biāo)識(shí)自身的關(guān)鍵碼;樹型控件表示的是對(duì)象之間的層次關(guān)系,除樹根結(jié)點(diǎn)之外(最上層項(xiàng)目),每一個(gè)結(jié)點(diǎn)都有一個(gè)唯一的雙親結(jié)點(diǎn)(直接上層結(jié)點(diǎn))。ParentField 即是元組中標(biāo)識(shí)其雙親結(jié)點(diǎn)的 KeyField 。根結(jié)點(diǎn)的 ParentField 值必須不是 DataSource 代表的元組中 KeyField 值之一;Bands 控制樹型結(jié)構(gòu)顯示的列數(shù),通過它提供的 Add 方法增加合適的 Columns ,Columns 有兩個(gè)重要的屬性:Caption 和 FieldName 。Caption 可以設(shè)定樹型結(jié)構(gòu)的標(biāo)題,F(xiàn)ieldName 代表 DataSource 的元組表示樹型結(jié)構(gòu)項(xiàng)目的字段。例如用如下的部門關(guān)系表作為 DataSource 形成樹型結(jié)構(gòu):
表1 unti 關(guān)系表
UnitNo | unitName | superiorUnit |
0000 | 東南大學(xué) | -1 |
0001 | 計(jì)算機(jī)系 | 0000 |
000101 | 硬件教研室 | 0001 |
000102 | 軟件教研室 | 0001 |
0002 | 外語系 | 0000 |
000201 | 大外教研室 | 0002 |
000202 | 專外教研室 | 0002 |
其中,unitNo 表示部門號(hào);unitName 部門名稱;superiorUnit 上級(jí)部門號(hào)。KeyField 設(shè)為unitNo;ParentField 設(shè)為 superiorUnit ;Bands 的一列 Columns 的 FieldName 設(shè)為 unitName 。這樣形成如圖1所示的樹型結(jié)構(gòu)。
![]() 圖1 樹型結(jié)構(gòu)示例圖 |
多關(guān)系表生成的樹結(jié)構(gòu)
實(shí)際應(yīng)用中經(jīng)常需要由兩個(gè)或若干個(gè)關(guān)系表構(gòu)成樹型結(jié)構(gòu),從表面上看,TdxDBTreeList 僅支持一個(gè)關(guān)系表。我們可以巧妙地利用 SQL 中功能強(qiáng)大的 SELECT 語句生成必要的數(shù)據(jù)源 DataSource 。SELECT 語句不僅可以由一個(gè)關(guān)系表生成元組集合,還可以由多表生成,語法形式為:
select ………. Union select …….. union select ………。
如存在如下兩個(gè)關(guān)系表 unit 部門表和 teacher 教師表:
create table unit ( unitNo varchar2(6) not null, ………..部門號(hào) unitName varchar2(30), ……….部門名稱 superiorUnitNo varchar2(6), …..上級(jí)部門號(hào) primary key (unitNo )) create teacher ( teacherNo varchar2(8) not null , ……..教師號(hào) teacherName varchar2(10) , ……..教師名 unitNo varchar(6), ……..教師所在教研室號(hào) primary key (teacherNo), foreign key unitNo(unitNo) references unit ) |
其中,teacher 表的字段 unitNo 為引用unit表的外鍵。假設(shè)unit 的關(guān)系表內(nèi)容同表1;teacher的內(nèi)容如下:
表2 teacher 關(guān)系表
teacherNo | teacherName | unitNo |
00010001 | Computer1 | 000101 |
00010002 | Computer2 | 000102 |
00020001 | Foreign1 | 000201 |
00020001 | Foreign2 | 000202 |
如要生成如圖2所示的來自u(píng)nit 和 teacher 兩個(gè)關(guān)系表數(shù)據(jù)的樹型結(jié)構(gòu):
圖2 待生成的unit 和 teacher 兩個(gè)關(guān)系表數(shù)據(jù)的樹型結(jié)構(gòu)
可以用下列語句:
select unitNo||' ' as unitNo,unitName, superiorUnit from depart union select teacherNo as unitNo,teacherName as unitName,unitNo||' ' as superiorUnit from teacher |
生成的數(shù)據(jù)集作為 TdxDBTreeList 的數(shù)據(jù)源;unitNo 作為 KeyField;superiorUnit 作為 ParentField 等。需要注意的是,其中 uintNo||' '是一種字符串連接運(yùn)算,之所以要這么做是因?yàn)?unit 關(guān)系模式中 unitNo 的字段寬度為 6 位,而 teacher 中的 teacherNo 為 8 位,作為 TdxDBTreeList 的 KeyField 必須統(tǒng)一二者的寬度,否則可能出現(xiàn)問題,讀者可以親自試驗(yàn)。
結(jié)論
樹型控件是一種強(qiáng)有力的交互工具,利用第三方提供的 data-aware 樹型控件可以效、可靠地開發(fā)應(yīng)用程序。SQL 中的 SELECT 是一個(gè)功能強(qiáng)大的語句,靈活的使用它可以實(shí)現(xiàn)過程性語言所無法代替的效果。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:計(jì)算機(jī)與信息技術(shù)