線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1530
推到 Plurk!
推到 Facebook!

如何將資料庫的欄位資料轉成TreeView樹狀結構?

答題得分者是:ccchen
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-08-07 20:54:02 IP:61.216.xxx.xxx 未訂閱
原資料內容如下: 如何完成TreeView樹狀結構?
     -- 藝術文化
      |--音樂
      |--戲劇
      |--歌手歌星    -- 生活資訊
      |--行動通訊
      |--交通
      |--活動報導    
網海無涯,學無止境!
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-08-08 08:38:31 IP:218.163.xxx.xxx 未訂閱
實際的作法應依資料量, 是否須編輯, 與編輯方式而有很多不同考慮 以下提供一個簡單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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-08-08 09:35:32 IP:203.95.xxx.xxx 未訂閱
Hi, 弟的這篇有詳細的說明, 包含了只先往下展兩層以增進速度及使用 data 的方法, 請參考看看: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=28046
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-08-08 11:43:02 IP:61.216.xxx.xxx 未訂閱
謝謝兩位指教~ < src="http://delphi.ktop.com.tw/download/upload\33223_qoo.gif">網海無涯,學無止境!
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-08-10 16:53:53 IP:61.216.xxx.xxx 未訂閱
引言: 實際的作法應依資料量, 是否須編輯, 與編輯方式而有很多不同考慮 以下提供一個簡單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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-08-10 14:20:11 IP:203.66.xxx.xxx 未訂閱
您好!我想請問... 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] .....略
系統時間:2024-06-27 0:55:44
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!