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


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.