数据库与treeview联手!(50分)

  • 主题发起人 主题发起人 rongercao
  • 开始时间 开始时间
R

rongercao

Unregistered / Unconfirmed
GUEST, unregistred user!
各位高手,请问:
如何将数据库的记录信息读出显示到treeview中,又如何将新的treeview信息保存到数据库中.
我设计的数据库如下:
id name father sun
1 河南 0 1
2 郑州 1 1
3 新华路 2 0
4 广东 0 1
5 深圳 4 1
6 富强路 5 0
7 北京 0 0
................
其中id代表该节点的编号,name代表该节点将要在treeview中显示的内容,father代表该节点的父节点
的编号,sun代表该节点是否有子节点,请问如何实现程序启动时显示treeview,显示格式如下:
河南
....郑州
........新华路
广东
....深圳
........富强路
北京
..............
当在treeview添加和修改了某个节点时,数据库的保存工作,如何实现上面两部操作!
最好提供源码,如果符合要求,一定给分,如果做的完美,另有附加分相送!
program_delphi@fm365.com
 
在下也急需一类似的程序,如方便请也从小弟一份
woanan006@sina.com
 
我的意见是你只要使用两个字段就可以了
newid name
010000 河南
010100 郑州
010101 新华路
020000 广东
020100 深圳
020101 富强路
030000 北京

对于使用treeview显示数据库的内容是首先应该考虑层的处理,所以编码要讲究点层次(笑:不是那个意思)
其他的你自己在考虑,我给你一块砖头看看怎么样....
 
编号时用两位代表一个节点
10
1001
1002
11
1101
110101
12
......
下面是显示节点的数据科目树

procedure Tkemuform.TRview(A1,A2:String);
var
id,id1:string;
name1:string;
Dnode1,dnode2,dnode3: TtreeNode;
begin
TreeView1.Items.BeginUpdate;
Treeview1.Items.clear;
Dnode1:=nil;
Dnode2:=nil;
Dnode3:=nil;
with DM.TrQuery do
begin
close;
Sql.Clear;
Sql.text:='select * from a_Initbala where subid>:D1 and subid<:D2';
Parameters[0].value:=A1;
Parameters[1].value:=A2;
Open;
While not Eof do
begin
Id:=Fieldbyname('Subid').AsString;
Name1:=Fieldbyname('Name').AsString;
Id1:=Id+' '+name1;
case length(id) of
3: dnode1:=treeview1.Items.add(nil,id1);
6: dnode2:=treeview1.Items.addchild(dnode1,id1);
8: dnode3:=treeview1.Items.addchild(dnode2,id1);
10: treeview1.Items.addchild(dnode3,id1);
end;
Next;
end;
if not Eof then
Treeview1.TopItem.Selected:=True;
TreeView1.HideSelection:=false;
TreeView1.Items.EndUpdate;
end;
end;
 
但是我现在想用我设计的哪个表,并且支持子节点无限多的情况.可延伸.
 
写个过程什么的,就是麻烦一点儿吧,不难
我懒,我不写 [:D]
源码就不要等了,有这时间自己都写完了
 
我曾写过一个产品数据管理程序,是这样处理的:
每个节点具有唯一ID,每个节点靠PARENT_ID与父节点联系起来,如
ID NAME PARENT_ID
1 太阳系 NULL
2 火星 1
3 地球 1
4 月亮 3
5 人造卫星 3
...
不过当时是用VB写的。
 
源码?!!^_^
 
当时用vb 写的代码,希望对这个问题有帮助。

Public Sub tvTreeView_NodeClick(ByVal Node As MSComctlLib.Node)
On Error GoTo PROC_ERR
Dim strNodekey As String
If Node.key = m_strSelectNodeKey Then Exit Sub '击中当前节点,什么也不作
MousePointer = vbHourglass
'作其他工作,略去n行...

'该节点有子节点,或为零件,或为标准件等不可再分的节点
If Node.Children <> 0 Or Node.Image = TreeNodeStyle.trvPart Or Node.Image = TreeNodeStyle.trvCoPart Then
MousePointer = vbDefault
Exit Sub
End If

!!!!!!
strSql = "select * from 产品结构表 where 部件标识符 = " & m_strSelectNodeKey & "order by 序号 ASC"
!!!!!!

' 创建 recordset
Set g_rstProductStructure = New Recordset
g_rstProductStructure.CursorLocation = adUseClient
g_rstProductStructure.Open strSql, g_cnndb

