ตั้งค่าตำแหน่งเริ่มต้นของกล่องโต้ตอบเบราว์เซอร์โฟลเดอร์


113

มีวิธีใดในการตั้งค่าไดเร็กทอรีเริ่มต้นของไดอะล็อกเบราว์เซอร์โฟลเดอร์เป็นโฟลเดอร์ที่ไม่ใช่โฟลเดอร์พิเศษหรือไม่? นี่คือสิ่งที่ฉันกำลังใช้อยู่

fdbLocation.RootFolder = Environment.SpecialFolder.Desktop;
แต่ฉันต้องการใช้เส้นทางที่ฉันเก็บไว้ในสตริงอะไรทำนองนี้
fdbLocation.RootFolder = myFolder;
ซึ่งทำให้เกิดข้อผิดพลาด "ไม่สามารถแปลง" สตริง "เป็น" System.Environment.SpecialFolder ""

คำตอบ:


188

เพียงตั้งค่าคุณสมบัติ SelectedPath ก่อนที่จะเรียก ShowDialog

fdbLocation.SelectedPath = myFolder;

20
โปรดทราบว่าจำเป็นต้องตั้งค่าRootFolderเป็นEnvironment.SpecialFolder.Desktopหรืออาจใช้ไม่ได้
Mike Lowery

3
ดูคำตอบของ Chad Grants ด้านล่าง: เขาอธิบายอย่างถูกต้องว่าต้องตั้งค่า RootFolder และ SelectedPath ต้องอยู่ต่ำกว่า RootFolder นั้นจึงจะทำงานได้
Dr Snooze

3
สิ่งนี้ใช้ได้กับฉัน แต่ไม่ได้กำหนดโฟกัสไปที่โฟลเดอร์ ฉันต้องเลื่อนลงด้วยตนเองและค้นหาโฟลเดอร์ที่เป็นค่าเริ่มต้น มีวิธีตั้งค่าโฟกัสอัตโนมัติเมื่อแสดงหรือไม่?
JoBaxter

2
นี้เป็น แต่ไม่ได้RootFolderเช่นเดียวกับการตั้งค่า หากRootFolderตั้งค่าไว้เฉพาะโฟลเดอร์ที่ระบุและโฟลเดอร์ย่อยใด ๆ ที่อยู่ด้านล่างจะปรากฏในกล่องโต้ตอบ SelectedPathเพียงเลือกเส้นทางที่กำหนดไว้ล่วงหน้า
Jan Gassen

30

ตั้งค่าคุณสมบัติ SelectedPath ก่อนที่คุณจะเรียก ShowDialog ...

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

จะเริ่มที่ C: \ Temp


จำเป็นต้องตั้งค่าRootFolder ( SelectedPath is set to an absolute path that is a subfolder of RootFolder) หรือไม่ พฤติกรรมตามที่เป็นอยู่: Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)ส่งกลับC: \ Users \ Myusername \ Desktop การใช้รหัสเลียนแบบ (ด้วย LogonType LOGON32_LOGON_INTERACTIVE) ส่งคืนสตริงว่าง
Kiquenet

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

"ถ้าคุณสมบัติ SelectedPath ถูกตั้งค่าก่อนที่จะแสดงกล่องโต้ตอบโฟลเดอร์ที่มีพา ธ นี้จะเป็นโฟลเดอร์ที่เลือกตราบใดที่ SelectedPath ตั้งค่าเป็นพา ธ สัมบูรณ์ที่เป็นโฟลเดอร์ย่อยของ RootFolder (หรือแม่นยำกว่านั้นชี้ไปที่โฟลเดอร์ย่อยของ เนมสเปซเชลล์ที่แสดงโดย RootFolder) "

MSDN - SelectedPath

"เมธอด GetFolderPath จะส่งคืนตำแหน่งที่เกี่ยวข้องกับการแจงนับนี้ตำแหน่งของโฟลเดอร์เหล่านี้อาจมีค่าที่แตกต่างกันในระบบปฏิบัติการที่แตกต่างกันผู้ใช้สามารถเปลี่ยนตำแหน่งบางส่วนและตำแหน่งจะถูกแปล"

เรื่อง Desktop vs DesktopDirectory

เดสก์ทอป

"เดสก์ท็อปแบบลอจิคัลแทนที่จะเป็นตำแหน่งระบบไฟล์ทางกายภาพ"

DesktopDirectory:

"ไดเร็กทอรีที่ใช้ในการจัดเก็บอ็อบเจ็กต์ไฟล์บนเดสก์ท็อปอย่าสับสนไดเร็กทอรีนี้กับโฟลเดอร์เดสก์ท็อปซึ่งเป็นโฟลเดอร์เสมือน"

MSDN - Enum โฟลเดอร์พิเศษ

MSDN - GetFolderPath


สำหรับเส้นทางพิเศษคุณสามารถทำได้ {{fldrDialog.RootFolder = Environment.SpecialFolder.DesktopDirectory}}
tymtam

สมบูรณ์ ขอบคุณ. กุญแจสำคัญคือ SelectedPath ต้องอยู่ด้านล่าง RootFolder หากกล่องโต้ตอบจะชี้ไปที่ SelectedPath เมื่อเปิดขึ้น
Dr Snooze

พฤติกรรมตามที่เป็นอยู่: Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)ส่งกลับC: \ Users \ Myusername \ Desktop การใช้รหัสเลียนแบบ (ด้วย LogonType LOGON32_LOGON_INTERACTIVE) ส่งคืนสตริงว่าง
Kiquenet

9

ในการตั้งค่าพา ธ ที่เลือกไดเร็กทอรีและดึงไดเร็กทอรีใหม่:

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

2

พบในdotnet-snippets.de

ด้วยการสะท้อนสิ่งนี้ได้ผลและตั้งค่า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

    }
}

มีความคิดอย่างไรในการขยายและยุบรายการโฟลเดอร์ที่ตั้งไว้ล่วงหน้า
สารพัด

ฉันโหวตและชอบคำตอบนี้ แต่ !! มันควรจะตั้งข้อสังเกตว่าผู้ใช้จะไม่สามารถเรียกดูสูงกว่าสิ่งที่โฟลเดอร์รากนี้ถูกตั้งค่าตาม MSDN: docs.microsoft.com/en-us/windows/win32/shell/... วิธีแก้ปัญหาที่ฉันใช้นั้นเรียบง่ายใช้. net FolderBrowser เริ่มต้นตั้งค่าโฟลเดอร์พิเศษเป็น MyComputer จากนั้นกำหนดเส้นทางที่เลือก นอกจากนี้ยังจะขยายโฟลเดอร์ไม่เกินไดเร็กทอรีพา ธ ที่เลือก แต่จะไม่เลื่อนไปที่โฟลเดอร์นั้น
Heriberto Lugo

0

ในกรณีของฉันมันเป็นการหนีสองครั้งโดยไม่ได้ตั้งใจ

งานนี้:

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

สิ่งนี้ไม่:

SelectedPath = @"C:\\Program Files\\My Company\\My product";
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.