Задать местоположение диалогового окна браузера папки

Можно ли установить исходный каталог диалогового окна браузера папок в неспециальную папку? Это то, что я сейчас использую

fdbLocation.RootFolder = Environment.SpecialFolder.Desktop;
, но я хочу использовать путь, который я сохранил в строке, что-то вроде этого
fdbLocation.RootFolder = myFolder;
Это вызывает ошибку "Невозможно преобразовать строку" в "System.Environment.SpecialFolder".

Ответ 1

Просто установите свойство SelectedPath перед вызовом ShowDialog.

fdbLocation.SelectedPath = myFolder;

Ответ 2

Задайте свойство SelectedPath до вызова ShowDialog...

folderBrowserDialog1.SelectedPath = @"c:\temp\";
folderBrowserDialog1.ShowDialog();

Запустит их при C:\Temp

Ответ 3

fldrDialog.SelectedPath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)

"Если свойство SelectedPath установлено перед отображением диалогового окна, папка с этим путем будет выбранной папкой, пока SelectedPath будет установлен в абсолютный путь, который является подпапкой RootFolder (или, точнее, указывает на подпапка пространства имен оболочки, представленная RootFolder).

MSDN - SelectedPath

"Метод GetFolderPath возвращает местоположения, связанные с этим перечислением. Расположение этих папок может иметь разные значения для разных операционных систем, пользователь может изменить некоторые местоположения, а локации локализованы."

Re: Desktop vs DesktopDirectory

Desktop

"Логический рабочий стол, а не физическое расположение файловой системы".

DesktopDirectory:

"Каталог, используемый для физического хранить файлы на рабочем столе. Делать не путайте этот каталог с сама папка рабочего стола, которая является виртуальную папку."

MSDN - специальное перечисление папки

MSDN - GetFolderPath

Ответ 4

Чтобы установить путь к выбранному каталогу и получить новый каталог:

dlgBrowseForLogDirectory.SelectedPath = m_LogDirectory;
if (dlgBrowseForLogDirectory.ShowDialog() == DialogResult.OK)
{
     txtLogDirectory.Text = dlgBrowseForLogDirectory.SelectedPath;
}

Ответ 5

Найдено на dotnet-snippets.de

С отражением это работает и устанавливает настоящий RootFolder!

using System;
using System.Reflection;
using System.Windows.Forms;

namespace YourNamespace
{
    public class RootFolderBrowserDialog
    {

        #region Public Properties

        /// <summary>
        ///   The description of the dialog.
        /// </summary>
        public string Description { get; set; } = "Chose folder...";

        /// <summary>
        ///   The ROOT path!
        /// </summary>
        public string RootPath { get; set; } = "";

        /// <summary>
        ///   The SelectedPath. Here is no initialization possible.
        /// </summary>
        public string SelectedPath { get; private set; } = "";

        #endregion Public Properties

        #region Public Methods

        /// <summary>
        ///   Shows the dialog...
        /// </summary>
        /// <returns>OK, if the user selected a folder or Cancel, if no folder is selected.</returns>
        public DialogResult ShowDialog()
        {
            var shellType = Type.GetTypeFromProgID("Shell.Application");
            var shell = Activator.CreateInstance(shellType);
            var folder = shellType.InvokeMember(
                             "BrowseForFolder", BindingFlags.InvokeMethod, null,
                             shell, new object[] { 0, Description, 0, RootPath, });
            if (folder is null)
            {
                return DialogResult.Cancel;
            }
            else
            {
                var folderSelf = folder.GetType().InvokeMember(
                                     "Self", BindingFlags.GetProperty, null,
                                     folder, null);
                SelectedPath = folderSelf.GetType().InvokeMember(
                                   "Path", BindingFlags.GetProperty, null,
                                   folderSelf, null) as string;
                // maybe ensure that SelectedPath is set
                return DialogResult.OK;
            }
        }

        #endregion Public Methods

    }
}