Đặt vị trí bắt đầu hộp thoại trình duyệt thư mục


113

Có cách nào để đặt thư mục ban đầu của hộp thoại trình duyệt thư mục thành một thư mục không đặc biệt không? Đây là những gì tôi hiện đang sử dụng

fdbLocation.RootFolder = Environment.SpecialFolder.Desktop;
nhưng tôi muốn sử dụng một đường dẫn mà tôi đã lưu trữ trong một chuỗi giống như thế này
fdbLocation.RootFolder = myFolder;
Điều này gây ra lỗi "Không thể chuyển đổi 'string' thành 'System.Enosystem.SpecialFolder'".

Câu trả lời:


188

Chỉ cần đặt thuộc tính SelectedPath trước khi gọi ShowDialog.

fdbLocation.SelectedPath = myFolder;

20
Lưu ý rằng nó bắt buộc phải đặt RootFolderthành Environment.SpecialFolder.Desktophoặc điều này có thể không hoạt động.
Mike Lowery

3
Xem câu trả lời của Chad Grants bên dưới: Anh ấy giải thích đúng rằng RootFolder phải được đặt và SelectedPath phải ở dưới RootFolder đó để hoạt động.
Dr Snooze

3
Điều này phù hợp với tôi nhưng nó không đặt tiêu điểm vào thư mục. Tôi phải cuộn xuống theo cách thủ công và tìm thư mục mà nó được mặc định. Có cách nào để nó đặt tiêu điểm tự động khi hiển thị không?
JoBaxter 14/09/2016

2
Tuy nhiên, điều này không giống như cài đặt RootFolder. Nếu RootFolderđược đặt, chỉ thư mục được chỉ định và bất kỳ thư mục con nào nằm bên dưới nó sẽ xuất hiện trong hộp thoại. SelectedPathchỉ chọn trước con đường đã cho.
Jan Gassen,

30

Đặt thuộc tính SelectedPath trước khi bạn gọi ShowDialog ...

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

Sẽ bắt đầu chúng ở C: \ Temp


Có cần thiết lập RootFolder ( SelectedPath is set to an absolute path that is a subfolder of RootFolder) không? Hành vi như hiện tại: Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)trả về C: \ Users \ Myusername \ Desktop. Sử dụng mã mạo danh (với LogonType LOGON32_LOGON_INTERACTIVE) trả về chuỗi trống
Kiquenet

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

"Nếu thuộc tính SelectedPath được đặt trước khi hiển thị hộp thoại, thư mục có đường dẫn này sẽ là thư mục được chọn, miễn là SelectedPath được đặt thành đường dẫn tuyệt đối là thư mục con của RootFolder (hoặc chính xác hơn, trỏ đến thư mục con của không gian tên shell được đại diện bởi RootFolder). "

MSDN - Đường dẫn đã chọn

"Phương thức GetFolderPath trả về các vị trí được liên kết với kiểu liệt kê này. Vị trí của các thư mục này có thể có các giá trị khác nhau trên các hệ điều hành khác nhau, người dùng có thể thay đổi một số vị trí và các vị trí được bản địa hóa."

Re: Desktop vs DesktopDirectory

Máy tính để bàn

"Màn hình hợp lý hơn là vị trí hệ thống tệp vật lý."

DesktopDirectory:

"Thư mục được sử dụng để lưu trữ vật lý các đối tượng tệp trên màn hình. Đừng nhầm lẫn thư mục này với chính thư mục trên màn hình, là một thư mục ảo."

MSDN - Enum thư mục đặc biệt

MSDN - GetFolderPath


Đối với các đường dẫn đặc biệt, bạn có thể thực hiện {{fldrDialog.RootFolder = Environment.SpecialFolder.DesktopDirectory}}
tymtam

Hoàn hảo. Cảm ơn bạn. Điều quan trọng là SelectedPath phải ở bên dưới RootFolder nếu hộp thoại được trỏ đến SelectedPath khi nó mở ra.
Dr Snooze

Hành vi như hiện tại: Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)trả về C: \ Users \ Myusername \ Desktop. Sử dụng mã mạo danh (với LogonType LOGON32_LOGON_INTERACTIVE) trả về chuỗi trống
Kiquenet

9

Để đặt đường dẫn đã chọn thư mục và truy xuất thư mục mới:

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

2

Tìm thấy trên dotnet-snippets.de

Với sự phản chiếu, điều này hoạt động và thiết lập RootFolder thực sự!

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

    }
}

Bất kỳ ý tưởng nào về cách mở rộng và thu gọn mục thư mục đặt trước?
Goodies

tôi đã ủng hộ và thích câu trả lời này, nhưng !! cần lưu ý rằng người dùng sẽ không thể duyệt cao hơn những gì thư mục gốc này được đặt thành, theo msdn : docs.microsoft.com/en-us/windows/win32/shell/… . Công việc xung quanh tôi đã sử dụng rất đơn giản, sử dụng .net FolderBrowser mặc định, đặt thư mục đặc biệt thành MyComputer, sau đó đặt đường dẫn đã chọn. điều này cũng sẽ mở rộng các thư mục lên đến thư mục đường dẫn đã chọn, nhưng sẽ KHÔNG cuộn đến nó.
Heriberto Lugo

0

Trong trường hợp của tôi, đó là một vụ trốn thoát hai lần tình cờ.

những công việc này:

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

cái này không:

SelectedPath = @"C:\\Program Files\\My Company\\My product";
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.