文件夹选择对话框






4.46/5 (13投票s)
2002年1月2日
3分钟阅读

354875

4718
一篇关于如何使用 .NET TreeView 和 Directory Info 对象来构建文件夹选择对话框的文章。
引言
本文介绍使用 C# 实现一个简单的文件夹选择对话框。在设计我的最新项目之后,我发现需要一个简单易于实现的 C# 文件夹选择对话框。 OpenFileDialog
类不适合我的需求,而且集成 COM 接口到 SHBrowseForFolder
比我在此提供的解决方案稍微复杂一些。
基本的对话框是使用标准的 winform 架构构建的。 通过修改窗口样式,您可以使对话框显示为标准的 Windows 对话框,或者显示为可调整大小的窗口,这是此示例的默认设置。 此示例是使用 Visual Studio .Net beta 2 组合在一起的,并且 IDE 用于构建 UI 的基本功能。
实现
此对话框中使用三个事件,OnBeforeSelect, OnBeforeExpand,
和 OnButtonClick.
第一个事件是由 TreeView 控件生成的。 OnBeforeSelect
和 OnBeforeExpand
事件都执行类似的任务。 每次用户选择文件夹或单击以展开树节点时,都会触发这些事件,并且在收到这些事件后,将扫描由 TreeViewCancelEventArgs
类中的 Node 参数标识的选定节点。
private void treeView1_BeforeSelect(object sender,
System.Windows.Forms.TreeViewCancelEventArgs e)
{
getSubDirs(e.Node); // get the sub-folders for the selected node.
textBox1.Text = fixPath(e.Node); // update the user selection text box.
folder = new DirectoryInfo(e.Node.FullPath); // get it's Directory info.
}
private void treeView1_BeforeExpand(object sender,
System.Windows.Forms.TreeViewCancelEventArgs e)
{
getSubDirs(e.Node); // get the sub-folders for the selected node.
textBox1.Text = fixPath(e.Node); // update the user selection text box.
folder = new DirectoryInfo(e.Node.FullPath); // get it's Directory info.
}
文件夹选择树构建
两个事件处理程序都调用一个名为 getSubDirs()
的子方法。 此方法将扫描给定文件夹的任何子文件夹。 如果之前已访问过此文件夹,则不会进行扫描,因为它已输入到树控件中。 请注意,这确实意味着如果您正在检查的硬盘驱动器上的目录结构发生更改,则在重新打开该对话框之前,它不会反映在对话框中。 当用户导航到文件夹时,TreeView 控件存储构建用户选择的文件夹的完整路径所需的数据。 当使用“选择”按钮关闭对话框时,将使用在创建此类的新实例时检索到的 DirectoryInfo 信息加载 DirectoryInfo 变量“folder”。 文件夹信息存储起来,以便应用程序以后访问。
private void getSubDirs( TreeNode parent )
{
DirectoryInfo directory;
try
{
if ( parent.Nodes.Count == 0 )
{
directory = new DirectoryInfo(parent.FullPath);
foreach( DirectoryInfo dir in directory.GetDirectories())
{
TreeNode newNode = new TreeNode(dir.Name);
parent.Nodes.Add(newNode);
}
}
foreach(TreeNode node in parent.Nodes)
{
if (node.Nodes.Count == 0)
{
directory = new DirectoryInfo(node.FullPath);
foreach( DirectoryInfo dir in directory.GetDirectories())
{
TreeNode newNode = new TreeNode(dir.Name);
node.Nodes.Add(newNode);
}
}
}
}
catch( Exception doh )
{
Console.WriteLine(doh.Message);
}
}
文件夹选择属性
使用“选择”按钮关闭文件夹选择对话框后,您的应用程序可以通过调用公共属性 fullPath, name,
和 info
来检索文件夹信息。 这些属性将允许轻松检索 DirectoryInfo
类中存储的任何信息。
public string name
{
get { return ((folder != null && folder.Exists))? folder.Name : null; }
}
public string fullPath
{
get { return ((folder != null && folder.Exists &&
treeView1.SelectedNode != null))? fixPath(treeView1.SelectedNode) : null; }
}
public DirectoryInfo info
{
get { return ((folder != null && folder.Exists))? folder : null; }
}
实现细节
访问属性时,您会注意到我们调用了一个私有方法 fixPath()
来纠正我在构建树时发现的一个问题。 treeView 仅适用于以下示例中构建的路径。“c:\\Program Files\Microsoft\...”。 这个 fixPath()
所做的是去除驱动器盘符旁边的第一个“\\”,并将其替换为单个“\”。 这应该与 UNC 名称兼容,因为我们希望在字符串的开头有一个驱动器盘符才能纠正该问题。
private string fixPath( TreeNode node )
{
string sRet = "";
try
{
sRet = node.FullPath;
int index = sRet.IndexOf("\\\\");
if (index > 1 )
{
sRet = node.FullPath.Remove(index, 1);
}
}
catch( Exception doh )
{
Console.WriteLine(doh.Message);
}
return sRet;
}
对话框调用代码
这是一个调用文件夹选择对话框的示例。
// invoke the folder select dialog
private void button1_Click(object sender, System.EventArgs e)
{
try
{
FolderSelect dlg = new FolderSelect();
if ( dlg.ShowDialog() == DialogResult.OK)
{
DirectoryInfo info = dlg.info;
textBox1.Text = dlg.fullPath;
// extract the directory info.
string [] strArray = new string[4];
strArray[0] = "Creation Time : "+ info.CreationTime.ToString();
strArray[1] = "Full Name : "+ info.FullName;
strArray[2] = "Last Access Time : "+ info.LastAccessTime.ToString();
strArray[3] = "Last Write Time : "+ info.LastWriteTime.ToString();
textBox3.Lines = strArray;
}
}
catch( Exception err)
{
Console.WriteLine(err.Message);
}
}
摘要
这只是一个非常简单的 Windows 窗体对话框。 这应该为您提供一个构建的起点。 我不是 C# 或 Forms 应用程序方面的专家,至少现在还不是。 请将您的意见和建议发送给我。 我会尽力改进这个应用程序并添加一些更高级的功能。