If g_rstProductStructure.BOF And g_rstProductStructure.EOF Then
MousePointer = vbDefault
Exit Sub
Else
g_rstProductStructure.MoveFirst
Do Until g_rstProductStructure.EOF
Set nodX = tvTreeView.Nodes.Add(Node.key, tvwChild, "xh" & g_rstProductStructure!标识符, Trim(g_rstProductStructure!名称), CInt(Trim(g_rstProductStructure!节点类型)))
'新提交的零部件,兰色
If g_rstProductStructure!节点状态 = NodeState.refer Then nodX.ForeColor = vbBlue
'正在更改的零部件,红色
If g_rstProductStructure!节点状态 = NodeState.Modify Then nodX.ForeColor = vbRed
g_rstProductStructure.MoveNext

Loop

End If
MousePointer = vbDefault
PROC_EXIT:
Exit Sub

PROC_ERR:
Call ShowError(Me.Name, "tvTreeView_NodeClick", Err.Number, Err.Description)
Err.Clear

End Sub

 
//调用递归程序

Root := '根节点';
with db1.queryNation do
begin
Close; //下拉框
SQL.Text := 'select * from view_tab order by view_tab.father_code';
Open;
First;
if not eof then
begin
TreeDim.Items.BeginUpdate;
AddDimNode(Root,0); //显示分组结构
TreeDim.Items.EndUpdate;
end;
end;


procedure TfrmDimG_WH.AddDimNode(FatherNode : TTreeNode; intFathercode :integer);
var
Nodex : TTreeNode;
SearchOptions : TLocateOptions;
SavePlace : pointer;

begin
db1.queryNation.First;
if not (db1.queryNation.Locate('father_code',intFathercode,SearchOptions)) then Exit;
while not db1.queryNation.Eof and (db1.queryNation.FieldByName('father_code').Asinteger = intFathercode) do //匹配字段
begin
//加子节点
Nodex := TreeDim.Items.AddChild(FatherNode,db1.queryNation.FieldByName('name').AsString + ',(' + db1.queryNation.FieldByName('e_name').AsString + ')');
Nodex.StateIndex := db1.queryNation.FieldByName('ref_code').AsInteger;
SavePlace := db1.queryNation.GetBookmark;
AddDimNode(Nodex,db1.queryNation.FieldByName('code').AsInteger);
db1.queryNation.GotoBookmark(SavePlace);
db1.queryNation.FreeBookmark(SavePlace);
db1.queryNation.Next;
end;
end;
 
设计两个字段即可,比如生成树是
A
B
D
E
C
那么表里就是
A B
A C
B D
B E
代码如下:
TreeView1.Items.Clear;
DataModule2.ADOTable1.First;
for I:=0 to DataModule2.ADOTable1.RecordCount-1 do
begin
T:=False;
Str1:=Trim(DataModule2.ADOTable1.FieldByName('字段1').AsString);
Str2:=Trim(DataModule2.ADOTable1.FieldByName('字段2').AsString);
if TreeView1.Selected<>nil then
if Str1=TreeView1.Selected.Text then
begin
TreeView1.Items.AddChild(TreeView1.Selected,Str2);
T:=True;
end
else
begin
for D:=0 to TreeView1.Items.Count-1 do
if Str1=TreeView1.Items[D].Text then
begin
TreeView1.Selected:=TreeView1.Items[D];
TreeView1.Items.AddChild(TreeView1.Items[D],Str2);
T:=true;
Break;
end;
end;
if T=False then
begin
if TreeView1.selected=nil then
TreeView1.Items.AddChild(nil,Str1)
else
TreeView1.Items.Add(TreeView1.Items[0],Str1);
for D:=0 to TreeView1.Items.Count-1 do
if Str1=TreeView1.Items[D].Text then
begin
TreeView1.Selected:=TreeView1.Items[D];
TreeView1.Items.AddChild(TreeView1.Items[D],Str2);
Break;
end;
end;
DataModule2.ADOTable1.Next;
end;
TreeView1.FullCollapse;
 
接受答案了.
 

Similar threads

S
回复
0
查看
758
SUNSTONE的Delphi笔记
S
S
回复
0
查看
751
SUNSTONE的Delphi笔记
S
D
回复
0
查看
788
DelphiTeacher的专栏
D
D
回复
0
查看
825
DelphiTeacher的专栏
D
后退
顶部