65.9K
CodeProject 正在变化。 阅读更多。
Home

文件夹选择对话框

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.46/5 (13投票s)

2002年1月2日

3分钟阅读

viewsIcon

354875

downloadIcon

4718

一篇关于如何使用 .NET TreeView 和 Directory Info 对象来构建文件夹选择对话框的文章。

Folder Select Dialog

引言

本文介绍使用 C# 实现一个简单的文件夹选择对话框。在设计我的最新项目之后,我发现需要一个简单易于实现的 C# 文件夹选择对话框。 OpenFileDialog 类不适合我的需求,而且集成 COM 接口到 SHBrowseForFolder 比我在此提供的解决方案稍微复杂一些。

基本的对话框是使用标准的 winform 架构构建的。 通过修改窗口样式,您可以使对话框显示为标准的 Windows 对话框,或者显示为可调整大小的窗口,这是此示例的默认设置。 此示例是使用 Visual Studio .Net beta 2 组合在一起的,并且 IDE 用于构建 UI 的基本功能。

实现

此对话框中使用三个事件,OnBeforeSelect, OnBeforeExpand,OnButtonClick. 第一个事件是由 TreeView 控件生成的。 OnBeforeSelectOnBeforeExpand 事件都执行类似的任务。 每次用户选择文件夹或单击以展开树节点时,都会触发这些事件,并且在收到这些事件后,将扫描由 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 应用程序方面的专家,至少现在还不是。 请将您的意见和建议发送给我。 我会尽力改进这个应用程序并添加一些更高级的功能。

© . All rights reserved.