c# - I am getting duplicate nodes on a treeview -
i trying create ftp program treeview control show local files. whenever close , reopen node, duplicates list of files , folders. know why happening, not sure how fix issue. occurs because when reopening node runs tvlocal_beforeexpand code each time.
{ initializecomponent(); } fileexplorer fe = new fileexplorer(); string strlocalfolder = string.empty; string strremotehost = string.empty; private void frmmain_load(object sender, eventargs e) { fe.createtree(tvlocal); } private void tvlocal_beforeexpand(object sender, treeviewcanceleventargs e) { treenode node = fe.enumeratedirectory(e.node); } i using following class:
using system; using system.collections.generic; using system.text; using system.windows.forms; using system.io; using system.drawing; using microsoft.visualbasic.fileio; namespace fileexplorer_treeview { /* class :fileexplorer * author : chandana subasinghe * date : 10/03/2006 * discription : class use create tree view , load * directories , files in tree * */ class fileexplorer { public fileexplorer() { } /* method :createtree * author : chandana subasinghe * date : 10/03/2006 * discription : use creat , build tree * */ public bool createtree(treeview treeview) { bool returnvalue = false; try { // create desktop treenode desktop = new treenode(); desktop.text = "desktop"; desktop.tag = "desktop"; desktop.nodes.add(""); treeview.nodes.add(desktop); // driveinfo foreach (driveinfo drv in driveinfo.getdrives()) { treenode fchild = new treenode(); if (drv.drivetype == drivetype.cdrom) { fchild.imageindex = 1; fchild.selectedimageindex = 1; } else if (drv.drivetype == drivetype.fixed) { fchild.imageindex = 0; fchild.selectedimageindex = 0; } fchild.text = drv.name; fchild.nodes.add(""); treeview.nodes.add(fchild); returnvalue = true; } } catch (exception ex) { returnvalue = false; } return returnvalue; } /* method :enumeratedirectory * author : chandana subasinghe * date : 10/03/2006 * discription : use enumerate directories , files * */ public treenode enumeratedirectory(treenode parentnode) { try { directoryinfo rootdir; // fill desktop char [] arr={'\\'}; string [] namelist=parentnode.fullpath.split(arr); string path = ""; if (namelist.getvalue(0).tostring() == "desktop") { path = specialdirectories.desktop+"\\"; (int = 1; < namelist.length; i++) { path = path + namelist[i] + "\\"; } rootdir = new directoryinfo(path); } // other directories else { rootdir = new directoryinfo(parentnode.fullpath + "\\"); } parentnode.nodes[0].remove(); foreach (directoryinfo dir in rootdir.getdirectories()) { treenode node = new treenode(); node.text = dir.name; node.nodes.add(""); parentnode.nodes.add(node); } //fill files foreach (fileinfo file in rootdir.getfiles()) { treenode node = new treenode(); node.text = file.name; node.imageindex = 2; node.selectedimageindex = 2; parentnode.nodes.add(node); } } catch (exception ex) { //todo : } return parentnode; } } }
based on code in createtree , enumeratedirectory when add new nodes, seems me nodes have not been expanded yet have single child node has empty text. can use information determine if need expand again:
private void tvlocal_beforeexpand(object sender, treeviewcanceleventargs e) { bool never_expanded = e.node.nodes.count == 1 && e.node.nodes[0].text == ""; if(never_expanded) { treenode node = fe.enumeratedirectory(e.node); } } by way, don't seem use return value (treenode node). if case, can remove , invoke fe.enumeratedirectory(e.node);
Comments
Post a Comment