FolderNameEditor.FolderBrowser with FolderBrowserStyles.ShowTextBox - автоматически создает новую папку из TextBox.Text - PullRequest
1 голос
/ 21 сентября 2011

Я показываю FolderBrowser пользователю в моем приложении, а затем продвигаю его с помощью ShowDialog (), который имеет m_dialog.Style = FolderBrowserStyles.ShowTextBox; Таким образом, пользователь может вручную ввести путь к папке, которую он хочет выбрать.

Проблема заключается в том, что когда пользователь вводит путь к несуществующей папке и нажимает кнопку ОК, диалоговое окно возвращается с некоторым значением по умолчанию DirectoryPath. То, что мне нужно, - это создать выбранную папку (если она не существует и сначала продвигать пользователя), а затем иметь (теперь действительный) путь в свойстве DirectoryPath.

Есть ли способ сделать это?

1 Ответ

1 голос
/ 21 сентября 2011

Класс FolderNameEditor.FolderBrowser использует функцию оболочки SHBrowseForFolder . Функциональность по умолчанию, основанная на вводе пользователем неверного пути, заключается в возврате выбранного по умолчанию элемента (который в данном случае является папкой рабочего стола).

Функция оболочки SHBrowseForFolder ожидает аргумент типа BROWSEINFO (структура).

Эта структура позволяет определять функцию обратного вызова (указатель на определенную приложением функцию, которую диалоговое окно вызывает при возникновении события), и именно в этом обратном вызове существует вероятность достижения того, что вам требуется.

Эта функция обратного вызова устанавливается в ноль, когда FolderBrowser вызывает эту функцию оболочки, поэтому нет никакого способа достичь того, что вам нужно, с помощью класса 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;
    }
}

Надеюсь, это поможет.

...