Der von mir schlicht FolderBrowserDialog2 genannte Dialog sieht absolut identisch wie der Standard-Dialog aus, aber bietet die Funktion den Root-Pfad benutzerdefiniert einzustellen. - Andere Einstellungsmöglichkeiten sind dafür eingeschränkt, aber erweiterbar.
string dir;
FolderBrowserDialog2 fbd = new FolderBrowserDialog2("Wählen Sie einen Unterordner.", "C:\Test");
if (fbd.ShowDialog() == Dialog.Result)
dir = fbd.SelectedPath;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace System.Windows.Forms
{
/// <summary>
/// Stellt einen Ordnerwahl-Dialog mit benutzerdefiniertem Root-Ordner bereit.
/// </summary>
class FolderBrowserDialog2
{
/// <summary>
/// Erstellt eine neue Instanz des Dialogs.
/// </summary>
public FolderBrowserDialog2 ()
{
}
/// <summary>
/// Erstellt eine neue Instanz des Dialogs.
/// </summary>
/// <param name="Description">Die angezeigte Beschreibung des Dialogs.</param>
/// <param name="RootPath">Das Basisverzeichnis für den Dialog.</param>
public FolderBrowserDialog2(string Description, string RootPath)
{
this.Description = Description;
this.RootPath = RootPath;
}
/// <summary>
/// Die angezeigte Beschreibung des Dialogs.
/// </summary>
public string Description = "Chose folder...";
/// <summary>
/// Das Basisverzeichnis für den Dialog.
/// </summary>
public string RootPath = "";
/// <summary>
/// Gibt den gewählten Pfad zurück (inklusive Root). Keine Voreinstellung möglich.
/// </summary>
public string SelectedPath = "";
/// <summary>
/// Zeigt den Dialog mit den gewählten EInstellungen.
/// </summary>
/// <returns>Der gewählte Pfad.</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 == 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;
return DialogResult.OK;
}
}
}
}
Kommentare zum Snippet