TreeView中建立了如下三层树型结构:
—学校1
| |
| —年级1
| | |
| | —班级1
| | |
| | —班级2
| |
| —年级2
| |
| —年级3
|
—学校2
|
—学校3这个结构是根据数据库里面的值动态建立起来的
现在想用3个ComboBox来实现这样一个功能:
ComboBox1,一旦用户下拉这个组合框,就将根节点的名称放入ComboBox1的item中让用户选(也就是学校那一级的所有名称)
用户点中ComboBox1的一个item后(比如学校1),就将第二级节点(也就是学校1下面的所有年级)选出放入ComboBox2的item中
用户点中ComboBox2的一个item后(比如年级1),就将第二级节点(也就是年级1下面的所有班级)选出放入ComboBox3的item中因为如果ComboBox中的item也用数据库查询来加入的话,受网络影响可能会很慢,所以想不通过数据库,直接让ComboBox跟TreeView发生关系来实现上述功能。小弟在ComboBox的OnDropDown事件中,想取treeview1.selected.text这种方法实现,却总做不成功,运行时下拉框一拉下就很快的缩上去。请问有没有方便快捷的方式?最好能提供一个参考的源代码,谢谢
—学校1
| |
| —年级1
| | |
| | —班级1
| | |
| | —班级2
| |
| —年级2
| |
| —年级3
|
—学校2
|
—学校3这个结构是根据数据库里面的值动态建立起来的
现在想用3个ComboBox来实现这样一个功能:
ComboBox1,一旦用户下拉这个组合框,就将根节点的名称放入ComboBox1的item中让用户选(也就是学校那一级的所有名称)
用户点中ComboBox1的一个item后(比如学校1),就将第二级节点(也就是学校1下面的所有年级)选出放入ComboBox2的item中
用户点中ComboBox2的一个item后(比如年级1),就将第二级节点(也就是年级1下面的所有班级)选出放入ComboBox3的item中因为如果ComboBox中的item也用数据库查询来加入的话,受网络影响可能会很慢,所以想不通过数据库,直接让ComboBox跟TreeView发生关系来实现上述功能。小弟在ComboBox的OnDropDown事件中,想取treeview1.selected.text这种方法实现,却总做不成功,运行时下拉框一拉下就很快的缩上去。请问有没有方便快捷的方式?最好能提供一个参考的源代码,谢谢
再在相应的事件中,使用适当的dataset中的数据重新填充相应的comobox即可.这样当然不会再受网络影响了.
当然也可以将相应的信息填入到树结点的Data指针中,但这样你需要先构造一个记录类型(可参看treeview的addobject?帮助中示例)
var
tn:TTreeNode;
begin
tn:=treeview1.Items.GetFirstNode;
while tn<>nil do begin
combobox1.Items.Add (tn.Text);
tn:=tn.getNextSibling;
end;
end;
var
tn:TTreeNode;
begin
tn:=treeview1.Items.GetFirstNode;
while (tn<>nil) and (tn.Text<>combobox1.Text) do
tn:=tn.getNextSibling;if (tn=nil) or (tn.text<>combobox1.Text) then begin
showMessage('Error!');Exit; end;
tn:=tn.getFirstChild;
while tn<>nil do begin
combobox2.Items.Add (tn.Text);
tn:=tn.getNextSibling;
end;end;參考一下
//将第一层节点加入ComboBox1中
procedure TForm1.FormShow(Sender: TObject);
var
rootnode : TTreeNode;
begin
TreeView1.SetFocus;
rootnode:= treeview1.Selected;
ComboBox1.Items.Add(TreeView1.Selected.Text);
while TreeView1.Selected.getNextSibling<>nil do
begin
TreeView1.Selected:= TreeView1.Selected.getNextSibling;
ComboBox1.Items.Add(TreeView1.Selected.Text);
end;
TreeView1.Selected:= rootnode;
end;//按ComboBox1的选择将第二层节点加入ComboBox2中
procedure TForm1.ComboBox1Change(Sender: TObject);
var
rootnode : TTreeNode;
selectnode : TTreeNode;
childnode : TTreeNode;
begin
ComboBox2.Items.Clear;
selectnode:= TreeView1.Selected;
while TreeView1.Selected.getPrevSibling<>nil do
begin
selectnode:= TreeView1.Selected.getPrevSibling;
TreeView1.Selected:= selectnode;
end;
rootnode:= selectnode;
repeat
selectnode:= TreeView1.Selected;
if TreeView1.Selected.getNextSibling<>nil then
TreeView1.Selected:= TreeView1.Selected.getNextSibling
else
TreeView1.Selected:= rootnode;
until selectnode.Text=ComboBox1.Items[ComboBox1.ItemIndex];
//Edit1.Text:= selectnode.Text;
if selectnode.getFirstChild<>nil then
begin
childnode:= selectnode.getFirstChild;
ComboBox2.Items.Add(childnode.Text);
while childnode<>nil do
begin
if childnode.getNextSibling<>nil then
begin
childnode:= childnode.getNextSibling;
ComboBox2.Items.Add(childnode.Text);
end
else
childnode:= nil;
end;
end
else
ComboBox2.Items.Add('');
end;//按照ComboBox1、ComboBox2的选择将第三层节点加入ComboBox3中
procedure TForm1.ComboBox2Change(Sender: TObject);
var
rootnode : TTreeNode;
fathernode : TTreeNode; //供电局
selectnode : TTreeNode; //变电所
childnode : TTreeNode; //计量点
begin
ComboBox3.Items.Clear;
fathernode:= TreeView1.Selected;
while TreeView1.Selected.getPrevSibling<>nil do
begin
fathernode:= TreeView1.Selected.getPrevSibling;
TreeView1.Selected:= fathernode;
end;
rootnode:= fathernode;
repeat
fathernode:= TreeView1.Selected;
if TreeView1.Selected.getNextSibling<>nil then
TreeView1.Selected:= TreeView1.Selected.getNextSibling
else
TreeView1.Selected:= rootnode;
until fathernode.Text=ComboBox1.Items[ComboBox1.ItemIndex]; if fathernode.getFirstChild=nil then
begin
ComboBox3.Items.Add('');
exit;
end
else
selectnode:= fathernode.getFirstChild; rootnode:= selectnode;
if selectnode.Text<>combobox2.Items[ComboBox2.ItemIndex] then
begin
repeat
if selectnode.getNextSibling<>nil then
selectnode:= rootnode
else
selectnode:= selectnode.getNextSibling;
until selectnode.Text=combobox2.Items[ComboBox2.ItemIndex]; if selectnode.getFirstChild=nil then
ComboBox3.Items.Add('')
else
begin
childnode:= selectnode.getFirstChild;
while childnode<>nil do
begin
ComboBox3.Items.Add(childnode.Text);
childnode:= childnode.getNextSibling;
end;
end;
end
else
begin
if selectnode.getFirstChild=nil then
ComboBox3.Items.Add('')
else
begin
childnode:= selectnode.getFirstChild;
while childnode<>nil do
begin
ComboBox3.Items.Add(childnode.Text);
childnode:= childnode.getNextSibling;
end;
end;
end;
end;