如何將資料庫的欄位資料轉成TreeView樹狀結構? |
答題得分者是:ccchen
|
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
|
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
實際的作法應依資料量, 是否須編輯, 與編輯方式而有很多不同考慮
以下提供一個簡單Sample給你參考, 用Recurisive方式建立節點
procedure TForm1.AddTreenode(pnd: TTreenode; pid: integer); var qry:TQuery; nd:TTreenode; begin qry:=TQuery.create; try qry.sql.add('select ID,SORTNAME from Tablename where ParentID=pid'); qry.open; while not qry.eof do begin nd:=Treeview1.Items.AddChild(pnd, qry.fieldbyname('SORTNAME').asstring); AddTreenode(nd, qry.fieldbyname('ParentID').asinteger); qry.next; end; finally qry.free; end; end;使用時 AddTreenode(nil, -1); [note] 1. 如果資料量很大, 可以考慮formShow時只取第一層, 然後在onChange才去取下一層 2. 可以用TClientDataSet載入全部資料, 上面Recursive中之Query改為用Filter. 如此做之好處可讓編輯更方便, ClientDataset多Create一個Field記錄所對應Treenode之handle, 使Dataset和TreeView可同步編輯 |
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
|
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
|
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
引言: 實際的作法應依資料量, 是否須編輯, 與編輯方式而有很多不同考慮 以下提供一個簡單Sample給你參考, 用Recurisive方式建立節點測試結果: 只能顯示如下結果..procedure TForm1.AddTreenode(pnd: TTreenode; pid: string); var qry:TQuery; nd:TTreenode; s:string; begin s:='select ID,SORTNAME from Tablename where ParentID='+pid; qry:=TQuery.create; try qry.sql.add(s); //修正 qry.open; while not qry.eof do begin nd:=Treeview1.Items.AddChild(pnd, qry.fieldbyname('SORTNAME').asstring); AddTreenode(nd, qry.fieldbyname('ID').asstring);//修正 qry.next; end; finally qry.free; end; end;使用時 AddTreenode(nil, intTostr(-1));//修正 [note] 1. 如果資料量很大, 可以考慮formShow時只取第一層, 然後在onChange才去取下一層 2. 可以用TClientDataSet載入全部資料, 上面Recursive中之Query改為用Filter. 如此做之好處可讓編輯更方便, ClientDataset多Create一個Field記錄所對應Treenode之handle, 使Dataset和TreeView可同步編輯 -- 藝術文化 |--音樂其他往下樹狀結構處理,無達成所想要之結果~ 網海無涯,學無止境! 發表人 - qoo1234 於 2003/08/10 16:57:54 |
airomeo
一般會員 發表:1 回覆:4 積分:1 註冊:2005-03-08 發送簡訊給我 |
您好!我想請問...
dmView.cdsTemp 為一個tclientdataset...
但我在實作的時候,以如下程式來看,只能展一層,
只要一遇到dmView.cdsTemp.Free;這一行便會發生錯誤...
若把dmView.cdsTemp.Free; 給mark 起來,便可執行成功但只能展一層...
可否請您給個解答... 萬分感謝您 function AddChildNode(node: TTreeNode; id: string; stype: string): TTreeNode;
var
strSQL: String;
begin
Result := frmNode.TreeNodePage.Items.AddChild(node, stype);
strSQL:='select * from node_list t WHERE parentid = '''+id+''' order by parentid,nodetype desc,nodetext';
tool_sqlToCDS(strSQL ,dmView.cdsTemp); While not dmView.cdsTemp.Eof do
begin
AddChildNode(Result, dmView.cdsTemp.FieldByName('nodeid').AsString, dmView.cdsTemp.FieldByName('nodetext').AsString);
dmView.cdsTemp.Next;
end;
dmView.cdsTemp.Free;
end; procedure tool_SQLtoCDS(SQL:string; cds:Tclientdataset);
begin
with dmView.cdsTemp do
begin
close;
data:=dmView.midasview.AppServer.query(SQL);
open;
first;
cds.Data:=data;
end;
end;
引言: 實際的作法應依資料量, 是否須編輯, 與編輯方式而有很多不同考慮 以下提供一個簡單Sample給你參考, 用Recurisive方式建立節點 [code] .....略 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |