Legen Sie den Startspeicherort für den Ordnerbrowser fest


113

Gibt es eine Möglichkeit, das Anfangsverzeichnis eines Ordnerbrowser-Dialogfelds auf einen nicht speziellen Ordner festzulegen? Dies ist, was ich derzeit verwende

fdbLocation.RootFolder = Environment.SpecialFolder.Desktop;
Ich möchte jedoch einen Pfad verwenden, den ich in einer solchen Zeichenfolge gespeichert habe
fdbLocation.RootFolder = myFolder;
Dies führt zu dem Fehler "'Zeichenfolge' kann nicht in 'System.Environment.SpecialFolder' konvertiert werden".

Antworten:


188

Legen Sie einfach die SelectedPath-Eigenschaft fest, bevor Sie ShowDialog aufrufen.

fdbLocation.SelectedPath = myFolder;

20
Beachten Sie, dass die Einstellung RootFolderauf erforderlich ist, da Environment.SpecialFolder.Desktopdies sonst möglicherweise nicht funktioniert.
Mike Lowery

3
Siehe Antwort von Chad Grants unten: Er erklärt zu Recht, dass der RootFolder festgelegt sein muss und der SelectedPath unter diesem RootFolder liegen muss, damit er funktioniert.
Dr. Snooze

3
Dies funktioniert bei mir, setzt jedoch nicht den Fokus auf den Ordner. Ich muss manuell nach unten scrollen und den Ordner finden, auf den es standardmäßig eingestellt ist. Gibt es eine Möglichkeit, den Fokus automatisch einzustellen, wenn er angezeigt wird?
JoBaxter

2
Dies ist jedoch nicht dasselbe wie die Einstellung RootFolder. Wenn RootFolderfestgelegt, werden im Dialogfeld nur der angegebene Ordner und alle darunter liegenden Unterordner angezeigt. SelectedPathwählt lediglich den angegebenen Pfad vor.
Jan Gassen

30

Legen Sie die SelectedPath-Eigenschaft fest, bevor Sie ShowDialog aufrufen ...

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

Startet sie bei C: \ Temp


Ist RootFolder ( SelectedPath is set to an absolute path that is a subfolder of RootFolder) erforderlich ? Verhalten wie: Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)Renditen C: \ Users \ myusername \ Desktop. Die Verwendung von Identitätswechsel-Code (mit LogonType LOGON32_LOGON_INTERACTIVE) gibt eine leere Zeichenfolge zurück
Kiquenet

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

"Wenn die SelectedPath-Eigenschaft festgelegt wird, bevor das Dialogfeld angezeigt wird, ist der Ordner mit diesem Pfad der ausgewählte Ordner, solange SelectedPath auf einen absoluten Pfad festgelegt ist, der ein Unterordner von RootFolder ist (oder genauer auf einen Unterordner von verweist) der durch RootFolder dargestellte Shell-Namespace). "

MSDN - SelectedPath

"Die GetFolderPath-Methode gibt die mit dieser Aufzählung verknüpften Speicherorte zurück. Die Speicherorte dieser Ordner können auf verschiedenen Betriebssystemen unterschiedliche Werte haben, der Benutzer kann einige der Speicherorte ändern und die Speicherorte sind lokalisiert."

Betreff: Desktop vs DesktopDirectory

Desktop

"Der logische Desktop und nicht der physische Dateisystemspeicherort."

DesktopDirectory:

"Das Verzeichnis, in dem Dateiobjekte physisch auf dem Desktop gespeichert werden. Verwechseln Sie dieses Verzeichnis nicht mit dem Desktop-Ordner selbst, bei dem es sich um einen virtuellen Ordner handelt."

MSDN - Special Folder Enum

MSDN - GetFolderPath


Für spezielle Pfade können Sie {{fldrDialog.RootFolder = Environment.SpecialFolder.DesktopDirectory}}
tymtam

Perfekt. Danke dir. Der Schlüssel ist, dass sich der SelectedPath unter dem RootFolder befinden muss, wenn das Dialogfeld beim Öffnen auf den SelectedPath zeigen soll.
Dr. Snooze

Verhalten wie: Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)Renditen C: \ Users \ myusername \ Desktop. Die Verwendung von Identitätswechsel-Code (mit LogonType LOGON32_LOGON_INTERACTIVE) gibt eine leere Zeichenfolge zurück
Kiquenet

9

So legen Sie den ausgewählten Verzeichnispfad fest und rufen das neue Verzeichnis ab:

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

2

Gefunden auf dotnet-snippets.de

Mit Reflexion funktioniert das und setzt den echten 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

    }
}

Haben Sie eine Idee, wie Sie das voreingestellte Ordnerelement erweitern und reduzieren können?
Goodies

Ich habe gestimmt und mag diese Antwort, aber !! Es ist zu beachten, dass der Benutzer laut msdn: docs.microsoft.com/en-us/windows/win32/shell/… nicht höher surfen kann als in diesem Stammordner festgelegt . Die Umgehung, die ich verwendet habe, ist einfach. Verwenden Sie den Standardordner .net FolderBrowser, setzen Sie den speziellen Ordner auf MyComputer und legen Sie dann den ausgewählten Pfad fest. Dadurch werden auch die Ordner bis zum ausgewählten Pfadverzeichnis erweitert, aber NICHT dorthin gescrollt.
Heriberto Lugo

0

In meinem Fall war es ein versehentliches doppeltes Entkommen.

das funktioniert:

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

das geht nicht:

SelectedPath = @"C:\\Program Files\\My Company\\My product";
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.