Définir l'emplacement de départ de la boîte de dialogue du navigateur de dossiers


113

Existe-t-il un moyen de définir le répertoire initial d'une boîte de dialogue de navigateur de dossier sur un dossier non spécial? C'est ce que j'utilise actuellement

fdbLocation.RootFolder = Environment.SpecialFolder.Desktop;
mais je veux utiliser un chemin que j'ai stocké dans une chaîne quelque chose comme ça
fdbLocation.RootFolder = myFolder;
Cela provoque une erreur "Impossible de convertir" chaîne "en" System.Environment.SpecialFolder "".

Réponses:


188

Définissez simplement la propriété SelectedPath avant d'appeler ShowDialog.

fdbLocation.SelectedPath = myFolder;

20
Notez qu'il est nécessaire de définir RootFoldersur Environment.SpecialFolder.Desktopou cela peut ne pas fonctionner.
Mike Lowery

3
Voir la réponse de Chad Grants ci-dessous: Il explique à juste titre que le RootFolder doit être défini et que SelectedPath doit être en dessous de ce RootFolder pour fonctionner.
Dr Snooze

3
Cela fonctionne pour moi, mais cela ne met pas l'accent sur le dossier. Je dois faire défiler manuellement vers le bas et trouver le dossier par défaut. Existe-t-il un moyen de régler automatiquement la mise au point lorsqu'il est affiché?
JoBaxter le

2
Ce n'est cependant pas la même chose que le réglage RootFolder. Si RootFolderest défini, seuls le dossier spécifié et tous les sous-dossiers qui se trouvent en dessous apparaîtront dans la boîte de dialogue. SelectedPathprésélectionne simplement le chemin donné.
Jan Gassen

30

Définissez la propriété SelectedPath avant d'appeler ShowDialog ...

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

Les démarrera à C: \ Temp


Est-il nécessaire de définir RootFolder ( SelectedPath is set to an absolute path that is a subfolder of RootFolder)? Comportement tel quel : Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)renvoie C: \ Users \ Myusername \ Desktop. L'utilisation de code d'emprunt d'identité (avec LogonType LOGON32_LOGON_INTERACTIVE) renvoie une chaîne vide
Kiquenet

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

"Si la propriété SelectedPath est définie avant d'afficher la boîte de dialogue, le dossier avec ce chemin sera le dossier sélectionné, tant que SelectedPath est défini sur un chemin absolu qui est un sous-dossier de RootFolder (ou plus précisément, pointe vers un sous-dossier de l'espace de noms du shell représenté par RootFolder). "

MSDN - Chemin sélectionné

"La méthode GetFolderPath renvoie les emplacements associés à cette énumération. Les emplacements de ces dossiers peuvent avoir des valeurs différentes sur différents systèmes d'exploitation, l'utilisateur peut modifier certains emplacements et les emplacements sont localisés."

Re: Desktop vs DesktopDirectory

Bureau

"Le bureau logique plutôt que l'emplacement physique du système de fichiers."

DesktopDirectory:

"Le répertoire utilisé pour stocker physiquement les objets fichier sur le bureau. Ne confondez pas ce répertoire avec le dossier du bureau lui-même, qui est un dossier virtuel."

MSDN - Enum de dossier spécial

MSDN - GetFolderPath


Pour les chemins spéciaux, vous pouvez faire {{fldrDialog.RootFolder = Environment.SpecialFolder.DesktopDirectory}}
tymtam

Parfait. Je vous remercie. La clé est que SelectedPath doit être sous le RootFolder si la boîte de dialogue doit pointer vers SelectedPath lors de son ouverture.
Dr Snooze

Comportement tel quel : Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)renvoie C: \ Users \ Myusername \ Desktop. L'utilisation de code d'emprunt d'identité (avec LogonType LOGON32_LOGON_INTERACTIVE) renvoie une chaîne vide
Kiquenet

9

Pour définir le chemin du répertoire sélectionné et récupérer le nouveau répertoire:

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

2

Trouvée sur dotnet-snippets.de

Avec réflexion, cela fonctionne et définit le vrai 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

    }
}

Une idée comment développer et réduire l'élément de dossier prédéfini?
Goodies

J'ai voté pour et j'aime cette réponse, mais !! il convient de noter que l'utilisateur ne pourra pas naviguer plus haut que ce que ce dossier racine est défini, selon msdn: docs.microsoft.com/en-us/windows/win32/shell/… . Le travail autour que j'ai utilisé est simple, utilisez le .net FolderBrowser par défaut, définissez le dossier spécial sur MyComputer, puis définissez le chemin sélectionné. cela élargira également les dossiers jusqu'au répertoire du chemin sélectionné, mais ne fera PAS défiler jusqu'à celui-ci.
Heriberto Lugo

0

Dans mon cas, c'était une double fuite accidentelle.

cela marche:

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

ce n'est pas:

SelectedPath = @"C:\\Program Files\\My Company\\My product";
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.