Ustaw lokalizację początkową okna dialogowego przeglądarki folderów


113

Czy istnieje sposób na ustawienie katalogu początkowego okna dialogowego przeglądarki folderów na folder inny niż specjalny? To jest to, czego obecnie używam

fdbLocation.RootFolder = Environment.SpecialFolder.Desktop;
ale chcę użyć ścieżki, którą zapisałem w ciągu podobnym do tego
fdbLocation.RootFolder = myFolder;
Powoduje to błąd „Nie można przekonwertować ciągu znaków na„ System.Environment.SpecialFolder ””.

Odpowiedzi:


188

Po prostu ustaw właściwość SelectedPath przed wywołaniem ShowDialog.

fdbLocation.SelectedPath = myFolder;

20
Zauważ, że nie jest to wymagane do zestawu RootFolderdo Environment.SpecialFolder.Desktopczy to może nie działać.
Mike Lowery

3
Zobacz odpowiedź Chada Grantsa poniżej: Słusznie wyjaśnia, że ​​RootFolder musi być ustawiony, a SelectedPath musi znajdować się poniżej tego RootFolder, aby działał.
Dr Snooze

3
To działa dla mnie, ale nie ustawia fokusu na folder. Muszę ręcznie przewinąć w dół i znaleźć folder, w którym był domyślnie. Czy istnieje sposób, aby automatycznie ustawiał ostrość po wyświetleniu?
JoBaxter

2
To jednak nie to samo, co ustawienie RootFolder. Jeśli RootFolderjest ustawiona, w oknie dialogowym pojawią się tylko określony folder i wszystkie podfoldery, które znajdują się poniżej. SelectedPathjedynie wstępnie wybiera daną ścieżkę.
Jan Gassen

30

Ustaw właściwość SelectedPath przed wywołaniem ShowDialog ...

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

Uruchomi je w C: \ Temp


Czy wymagane jest ustawienie RootFolder ( SelectedPath is set to an absolute path that is a subfolder of RootFolder)? Zachowanie bez zmian : Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)zwraca C: \ Users \ Myusername \ Desktop. Użycie kodu Impersonate (z LogonType LOGON32_LOGON_INTERACTIVE) zwraca pusty ciąg
Kiquenet

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

„Jeśli właściwość SelectedPath jest ustawiona przed wyświetleniem okna dialogowego, folder z tą ścieżką będzie wybranym folderem, o ile SelectedPath jest ustawiona na ścieżkę bezwzględną, która jest podfolderem folderu RootFolder (lub dokładniej wskazuje na podfolder przestrzeń nazw powłoki reprezentowana przez RootFolder). "

MSDN - SelectedPath

„Metoda GetFolderPath zwraca lokalizacje skojarzone z tym wyliczeniem. Lokalizacje tych folderów mogą mieć różne wartości w różnych systemach operacyjnych, użytkownik może zmienić niektóre lokalizacje, a lokalizacje są lokalizowane”.

Re: Desktop vs DesktopDirectory

Pulpit

„Pulpit logiczny zamiast fizycznej lokalizacji systemu plików”.

DesktopDirectory:

„Katalog używany do fizycznego przechowywania obiektów plików na pulpicie. Nie należy mylić tego katalogu z samym folderem na pulpicie, który jest folderem wirtualnym”.

MSDN - wyliczenie specjalnego folderu

MSDN - GetFolderPath


Aby uzyskać specjalne ścieżki, możesz wykonać {{fldrDialog.RootFolder = Environment.SpecialFolder.DesktopDirectory}}
tymtam

Idealny. Dziękuję Ci. Kluczowe jest to, że SelectedPath musi znajdować się poniżej RootFolder, jeśli okno dialogowe ma wskazywać na SelectedPath po otwarciu.
Dr Snooze

Zachowanie bez zmian : Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)zwraca C: \ Users \ Myusername \ Desktop. Używanie kodu personifikacji (z LogonType LOGON32_LOGON_INTERACTIVE) zwraca pusty ciąg
Kiquenet

9

Aby ustawić wybraną ścieżkę katalogu i pobrać nowy katalog:

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

2

Znalezione na dotnet-snippets.de

Dzięki refleksji to działa i ustawia prawdziwy 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

    }
}

Masz pomysł, jak rozwinąć i zwinąć wstępnie ustawiony element folderu?
Goodies

Głosowałem za i lubię tę odpowiedź, ale !! należy zauważyć, że użytkownik nie będzie mógł przeglądać wyżej niż jest ustawiony ten folder główny, zgodnie z msdn: docs.microsoft.com/en-us/windows/win32/shell/… . Obejście, którego użyłem, jest proste, użyj domyślnej przeglądarki .net FolderBrowser, ustaw folder specjalny na Mój komputer, a następnie ustaw wybraną ścieżkę. spowoduje to również rozwinięcie folderów do wybranego katalogu ścieżki, ale NIE przewinie do niego.
Heriberto Lugo

0

W moim przypadku była to przypadkowa podwójna ucieczka.

to działa:

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

to nie:

SelectedPath = @"C:\\Program Files\\My Company\\My product";
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.