樹狀結構是呈現階層式資料的最佳介面,無論是企業組織架構、磁碟目錄、或是多層級分類選單,皆有其身影。Delphi 內建的 TTreeView 雖可手動或程式動態建立節點,但面對龐大資料庫資料時,程式碼繁瑣且難維護。DevExpress ExpressQuantumGrid Suite 中的 TdxDBTreeList 為資料感知型樹狀控件,能直接繫結 DataSource,大幅簡化開發。本文深入探討其核心屬性設定,並重點示範如何以 SQL UNION 整合多關聯表構建複雜樹狀結構。
| 屬性 | 說明 |
|---|---|
DataSource | 資料來源,必須指定,提供樹狀結構的資料集 |
KeyField | 唯一識別每筆記錄的鍵值欄位(如部門代碼) |
ParentField | 指向父節點的鍵值欄位(如上級部門代碼),根節點的 ParentField 不得出現在 KeyField 中 |
Bands | 控制顯示欄位,透過 Add 方法新增 Columns,設定 Caption(標題)與 FieldName(資料欄位) |
假設 unit 部門表結構如下:
UnitNo (PK) | UnitName | SuperiorUnit
--------------------------------------
0000 | 東南大學 | -1
0001 | 計算機系 | 0000
000101 | 硬體教研室| 0001
000102 | 軟體教研室| 0001
0002 | 外語系 | 0000
000201 | 大外教研室| 0002
000202 | 專外教研室| 0002
設定:KeyField = UnitNo、ParentField = SuperiorUnit、Bands.Column.FieldName = UnitName,即可自動生成如下樹狀結構:

實務上常需將「部門」與「教師」兩張表合併顯示:部門為父節點,教師為子節點。TdxDBTreeList 僅接受單一 DataSource,解決之道是利用 SQL UNION 將多表合併為單一虛擬資料集。
-- 部門表
CREATE TABLE unit (
UnitNo VARCHAR2(6) PRIMARY KEY,
UnitName VARCHAR2(30),
SuperiorUnitNo VARCHAR2(6)
);
-- 教師表
CREATE TABLE teacher (
TeacherNo VARCHAR2(8) PRIMARY KEY,
TeacherName VARCHAR2(10),
UnitNo VARCHAR2(6) REFERENCES unit(UnitNo)
);
關鍵技巧:KeyField 必須資料型態與長度一致。部門 UnitNo 為 6 碼,教師 TeacherNo 為 8 碼,需以字串連接補齊:
SELECT UnitNo || ' ' AS UnitNo, UnitName, SuperiorUnitNo AS SuperiorUnit
FROM unit
UNION
SELECT TeacherNo AS UnitNo, TeacherName AS UnitName, UnitNo || ' ' AS SuperiorUnit
FROM teacher
|| ' ' 使兩邊 UnitNo 統一為 8 字元(含空白),避免比對失敗。合併後的資料集指派給 DataSource,設定 KeyField = UnitNo、ParentField = SuperiorUnit,即可獲得「部門-教師」兩層樹狀結構:

UNION 會自動去除重複列;若需保留重複,請改用 UNION ALLParentField 值(如 -1 或空白)必須不出現在任何記錄的 KeyField 中KeyField、ParentField 建立索引以提升載入速度DevExpress 官網 www.devexpress.com 提供完整文件與範例。善用 TdxDBTreeList 搭配 SQL UNION,即能優雅解決多表樹狀結構呈現難題。