1

我在我的应用程序中向用户展示了一个 FolderBrowser,然后使用具有 m_dialog.Style = FolderBrowserStyles.ShowTextBox; 的 ShowDialog() 来提升他。因此,允许用户手动输入他想要选择的文件夹的路径。

问题是,当用户为不存在的文件夹键入路径并单击“确定”时,对话框会返回一些默认的 DirectoryPath 值。我想要的是要创建的选定文件夹(如果它不存在,并首先提升用户),然后在 DirectoryPath 属性中拥有(现在有效的)路径。

有什么办法吗?

4

1 回答 1

1

FolderNameEditor.FolderBrowser 类使用SHBrowseForFolder shell 函数。基于用户输入无效路径的默认功能是返回默认选定项目(在本例中为桌面文件夹)。

SHBrowseForFolder shell 函数需要一个BROWSEINFO(结构)类型的参数。

此结构允许定义回调函数(指向应用程序定义函数的指针,当事件发生时对话框调用该函数),并且正是在此回调中,才有可能实现您的要求。

当 FolderBrowser 调用此 shell 函数时,此回调函数设置为 null,因此无法使用 FolderNameEditor 类实现您所需要的。

但是,您可以使用 codeproject 上的一个库,该库使用 SHBrowseForFolder 并包装事件回调,通过事件 (OnValidateFailed) 提供对无效文件夹条目的访问。请参阅:C# 执行 Shell,第 1 部分

在此事件中(经过一些验证(因为用户可以输入任何内容)),您可以使用输入的路径来创建目录。

这是一个例子:

using ShellLib;

...

public class OpenFolderDialog
{
    ShellBrowseForFolderDialog folderDialog;
    string selectedPath;

    public OpenFolderDialog()
    {
        folderDialog = new ShellBrowseForFolderDialog();
        folderDialog.OnValidateFailed += new ShellBrowseForFolderDialog.ValidateFailedHandler(dialog_OnValidateFailed);
    }

    int dialog_OnValidateFailed(ShellBrowseForFolderDialog sender, ShellBrowseForFolderDialog.ValidateFailedEventArgs args)
    {
        selectedPath = args.invalidSel;

        //Use selectedPath here to create the directory.

        return 0;
    }

    public string GetFolder()
    {
        selectedPath = string.Empty;
        folderDialog.ShowDialog();

        return selectedPath == string.Empty ? folderDialog.FullName : selectedPath;
    }
}

希望这可以帮助。

于 2011-09-21T14:33:05.557 回答