Встановити місце запуску діалогового вікна браузера папок


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, щоб працювати.
— Д-р Снуз

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. За допомогою імперсонального коду (з LogonType LOGON32_LOGON_INTERACTIVE) повертається порожня рядок
— Kiquenet

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

"Якщо властивість SelectedPath встановлено перед показом діалогового вікна, папка з цим контуром буде вибраною папкою, доки SelectedPath встановлений на абсолютний шлях, який є підпапком RootFolder (або точніше, вказує на підпапку простір імен оболонки, представлений RootFolder). "

MSDN - вибраний шлях

"Метод GetFolderPath повертає місця, пов'язані з цим перерахуванням. Місцеположення цих папок може мати різні значення в різних операційних системах, користувач може змінювати деякі місця, а місця локалізації."

Re: Desktop проти DesktopDirectory

Настільний

"Логічний робочий стіл, а не фізичне розташування файлової системи."

DesktopDirectory:

"Каталог, який використовується для фізичного зберігання файлових об'єктів на робочому столі. Не плутайте цей каталог із самою папкою робочого столу, яка є віртуальною папкою."

MSDN - спеціальна папка Enum

MSDN - GetFolderPath


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

Ідеально. Дякую. Ключовим є той факт, що SelectedPath повинен знаходитися нижче RootFolder, якщо діалогове вікно має вказувати на SelectedPath, коли воно відкриється.
— Д-р Снуз

Поведінка як є: Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)повертає C: \ Users \ Myusername \ Desktop. За допомогою імперсонального коду (з 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.