请教高手关于TreeView的问题(50分)

  • 主题发起人 主题发起人 Delphi小豆
  • 开始时间 开始时间
D

Delphi小豆

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在知道items.text和该item的subitem.text,怎样让这颗树显现为相应的结点被选中的状态,而其他的结点则紧缩显示?
先谢谢了![:)]
 
你的思路有问题,item的text你是没有办法保持它不重复的。
 
在窗体上放一个名为edit1的edit,
下面的方法思路为,1:找到节点,收缩所有节点
2:记录下节点的index的路径,
就是从根结点到目标节点的各节点的index的值,用','分隔
3:根据记录的index的路径,依次从跟节点展开。
程序可能乱了点,凑合着看吧,(delphi6下测试ok)
procedure TForm1.BitBtn1Click(Sender: TObject);
var node,snode:Ttreenode;i,nid:integer;ss,nodepath:string;
first:boolean;
begin
//ss为你要找的节点的text,我这用的是edit1.text,
//treeview1为你要查找节点的树型控件
ss:=edit1.Text;
node:=treeview1.Items.GetFirstNode;
//初始化节点路径字符串
nodepath:=',';
snode:=nil;
//遍历节点查找目标节点
while node<>nil do
begin
if node.Expanded then
node.Expanded:=false;
//找到后把它赋给snode;
if node.Text=ss then
snode:=node;
node:=node.GetNext;
end;
//如果找到目标节点把它的index路径记录在nodepath里,
//用,分隔
while snode<>nil do
begin
nodepath:=','+inttostr(snode.Index)+nodepath;
snode.Expanded:=true;
snode:=snode.Parent;
end;
//如果目标节点路径大于1则找到了节点,没找到时是','
if length(nodepath)>1 then
begin
nodepath:=copy(nodepath,2,length(nodepath));
i:=pos(',',nodepath);
ss:=copy(nodepath,1,i-1);
//设置下面循环的标识
first:=true;
while ss<>'' do
begin
nodepath:=copy(nodepath,i+1,length(nodepath));
//如果是第一次进入循环,则node为根结点
if first then
begin
node:=treeview1.Items[strtoint(ss)];
first:=false;
end
else
//选定路径中的下一个节点
node:=node.Item[strtoint(ss)] ;
//展开节点
node.Expanded:=true;
//取下一个节点的index值
i:=pos(',',nodepath);
ss:=copy(nodepath,1,i-1);
end;
end;
end;
 
把TreeView的AutoExpand属性设为True, 看看是不是你想要的效果[:D]
 
后退
顶部