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


113

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

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

Ответы:


188

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

fdbLocation.SelectedPath = myFolder;

20
Обратите внимание , что это необходимо , чтобы набор RootFolderдля Environment.SpecialFolder.Desktopэтого может не работать.
— Майк Лоури

3
См. Ответ Чада Гранта ниже: он правильно объясняет, что RootFolder должен быть установлен, а SelectedPath должен быть ниже этого RootFolder, чтобы работать.
— Dr Snooze

3
Это работает для меня, но не устанавливает фокус на папку. Мне нужно вручную прокрутить вниз и найти папку, в которой он был по умолчанию. Есть ли способ, чтобы он автоматически устанавливал фокус при отображении?
— JoBaxter

2
Однако это не то же самое, что настройка RootFolder. Если RootFolderустановлено, в диалоговом окне будут отображаться только указанная папка и все подпапки, находящиеся под ней. SelectedPathпросто предварительно выбирает данный путь.
— Ян Гассен

30

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

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

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


Требуется установить RootFolder ( SelectedPath is set to an absolute path that is a subfolder of RootFolder)? Поведение как есть: Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)возвращает C: \ Users \ Myusername \ Desktop. Использование кода Impersonate (с LogonType LOGON32_LOGON_INTERACTIVE) возвращает пустую строку
— Kiquenet

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

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

MSDN - SelectedPath

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

Re: Рабочий стол против DesktopDirectory

Рабочий стол

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

DesktopDirectory:

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

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

MSDN - GetFolderPath


Для специальных путей вы можете сделать {{fldrDialog.RootFolder = Environment.SpecialFolder.DesktopDirectory}}
— tymtam

Отлично. Спасибо. Ключ в том, что SelectedPath должен находиться ниже RootFolder, если диалоговое окно должно указывать на SelectedPath при его открытии.
— Dr Snooze

Поведение как есть: Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)возвращает C: \ Users \ Myusername \ Desktop. Использование кода Impersonate (с LogonType LOGON32_LOGON_INTERACTIVE) возвращает пустую строку
— Kiquenet

9

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

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

2

Найдено на 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

    }
}

Есть идеи, как развернуть и свернуть элемент предустановленной папки?
— Goodies

Я поддержал и понравился этот ответ, но !! Следует отметить, что, согласно msdn : docs.microsoft.com/en-us/windows/win32/shell/…, пользователь не сможет просматривать больше, чем установлено для этой корневой папки . Обход, который я использовал, прост: используйте .net FolderBrowser по умолчанию, установите специальную папку на MyComputer, затем установите выбранный путь. это также расширит папки до выбранного каталога пути, но НЕ будет прокручиваться до него.
— Эриберто Луго

0

В моем случае это был случайный двойной побег.

это работает:

SelectedPath = @"C:\Program Files\My Company\My product";

это не так:

SelectedPath = @"C:\\Program Files\\My Company\\My product";
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.