网上传很开的将目录装入TreeView的三种方法相關問題...
http://www.shangxueba.com/jingyan/86198.html
这是网上传很开的将目录结构装入TreeView控件的三种方法
当然第三种方法很好用,不过实际运行,每当点回上一层父节点时,又会自动添加子节点一次..
点根目录[ROOT]就全部第二层子节点都自动添加一次
这该怎么处理阿!流传到现在好几年头了,没有人修正过
我尝试修正,清空再加入,判断底下子节点相同就不加入...都无法成功
或是有更好用的方式,不要一次全装入,怕拖慢载入速度。
请大神帮个忙吧.. 困扰我三天了 !! treeview C++?Builder 目录 节点
[解决办法]
在点击的时候判断一下,如果被点击的节点下有子节点的话就什么也不干,这样就可以了
[解决办法]
就是添加一行判断:
if(TreeView1->Selected->Count>0){ // 取得选中节点下单层子节点的数量
return;
}
把上面的代码放在最前面就可以了
[解决办法]
BCB的节点在点击时执行代码是要容错的,你试试:
if(
TreeView1->Items->Count<=0
[解决办法]
TreeView1->SelectionCount<=0
[解决办法]
TreeView1->Selected->Count>0
){
return;
}
[解决办法]
这样:
void __fastcall TForm1::TreeView3Changing(TObject *Sender, TTreeNode *Node, bool &AllowChange)
{
Screen->Cursor=crHourGlass;
//Animate1->Active=true;
//防止重复增加节点
if(Node->Count==0){
TSearchRec sr;
AnsiString DirName,DirTmp;
TTreeNode * NodeTmp=Node;
DirName=Node->Text;
//得到完整的路径
for(int I=Node->Level ;I>0 ;I--){
NodeTmp=NodeTmp->Parent;
DirTmp=NodeTmp->Text;
if(DirTmp.SubString(DirTmp.Length(),1)!="\")
DirTmp+="\";
DirName.Insert(DirTmp,0);
}
if(DirName.SubString(DirName.Length(),1)!="\")DirName+="\";
if(FindFirst(DirName+"*.*", faAnyFile, sr) == 0){
do{
if((sr.Attr & faDirectory) && sr.Name!="." && sr.Name!="..")TreeView3->Items->AddChild(Node,sr.Name);
}while(FindNext(sr) == 0);
FindClose(sr);
}
}
Screen->Cursor=crDefault;
//Animate1->Active=false;
}
就是你要的
[解决办法]
DirTmp+="\";
DirName.Insert(DirTmp,0);
}
if(DirName.SubString(DirName.Length(),1)!="\")DirName+="\";
if(FindFirst(DirName+"*.*", faAnyFile, sr) == 0){
do{
if((sr.Attr & faDirectory) && sr.Name!="." && sr.Name!=".."){
TTreeNode * NodeTmp=TreeView3->Items->AddChild(Node,sr.Name);
if(FindFirst(DirName+sr.Name+"\\*.*", faAnyFile, sr1) == 0){
do{
if((sr1.Attr & faDirectory) && sr1.Name!="." && sr1.Name!=".."){
NodeTmp->HasChildren=true;
break;
}
}while(FindNext(sr1) == 0);
}
}
}while(FindNext(sr) == 0);
FindClose(sr);
}
}
Screen->Cursor=crDefault;
//Animate1->Active=false;
}