C# 如何使用treeView 列出目录和子目录而不显示根目录?
C# How to use treeView to list the directories and subdirectories without showing the root directory?
来自
main folder
|_a
| |_b
| |_c
|_d
|_e
到
a
|_b
|_c
d
e
我想要一个没有主文件夹的树视图。我找到了一个解决方案 here,但它似乎非常慢。当我第一次启动程序时,需要一分钟多的时间来加载它。没有该代码,它会立即打开。
那么,你知道为什么要改进这段代码或其他更好的代码吗?
编辑:已解决。
试试这个,它看起来真的很快。您可以控制是否展开所有节点。您需要包含 LINQ namspace (using System.Linq;
)
// somewhere:
string yourRoot = "D:\";
treeView1.Nodes.AddRange(getFolderNodes(yourRoot, true).ToArray());
private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
{
TreeNode tn = e.Node.Nodes[0];
if (tn.Text == "...")
{
e.Node.Nodes.AddRange(getFolderNodes(((DirectoryInfo)e.Node.Tag)
.FullName, true).ToArray());
if (tn.Text == "...") tn.Parent.Nodes.Remove(tn);
}
}
List<TreeNode> getFolderNodes(string dir, bool expanded)
{
var dirs = Directory.GetDirectories(dir).ToArray();
var nodes = new List<TreeNode>();
foreach (string d in dirs)
{
DirectoryInfo di = new DirectoryInfo(d);
TreeNode tn = new TreeNode(di.Name);
tn.Tag = di;
int subCount = 0;
try { subCount = Directory.GetDirectories(d).Count(); }
catch { /* ignore accessdenied */ }
if (subCount > 0) tn.Nodes.Add("...");
if (expanded) tn.Expand(); // **
nodes.Add(tn);
}
return nodes;
}
如果您确定始终希望看到从一开始就展开的所有级别,您可以使用此功能并删除 BeforeExpand
代码:
List<TreeNode> getAllFolderNodes(string dir)
{
var dirs = Directory.GetDirectories(dir).ToArray();
var nodes = new List<TreeNode>();
foreach (string d in dirs)
{
DirectoryInfo di = new DirectoryInfo(d);
TreeNode tn = new TreeNode(di.Name);
tn.Tag = di;
int subCount = 0;
try { subCount = Directory.GetDirectories(d).Count(); }
catch { /* ignore accessdenied */ }
if (subCount > 0)
{
var subNodes = getAllFolderNodes(di.FullName);
tn.Nodes.AddRange(subNodes.ToArray());
}
nodes.Add(tn);
}
return nodes;
}
你像以前一样称呼它:
string yourRoot = "D:\";
Cursor.Current = Cursors.WaitCursor;
treeView1.Nodes.AddRange(getAllFolderNodes(yourRoot).ToArray());
Cursor.Current = Cursors.Default;
来自
main folder
|_a
| |_b
| |_c
|_d
|_e
到
a
|_b
|_c
d
e
我想要一个没有主文件夹的树视图。我找到了一个解决方案 here,但它似乎非常慢。当我第一次启动程序时,需要一分钟多的时间来加载它。没有该代码,它会立即打开。
那么,你知道为什么要改进这段代码或其他更好的代码吗?
编辑:已解决。
试试这个,它看起来真的很快。您可以控制是否展开所有节点。您需要包含 LINQ namspace (using System.Linq;
)
// somewhere:
string yourRoot = "D:\";
treeView1.Nodes.AddRange(getFolderNodes(yourRoot, true).ToArray());
private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
{
TreeNode tn = e.Node.Nodes[0];
if (tn.Text == "...")
{
e.Node.Nodes.AddRange(getFolderNodes(((DirectoryInfo)e.Node.Tag)
.FullName, true).ToArray());
if (tn.Text == "...") tn.Parent.Nodes.Remove(tn);
}
}
List<TreeNode> getFolderNodes(string dir, bool expanded)
{
var dirs = Directory.GetDirectories(dir).ToArray();
var nodes = new List<TreeNode>();
foreach (string d in dirs)
{
DirectoryInfo di = new DirectoryInfo(d);
TreeNode tn = new TreeNode(di.Name);
tn.Tag = di;
int subCount = 0;
try { subCount = Directory.GetDirectories(d).Count(); }
catch { /* ignore accessdenied */ }
if (subCount > 0) tn.Nodes.Add("...");
if (expanded) tn.Expand(); // **
nodes.Add(tn);
}
return nodes;
}
如果您确定始终希望看到从一开始就展开的所有级别,您可以使用此功能并删除 BeforeExpand
代码:
List<TreeNode> getAllFolderNodes(string dir)
{
var dirs = Directory.GetDirectories(dir).ToArray();
var nodes = new List<TreeNode>();
foreach (string d in dirs)
{
DirectoryInfo di = new DirectoryInfo(d);
TreeNode tn = new TreeNode(di.Name);
tn.Tag = di;
int subCount = 0;
try { subCount = Directory.GetDirectories(d).Count(); }
catch { /* ignore accessdenied */ }
if (subCount > 0)
{
var subNodes = getAllFolderNodes(di.FullName);
tn.Nodes.AddRange(subNodes.ToArray());
}
nodes.Add(tn);
}
return nodes;
}
你像以前一样称呼它:
string yourRoot = "D:\";
Cursor.Current = Cursors.WaitCursor;
treeView1.Nodes.AddRange(getAllFolderNodes(yourRoot).ToArray());
Cursor.Current = Cursors.Default;