数据库中只有两个字段:
cCode cName
01 世界
0101 亚洲
010101 中国
01010101 北京
01010102 上海
010102 日本
01010201 东京
01010202 北海道
0102 欧洲
010201 西班牙
01020101 巴塞罗那
01020102 马德里
在TreeView中生成下面的格式:
01:世界
0101:亚洲
010101:中国
01010101:北京
01010102:上海
010102:日本
01010201:东京
01010202:北海道
0102:欧洲
010201:西班牙
01020101:巴塞罗那
01020102:马德里
并且可以根据新文本框中输入的内容可以将新内容添加到数据库中,并在TreeView中显示,
而且可以对点选到的节点进行编辑,并且可以对点选到的节点进行编辑和添加同级及下级节点,
但是根节点'01:世界'需无法添加同级节点,只能添加下级节点,最底层的孩子节点例如
'01020101:巴塞罗那'只能添加同级节点而不能添加下级节点。高手们来看看啊,自己写了写,总是有问题。向大家请教。系统限制帖子最高只能给到100分,请大家见谅。
cCode cName
01 世界
0101 亚洲
010101 中国
01010101 北京
01010102 上海
010102 日本
01010201 东京
01010202 北海道
0102 欧洲
010201 西班牙
01020101 巴塞罗那
01020102 马德里
在TreeView中生成下面的格式:
01:世界
0101:亚洲
010101:中国
01010101:北京
01010102:上海
010102:日本
01010201:东京
01010202:北海道
0102:欧洲
010201:西班牙
01020101:巴塞罗那
01020102:马德里
并且可以根据新文本框中输入的内容可以将新内容添加到数据库中,并在TreeView中显示,
而且可以对点选到的节点进行编辑,并且可以对点选到的节点进行编辑和添加同级及下级节点,
但是根节点'01:世界'需无法添加同级节点,只能添加下级节点,最底层的孩子节点例如
'01020101:巴塞罗那'只能添加同级节点而不能添加下级节点。高手们来看看啊,自己写了写,总是有问题。向大家请教。系统限制帖子最高只能给到100分,请大家见谅。
我在问题一开始就把数据库结构给出了,两个字段,cCode,cName
procedure BuildTree(TreeView: TTreeView; Query: TADOQuery);
var
I: Integer;
PNodes: array[0..1024] of TTreeNode; //最多级别
PID: String;
ALevel: Integer;
begin
TreeView.Items.Clear;
for I := Low(PNodes) to High(PNodes) do PNodes[I] := nil;
PNodes[0] := TreeView.Items.AddFirst(nil,'货品类别'); with Query, TreeView, Items do
begin
Close;
Open;
BeginUpdate;
try
while not Eof do
begin
Application.ProcessMessages;
PID := FieldByName('Code').AsString;
ALevel := Length(PID) div 2; //以两位为一个级别
if ALevel - 1 > High(PNodes) then Continue;
PNodes[ALevel] := AddChild(PNodes[ALevel-1],FieldByName('Code').AsString + '.' + FieldByName('Name').AsString);
Next;
end;
finally
EndUpdate;
Close;
end;
end;
end;
procedure BuildTree(TreeView: TTreeView; Query: TADOQuery);
var
I: Integer;
PNodes: array[0..1024] of TTreeNode; //最多级别
PID: String;
ALevel: Integer;
begin
TreeView.Items.Clear;
for I := Low(PNodes) to High(PNodes) do PNodes[I] := nil;
with Query, TreeView, Items do
begin
Close;
Open;
BeginUpdate;
try
while not Eof do
begin
Application.ProcessMessages;
PID := FieldByName('Code').AsString;
ALevel := Length(PID) div 2; //以两位为一个级别
if ALevel - 1 > High(PNodes) then Continue;
PNodes[ALevel] := AddChild(PNodes[ALevel-1],FieldByName('cCode').AsString + '.' + FieldByName('cName').AsString);
Next;
end;
finally
EndUpdate;
Close;
end;
end;
end;添加的时候做一下判断,可以根据Items.Level来判断,如果为0的话,就不能增加同级,
如果是3的话,就是最后一级就不能增加下一级.
增加时要做两个动作,一个是增加到数据库,另外一个通过AddChild增加到TreeView记得要根据cCode排序.
添加:(沒涉及第一层和最后一层的問題)
if treeview1.Selected<>nil then
treeview1.Items.AddChild(treeview1.Selected,edit1.text)
else
treeview1.Items.Add(nil,edit1.Text);
treeview1.Selected:=nil;
修改:
treeview1.Selected.Text:=edit1.Text
你比我聰明多了,我原來想的是兩字段,cName和tName,cName存自己的名字,tName存父节点的名字,兩個相同時,就是是根节点,然后一层层遍立的,你的方法比我的好多了。呵呵。
请问
for I := Low(PNodes) to High(PNodes) do PNodes[I] := nil;
这句是在做什么操作?将所有的PNodes赋空值?
查询是按cCode,len(cCode)排序