Setel lokasi awal dialog browser folder

113

Apakah ada cara untuk menyetel direktori awal dari dialog browser folder ke folder non-khusus? Inilah yang saya gunakan saat ini

fdbLocation.RootFolder = Environment.SpecialFolder.Desktop;
tapi saya ingin menggunakan jalur yang saya simpan dalam string seperti ini
fdbLocation.RootFolder = myFolder;
Ini menyebabkan kesalahan "Tidak dapat mengubah 'string' menjadi 'System.Environment.SpecialFolder'".

Penguji101
sumber

Jawaban:

188

Cukup setel properti SelectedPath sebelum memanggil ShowDialog.

fdbLocation.SelectedPath = myFolder;
great_llama
sumber
20
Perhatikan bahwa ini diperlukan untuk disetel RootFolderke Environment.SpecialFolder.Desktopatau ini mungkin tidak berfungsi.
Mike Lowery
3
Lihat jawaban Chad Grants di bawah ini: Dia dengan benar menjelaskan bahwa RootFolder harus disetel, dan SelectedPath harus di bawah RootFolder itu agar bisa berfungsi.
Dr Snooze
3
Ini berfungsi untuk saya tetapi tidak mengatur fokus ke folder. Saya harus menggulir ke bawah secara manual dan menemukan folder defaultnya. Adakah cara untuk mengatur fokus secara otomatis saat diperlihatkan?
JoBaxter
2
Namun ini tidak sama dengan pengaturan RootFolder. Jika RootFolderdisetel, hanya folder yang ditentukan dan subfolder yang ada di bawahnya yang akan muncul di kotak dialog. SelectedPathhanya memilih terlebih dahulu jalur yang diberikan.
Jan Gassen
30

Setel properti SelectedPath sebelum Anda memanggil ShowDialog ...

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

Akan memulainya di C: \ Temp

JP Alioto
sumber
Apakah diperlukan untuk menyetel RootFolder ( SelectedPath is set to an absolute path that is a subfolder of RootFolder)? Perilaku sebagaimana adanya: Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)mengembalikan C: \ Users \ Myusername \ Desktop. Menggunakan kode peniruan (dengan LogonType LOGON32_LOGON_INTERACTIVE) mengembalikan string kosong
Kiquenet
24
fldrDialog.SelectedPath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)

"Jika properti SelectedPath disetel sebelum menampilkan kotak dialog, folder dengan jalur ini akan menjadi folder yang dipilih, selama SelectedPath disetel ke jalur absolut yang merupakan subfolder dari RootFolder (atau lebih tepatnya, menunjuk ke subfolder dari namespace shell diwakili oleh RootFolder). "

MSDN - SelectedPath

"Metode GetFolderPath mengembalikan lokasi yang terkait dengan pencacahan ini. Lokasi folder ini dapat memiliki nilai yang berbeda pada sistem operasi yang berbeda, pengguna dapat mengubah beberapa lokasi, dan lokasi dilokalkan."

Re: Desktop vs DesktopDirectory

Desktop

"Desktop logis daripada lokasi sistem file fisik."

DesktopDirectory:

"Direktori yang digunakan untuk menyimpan objek file secara fisik di desktop. Jangan rancukan direktori ini dengan folder desktop itu sendiri, yang merupakan folder virtual."

MSDN - Enum Folder Khusus

MSDN - GetFolderPath

Chad Grant
sumber
Untuk jalur khusus Anda dapat melakukan {{fldrDialog.RootFolder = Environment.SpecialFolder.DesktopDirectory}}
tymtam
Sempurna. Terima kasih. Kuncinya adalah SelectedPath harus berada di bawah RootFolder jika dialog akan mengarah ke SelectedPath saat terbuka.
Dr Snooze
Perilaku sebagaimana adanya: Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)mengembalikan C: \ Users \ Myusername \ Desktop. Menggunakan kode peniruan (dengan LogonType LOGON32_LOGON_INTERACTIVE) mengembalikan string kosong
Kiquenet
9

Untuk mengatur direktori jalur yang dipilih dan mengambil direktori baru:

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

Ditemukan di dotnet-snippets.de

Dengan refleksi ini berfungsi dan mengatur RootFolder yang asli!

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

    }
}
Andy U.
sumber
Ada ide bagaimana cara memperluas dan menutup item folder preset?
Goodies
saya memberi suara positif dan menyukai jawaban ini, tapi !! perlu dicatat bahwa pengguna tidak akan dapat menjelajah lebih tinggi dari apa yang diatur folder root ini, menurut msdn : docs.microsoft.com/en-us/windows/win32/shell/… . Pekerjaan yang saya gunakan sederhana, gunakan FolderBrowser default .net, atur folder khusus ke MyComputer, lalu atur jalur yang dipilih. ini juga akan memperluas folder hingga direktori jalur yang dipilih, tetapi TIDAK akan menggulir ke sana.
Heriberto Lugo
0

Dalam kasus saya, itu adalah pelarian ganda yang tidak disengaja.

ini bekerja:

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

ini tidak:

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