3

FolderBrowserDialog.RootFolder プロパティは、 Environment.SpecialFolder列挙子で定義された特別なフォルダーのみに制限されます。ただし、私のアプリケーションでは、このダイアログを表示する必要がありますが、ルート パスは構成可能である必要があり、通常はカスタム フォルダーであり、列挙子の特別なフォルダーとは関係ありません。

ルートがカスタム フォルダに割り当てられているフォルダ ブラウザを表示するにはどうすればよいですか? RootFolder プロパティでは不可能かもしれませんが、他の方法で同じ効果を得ることができます (つまり、ユーザーはルート フォルダーの外側を表示または選択できません)。この回答では、反射操作を使用して可能かもしれないと誰かがほのめかしましたが、更新はありませんでした。これが .NET で可能かどうか、何か考えはありますか?

4

1 に答える 1

2

ParkerJay86 によるこのソリューションに基づいて、このソリューションを作成しました。このソリューションは、いくつかのパスをテストした Windows 8 で機能しました。指定した rootFolder は" "DriveLetter:\のように開始する必要があることを考慮してくださいC:\ProgramData

    private void browseFolder_Click(object sender, EventArgs e)
    {
        String selectedPath;
        if (ShowFBD(@"C:\", "Please Select a folder", out selectedPath))
        {
            MessageBox.Show(selectedPath);
        }
    }

public bool ShowFBD(String rootFolder, String title, out String selectedPath)
{
    var shellType = Type.GetTypeFromProgID("Shell.Application");
    var shell = Activator.CreateInstance(shellType);
    var result = shellType.InvokeMember("BrowseForFolder", BindingFlags.InvokeMethod, null, shell, new object[] { 0, title, 0, rootFolder });
    if (result == null)
    {
        selectedPath = "";
        return false;
    }
    else
    {
        StringBuilder sb = new StringBuilder();
        while (result != null)
        {
            var folderName = result.GetType().InvokeMember("Title", BindingFlags.GetProperty, null, result, null).ToString();
            sb.Insert(0, String.Format(@"{0}\", folderName));
            result = result.GetType().InvokeMember("ParentFolder", BindingFlags.GetProperty, null, result, null);
        }
        selectedPath = sb.ToString();

        selectedPath = Regex.Replace(selectedPath, @"Desktop\\Computer\\.*\(\w:\)\\", rootFolder.Substring(0, 3));
        return true;
    }
}
于 2012-10-18T08:34:57.757 に答える