TreeView描述数据库表树型问题

电脑爆 2006-10-18 09:26:17
表结构如下:

一级分组   二级分组   姓名
深圳分部   人事部    张三
深圳分部   人事部    李四
广州分部   人事部    王五
广州分部   营销部    钱二
深圳分部   服务部    李某
广州分部   营销部    钱三

如何用程序建成如下TreeView:
---深圳分部
| ---人事部
| | |--张三
| | |--李四
| ---服务部
|  |--李某
---广州分部
 ---人事部
 | |--王五
 ---营销部
   |--钱二
   |--钱三
...全文
304 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
电脑爆 2007-01-01
  • 打赏
  • 举报
回复
没能完全解决,结帖
勉励前行 2006-10-19
  • 打赏
  • 举报
回复
一级分组   二级分组   姓名
深圳分部   人事部    张三

依據這樣一個表,要生成一個 TTreeView , 該不是問題吧。每條記錄最多生成三個節點,
關鍵是有一個查找父節點的過程。

//有了這個函數,那個就可以輕松找到父節點,從而在父節點下插入一個子節點即可
TTreeNode *FindNode(TTreeView *TV , TTreeNode *ParentNode, AnsiString NodeText)
{
TTreeNode *Node ;
if(ParentNode)
Node = ParentNode->getFirstChild() ;
else
Node = TV->getFirstChild() ;
for(;Node;Node = Node->getNextSibling())
if(Node->Text == NodeText)
return Node;

return NULL ;
}
//--------
將dataset 依 一级分组、二级分组、姓名 排序
//dataset->OrderBy = "一级分组;二级分组;姓名" ;
//參考用SQL: SELECT 一级分组, 二级分组,姓名 FROM TABLE
// ORDER BY 一级分组, 二级分组,姓名
void FillTreeView(TTreeView *TV , TDataSet *dataset)
{
TField * F[3] ;
F[0] = dataset->FieldByName("一级分组");//dataset->Fields->Fields[0]
F[1] = dataset->FieldByName("二级分组");//dataset->Fields->Fields[1]
F[2] = dataset->FieldByName("姓名");//dataset->Fields->Fields[2]
TV->Items->Clear();
TV->Items->BeginUpdate();
for(dataset->Frist(); !dataset->Eof ; dataset->Next())
{
TTreeNode *ParentNode = NULL;
for(int i = 0 ; i < 3 ; ++i)
{
if(F[i]->IsNull) //出錯。忽略,或跳至錯誤處理
break ;
Node = FindNode(TV,ParentNode ,F[i]->Text);
if(Node)
ParentNode = Node
else
ParentNode = TV->Items->AddChild(ParentNode,F[i]->Text);
}
}
TV->Items->EndUpdate();
}

上面是一次性加載全部節點的方法。(沒作調試,只陳述思路)
daydayup234 2006-10-19
  • 打赏
  • 举报
回复
参考这段代码,给你个思路

#ifndef Unit1H
#define Unit1H
#include <dao_2k.h>
#include <ADODB.hpp>
#include <Classes.hpp>
#include <ComCtrls.hpp>
#include <Controls.hpp>
#include <DB.hpp>
#include <StdCtrls.hpp>
class TForm1 : public TForm
{
__published:
TButton *Button1;
TADOConnection *ADOConnection1;
TADOQuery *ADOQuery1;
TTreeView *TreeView1;
TButton *Button2;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
public:
void addTmpData(int,int);
void ChildNodeToTree(TTreeNode* ,int&);
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif



#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner):TForm(Owner){}
//---------------------------------------------------------------------------
void TForm1::addTmpData(int intNAME ,int intSON_NAME)
{
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
AnsiString Msg = Format("insert into TmpTable values(%d,%d)", ARRAYOFCONST((intNAME,intSON_NAME)));
ADOQuery1->SQL->Add(Msg);
ADOQuery1->ExecSQL();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(FileExists("record.mdb")) return;

Variant xx=CreateOleObject("ADOX.Catalog"); //#include <dao_2k.h>
xx.OleFunction("Create","Provider=Microsoft.Jet.OLEDB.4.0;Data Source=record.mdb");

WideString ss;
ss="Provider=Microsoft.Jet.OLEDB.4.0;\n\r"
"Data Source="+ExtractFilePath(Application->ExeName)+"record.mdb;"
"Persist Security Info=False";
ADOConnection1->ConnectionString=ss;
ADOQuery1->Connection=ADOConnection1;

AnsiString sql;
sql="CREATE TABLE TmpTable(NAME INTEGER,SON_NAME INTEGER)"; //权用整数
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add(sql);
ADOQuery1->ExecSQL(); //创建新表TmpTable
ADOQuery1->Close();

addTmpData(1 ,11);
addTmpData(1 ,12);
addTmpData(1 ,13);
addTmpData(1 ,17);
addTmpData(1 ,15);
addTmpData(1 ,123);
addTmpData(1 ,312);
addTmpData(1 ,412);
addTmpData(1 ,231);
addTmpData(2 ,12);
addTmpData(2 ,22);
addTmpData(2 ,23);
addTmpData(2 ,123);
addTmpData(2 ,312);
addTmpData(2 ,412);
addTmpData(2 ,231);
addTmpData(12 ,123);
addTmpData(12 ,312);
addTmpData(12 ,412);
addTmpData(23 ,123);
addTmpData(23 ,231);
addTmpData(123 ,1234);
addTmpData(123 ,3412);

ADOConnection1->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if(!FileExists("record.mdb")) return;
AnsiString sql;
WideString ss;
ss="Provider=Microsoft.Jet.OLEDB.4.0;\n\r"
"Data Source="+ExtractFilePath(Application->ExeName)+"record.mdb;"
"Persist Security Info=False";
ADOConnection1->ConnectionString=ss;
ADOQuery1->Connection=ADOConnection1;

TreeView1->Items->Clear();
int sum,theNum;

ADOQuery1->SQL->Clear();
sql="select distinct NAME from TmpTable order by NAME";
ADOQuery1->SQL->Add(sql);
ADOQuery1->Open();
sum=ADOQuery1->RecordCount;
while(sum-->0)
{
TreeView1->Items->Add(0,ADOQuery1->Fields->Fields[0]->AsString);
ADOQuery1->Next();
}
ADOQuery1->Close();

//以下正题
sum=TreeView1->Items->Count;
theNum=0;
while(theNum<sum)
{
ChildNodeToTree(TreeView1->Items->Item[theNum],sum);
theNum++;
}

TreeView1->FullExpand();
}
//---------------------------------------------------------------------------
void TForm1::ChildNodeToTree(TTreeNode* node,int& count)
{
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
AnsiString sql;
sql="select SON_NAME from TmpTable where NAME="+node->Text;
ADOQuery1->SQL->Add(sql);
ADOQuery1->Open();
while(!ADOQuery1->Eof)
{
TreeView1->Items->AddChild(node,ADOQuery1->Fields->Fields[0]->AsString);
ADOQuery1->Next();
}
count+=ADOQuery1->RecordCount;
}

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