Klasör tarayıcısı iletişim kutusu başlangıç ​​konumunu ayarla


113

Bir klasör tarayıcısı iletişim kutusunun ilk dizinini özel olmayan bir klasöre ayarlamanın herhangi bir yolu var mı? Şu anda kullandığım şey bu

fdbLocation.RootFolder = Environment.SpecialFolder.Desktop;
ama bir dizede sakladığım yolu kullanmak istiyorum, bunun gibi bir şey
fdbLocation.RootFolder = myFolder;
Bu, "'string' 'System.Environment.SpecialFolder'a dönüştürülemiyor" hatasına neden olur.

Yanıtlar:


188

ShowDialog'u çağırmadan önce SelectedPath özelliğini ayarlamanız yeterlidir.

fdbLocation.SelectedPath = myFolder;

20
Ayarlanması RootFoldergerektiğini Environment.SpecialFolder.Desktopveya bunun işe yaramayabileceğini unutmayın.
Mike Lowery

3
Aşağıdaki Chad Grants cevabına bakın: Haklı olarak, RootFolder'ın ayarlanması gerektiğini ve SelectedPath'in çalışmak için bu RootFolder'ın altında olması gerektiğini açıklıyor.
Dr Snooze

3
Bu benim için çalışıyor, ancak odağı klasöre ayarlamıyor. Manuel olarak aşağı kaydırmalı ve varsayılan olduğu klasörü bulmalıyım. Odağı gösterildiğinde otomatik olarak ayarlamasının bir yolu var mı?
JoBaxter

2
Ancak bu , ayar ile aynı değildirRootFolder . Eğer RootFolderayarlanır, yalnızca belirtilen klasör ve iletişim kutusunda belirecektir altında hiçbir alt klasörleri. SelectedPathyalnızca verilen yolu önceden seçer.
Jan Gassen

30

ShowDialog'u aramadan önce SelectedPath özelliğini ayarlayın ...

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

Onları C: \ Temp'de başlatacak


RootFolder ( SelectedPath is set to an absolute path that is a subfolder of RootFolder) ayarlanması gerekir mi? Olduğu gibi davranış: C: \ Kullanıcılar \ Kullanıcıadım \ MasaüstüEnvironment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) döndürür . Kimliğe bürünme kodunu kullanmak (LogonType LOGON32_LOGON_INTERACTIVE ile) boş dize
Kiquenet

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

"SelectedPath özelliği, iletişim kutusu gösterilmeden önce ayarlanmışsa, SelectedPath, RootFolder'ın bir alt klasörü olan (veya daha doğrusu, RootFolder tarafından temsil edilen kabuk ad alanı). "

MSDN - SelectedPath

"GetFolderPath yöntemi bu numaralandırma ile ilişkili konumları döndürür. Bu klasörlerin konumları farklı işletim sistemlerinde farklı değerlere sahip olabilir, kullanıcı bazı konumları değiştirebilir ve konumlar yerelleştirilir."

Re: Desktop vs DesktopDirectory

Masaüstü

"Fiziksel dosya sistemi konumu yerine mantıksal Masaüstü."

desktopDirectory:

"Masaüstünde dosya nesnelerini fiziksel olarak depolamak için kullanılan dizin. Bu dizini, sanal bir klasör olan masaüstü klasörünün kendisiyle karıştırmayın."

MSDN - Özel Klasör Sıralaması

MSDN - GetFolderPath


Özel yollar için şunu yapabilirsiniz: {{fldrDialog.RootFolder = Environment.SpecialFolder.DesktopDirectory}}
tymtam

Mükemmel. Teşekkür ederim. Önemli olan, iletişim kutusu açıldığında SelectedPath'i işaret ediyorsa SelectedPath'in RootFolder'ın altında olması gerektiğidir.
Dr Snooze

Olduğu gibi davranış: C: \ Kullanıcılar \ Kullanıcıadım \ MasaüstüEnvironment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) döndürür . Kimliğe bürünme kodunu kullanmak (LogonType LOGON32_LOGON_INTERACTIVE ile) boş dize
Kiquenet

9

Seçilen dizini yolu ayarlamak ve yeni dizini geri almak için:

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

2

Dotnet-snippets.de adresinde bulundu

Yansıma ile bu çalışır ve gerçek RootFolder'ı belirler!

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

    }
}

Ön ayarlı klasör öğesini nasıl genişletip daraltacağınıza dair bir fikriniz var mı?
Goodies

oy verdim ve bu cevabı beğendim, ama !! msdn: docs.microsoft.com/en-us/windows/win32/shell/… uyarınca, kullanıcının bu kök klasörün ayarlandığından daha yükseğe göz atamayacağına dikkat edilmelidir . Kullandığım geçici çalışma basittir, varsayılan .net FolderBrowser'ı kullanın, özel klasörü Bilgisayarım olarak ayarlayın ve ardından seçilen yolu ayarlayın. bu aynı zamanda klasörleri seçilen yol dizinine kadar genişletir, ancak ona KAYMAYACAKTIR.
Heriberto Lugo

0

Benim durumumda, kazara çift kaçış oldu.

bu çalışıyor:

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

bu değil:

SelectedPath = @"C:\\Program Files\\My Company\\My product";
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.