这就是我将节点添加到TreeNode的方式:
private int total_dirs;
private int searched_until_now_dirs;
private int max_percentage;
private TreeNode directories_real_time;
private string SummaryText;
private TreeNode CreateDirectoryNode(string path, string name , int recursive_levl )
{
var directoryNode = new TreeNode(name);
var directoryListing = GetDirectoryListing(path);
var directories = directoryListing.Where(d => d.IsDirectory);
var files = directoryListing.Where(d => !d.IsDirectory);
total_dirs += directories.Count<FTPListDetail>();
searched_until_now_dirs++;
int percentage;
foreach (var dir in directories)
{
directoryNode.Nodes.Add(CreateDirectoryNode(dir.FullPath, dir.Name, recursive_levl+1));
if (recursive_levl == 1)
{
TreeNode temp_tn = (TreeNode)directoryNode.Clone();
this.BeginInvoke(new MethodInvoker( delegate
{
UpdateList(temp_tn);
}));
}
percentage = (searched_until_now_dirs * 100) / total_dirs;
if (percentage > max_percentage)
{
SummaryText = String.Format("Searched dirs {0} / Total dirs {1}", searched_until_now_dirs, total_dirs);
max_percentage = percentage;
backgroundWorker1.ReportProgress(percentage, SummaryText);
}
}
percentage = (searched_until_now_dirs * 100) / total_dirs;
if (percentage > max_percentage)
{
SummaryText = String.Format("Searched dirs {0} / Total dirs {1}", searched_until_now_dirs, total_dirs);
max_percentage = percentage;
backgroundWorker1.ReportProgress(percentage, SummaryText);
}
foreach (var file in files)
{
directoryNode.Nodes.Add(new TreeNode(file.Name));
numberOfFiles.Add(file.FullPath);
}
return directoryNode;
}
然后我正在更新treeView1:
DateTime last_update;
private void UpdateList(TreeNode tn_rt)
{
TimeSpan ts = DateTime.Now - last_update;
if (ts.TotalMilliseconds > 200)
{
treeView1.BeginUpdate();
treeView1.Nodes.Clear();
treeView1.Nodes.Add(tn_rt);
TreeViewXmlPopulation.SerializeTreeView(treeView1, @"c:\XmlFile\Test.xml");
ExpandToLevel(treeView1.Nodes, 1);
treeView1.EndUpdate();
}
}
最后,当我看到treeView1中的目录和文件结构时,我想知道当我用鼠标选择项目时,如果它是目录或文件。
treeView1中的目录和文件是从我的ftp服务器获取的。
例如,如果我点击A我想知道我选择了一个目录,如果我点击install.exe我想知道它是一个文件。
这是我在treeView1中选择项目的方式:
private void treeView1_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
treeView1.SelectedNode = treeView1.GetNodeAt(e.X, e.Y);
if (treeView1.SelectedNode != null)
{
menuStrip.Show(treeView1, e.Location);
}
}
}
我有一个带有选项的上下文菜单条:
private void menuStrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
if (e.ClickedItem.Text == "Delete")
{
Delete(treeView1.SelectedNode.FullPath);
}
}
在FullPath中,它可以只是一个文件,也可以是包含或不包含文件的目录名。 我怎么知道它是文件还是目录?在Delete方法中,我想决定如果它是一个文件该怎么办,然后删除一个文件,如果它是一个目录,那么做其他事情。
我想使用Tag属性但不确定如何使用它。我尝试在CreateDirectoryNode中添加:
directoryNode.Tag = directoryNode.Nodes;
但我不确定这是否是正确的方法,以及如何使用标签以确定它是文件还是目录。
答案 0 :(得分:1)
标签是可以的,因为默认情况下它是未使用的prpoerty,它实际上是一个属性,不会被滥用。类型是对象。所以它需要一切。但是你必须小心谨慎地把东西放进去并正确地找回它。
最好的方法是在标记内部保存一个列表,该列表包含两列,类型和引用。 但是对于你的情况,只需将节点放入标签中,然后通过适当的转换将其检索到本地对象中。 顺便说一句,你也可能想要按需加载子目录,以便检查它是文件还是目录。 这可以优化性能。
答案 1 :(得分:1)
这是我的解决方案:
首先将root保存为完整目录(直接在名称或后台的某些字符串中)
第二,点击某个节点后,获取其全名node.FullPath
这样你就得到一个字符串,它是这个节点所代表的完整路径(文件目录)
现在正如 Scott Nimrod 所有已经检查过它是使用文件还是目录
!System.IO.Directory.Exists(node.FullPath) //==> yep this is a file
看一下这个例子(来自我的项目,迭代迭代并创建一个树)
此示例将迭代并查找特殊扩展
public TreeNode RecursiveDirToTree(TreeNode parentNode, string path,
string extension = ".txt")
{
var result = new TreeNode(parentNode == null ? path/*base line*/ : System.IO.Path.GetFileName(path));
foreach (string dir in System.IO.Directory.GetDirectories(path))
{
TreeNode node = RecursiveDirToTree(result, dir , extension);
if (node.Nodes.Count > 0)
{
result.Nodes.Add(node);
}
}
foreach (string file in System.IO.Directory.GetFiles(path))
{
if (System.IO.Path.GetExtension(file).ToLower() == extension.ToLower())
{
result.Nodes.Add(System.IO.Path.GetFileName(file));
}
}
return result;
}
答案 2 :(得分:0)
File.Exists和Directory.Exists