Imposta la posizione di inizio della finestra di dialogo del browser della cartella


113

C'è un modo per impostare la directory iniziale di una finestra di dialogo del browser di cartelle su una cartella non speciale? Questo è quello che sto usando attualmente

fdbLocation.RootFolder = Environment.SpecialFolder.Desktop;
ma voglio usare un percorso che ho memorizzato in una stringa qualcosa di simile
fdbLocation.RootFolder = myFolder;
Ciò causa un errore "Impossibile convertire" stringa "in" System.Environment.SpecialFolder "".

Risposte:


188

Basta impostare la proprietà SelectedPath prima di chiamare ShowDialog.

fdbLocation.SelectedPath = myFolder;

20
Si noti che è necessario per impostare RootFoldera Environment.SpecialFolder.Desktopo questo potrebbe non funzionare.
Mike Lowery

3
Vedi la risposta di Chad Grants di seguito: Spiega giustamente che RootFolder deve essere impostato e SelectedPath deve essere al di sotto di tale RootFolder per funzionare.
Dr Snooze

3
Questo funziona per me ma non imposta lo stato attivo sulla cartella. Devo scorrere manualmente verso il basso e trovare la cartella in cui è stata impostata per impostazione predefinita. C'è un modo per impostare la messa a fuoco automaticamente quando viene mostrato?
JoBaxter

2
Tuttavia, non è la stessa impostazione RootFolder. Se RootFolderè impostato, nella finestra di dialogo verranno visualizzate solo la cartella specificata e le eventuali sottocartelle sottostanti. SelectedPathsi limita a preselezionare il percorso specificato.
Jan Gassen

30

Impostare la proprietà SelectedPath prima di chiamare ShowDialog ...

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

Li avvierà in C: \ Temp


È necessario impostare RootFolder ( SelectedPath is set to an absolute path that is a subfolder of RootFolder)? Comportamento così com'è: Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)restituisce C: \ Users \ Myusername \ Desktop. L'utilizzo del codice Impersonate (con LogonType LOGON32_LOGON_INTERACTIVE) restituisce una stringa vuota
Kiquenet

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

"Se la proprietà SelectedPath viene impostata prima di visualizzare la finestra di dialogo, la cartella con questo percorso sarà la cartella selezionata, a condizione che SelectedPath sia impostato su un percorso assoluto che è una sottocartella di RootFolder (o più precisamente, punta a una sottocartella di lo spazio dei nomi della shell rappresentato da RootFolder). "

MSDN - SelectedPath

"Il metodo GetFolderPath restituisce i percorsi associati a questa enumerazione. I percorsi di queste cartelle possono avere valori diversi su diversi sistemi operativi, l'utente può modificare alcuni percorsi e i percorsi sono localizzati".

Ri: Desktop vs DesktopDirectory

Desktop

"Il desktop logico anziché il percorso del file system fisico".

desktopDirectory:

"La directory utilizzata per memorizzare fisicamente gli oggetti file sul desktop. Non confondere questa directory con la cartella del desktop stessa, che è una cartella virtuale."

MSDN - Enumerazione cartella speciale

MSDN - GetFolderPath


Per percorsi speciali puoi fare {{fldrDialog.RootFolder = Environment.SpecialFolder.DesktopDirectory}}
tymtam

Perfetto. Grazie. La chiave è che SelectedPath deve essere al di sotto di RootFolder se la finestra di dialogo deve puntare al SelectedPath quando si apre.
Dr Snooze

Comportamento così com'è: Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)restituisce C: \ Users \ Myusername \ Desktop. L'utilizzo di Impersonate code (con LogonType LOGON32_LOGON_INTERACTIVE) restituisce una stringa vuota
Kiquenet

9

Per impostare il percorso della directory selezionata e recuperare la nuova directory:

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

2

Trovato su dotnet-snippets.de

Con la riflessione questo funziona e imposta il vero 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

    }
}

Qualche idea su come espandere e comprimere l'elemento della cartella preimpostata?
Goodies

ho votato positivamente e mi piace questa risposta, ma !! va notato che l'utente non sarà in grado di navigare più in alto di quanto è impostata questa cartella principale, secondo msdn : docs.microsoft.com/en-us/windows/win32/shell/… . Il lavoro che ho usato è semplice, usa il .net FolderBrowser predefinito, imposta la cartella speciale su MyComputer, quindi imposta il percorso selezionato. questo espanderà anche le cartelle fino alla directory del percorso selezionata, ma NON scorrerà fino ad essa.
Heriberto Lugo

0

Nel mio caso, è stata una doppia fuga accidentale.

questo funziona:

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

questo non:

SelectedPath = @"C:\\Program Files\\My Company\\My product";
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.