Ответ 1
Просто установите свойство SelectedPath перед вызовом ShowDialog.
fdbLocation.SelectedPath = myFolder;
Можно ли установить исходный каталог диалогового окна браузера папок в неспециальную папку? Это то, что я сейчас использую
fdbLocation.RootFolder = Environment.SpecialFolder.Desktop;
, но я хочу использовать путь, который я сохранил в строке, что-то вроде этого fdbLocation.RootFolder = myFolder;
Это вызывает ошибку "Невозможно преобразовать строку" в "System.Environment.SpecialFolder".
Просто установите свойство SelectedPath перед вызовом ShowDialog.
fdbLocation.SelectedPath = myFolder;
Задайте свойство SelectedPath до вызова ShowDialog...
folderBrowserDialog1.SelectedPath = @"c:\temp\";
folderBrowserDialog1.ShowDialog();
Запустит их при C:\Temp
fldrDialog.SelectedPath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)
"Если свойство SelectedPath установлено перед отображением диалогового окна, папка с этим путем будет выбранной папкой, пока SelectedPath будет установлен в абсолютный путь, который является подпапкой RootFolder (или, точнее, указывает на подпапка пространства имен оболочки, представленная RootFolder).
"Метод GetFolderPath возвращает местоположения, связанные с этим перечислением. Расположение этих папок может иметь разные значения для разных операционных систем, пользователь может изменить некоторые местоположения, а локации локализованы."
Re: Desktop vs DesktopDirectory
Desktop
"Логический рабочий стол, а не физическое расположение файловой системы".
DesktopDirectory:
"Каталог, используемый для физического хранить файлы на рабочем столе. Делать не путайте этот каталог с сама папка рабочего стола, которая является виртуальную папку."
Чтобы установить путь к выбранному каталогу и получить новый каталог:
dlgBrowseForLogDirectory.SelectedPath = m_LogDirectory;
if (dlgBrowseForLogDirectory.ShowDialog() == DialogResult.OK)
{
txtLogDirectory.Text = dlgBrowseForLogDirectory.SelectedPath;
}
Найдено на 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
}
}