2009-04-01 14 views
24

私は以下のコードで表示されるFolderBrowserDialogを持っています。しかし、選択されたフォルダツリーのルートである「コンピュータ」で開いたままになります。選択したフォルダで開くにはどうすればよいですか? FolderBrowserDialogクラスについては、Microsoftのヘルプから選択したフォルダでFolderBrowserDialogを開くにはどうすればよいですか?

 var folderBrowser = new FolderBrowserDialog(); 
     folderBrowser.Description = "Select Chase 6 Installation Folder"; 
     folderBrowser.RootFolder = Environment.SpecialFolder.MyComputer; 
     folderBrowser.ShowNewFolderButton = false; 
     if (Directory.Exists(Properties.Settings.Default.defaultChasePath)) 
     { 
      string x = Properties.Settings.Default.defaultChasePath; 
      folderBrowser.SelectedPath = x; 
     } 
     if (folderBrowser.ShowDialog(this) == DialogResult.OK) 
     { 
      chasePathtext.Text = folderBrowser.SelectedPath; 
     } 

答えて

0

に役立ちます願っています。有効なパスを使用すると、ルートフォルダは関連性を失います。 SelectedFolderの値を割り当てない場合は、少なくともEnvironment.SepcialFolderのいずれかの値で十分です。

COMING SOON:リフレクションを使用して、特殊でないルートフォルダを動的に設定しようとします。乞うご期待。

+2

***近日発売予定ですか? 2009年から2017年?*** – Kiquenet

10

は通常、新しい FolderBrowserDialogを作成した後、あなたが閲覧を開始することから 場所に RootFolderを設定します。オプションで、 は、 が最初に選択されるRootFolderのサブフォルダの絶対パス にSelectedPathを設定することができます。

SelectedPathをRootFolder(つまりマイコンピュータ)のサブフォルダと同じでない場所に設定することはできますか?これは、おそらく、それが提示された場所としてRootFolderにダイビングする原因になります。

+7

'c:\ yadda yadda'パスは 'マイコンピュータ'のサブフォルダにする必要がありますか? – ProfK

3

folderbrowserダイアログは、可能なすべての関連するパスと一致しないWindows API呼び出しを包むラッパーです(これは、上り坂の仕事だと思います)。これは自分のクラスを使用して模倣することができます。

public class RootSetter 
{ 
    [Flags()] 
    public enum CsIdl 
    { 
     Desktop = 0x0000, // Desktop 
     Internet = 0x0001, // Internet Explorer (icon on desktop) 
     Programs = 0x0002, // Start Menu\Programs 
     Controls = 0x0003, // My Computer\Control Panel 
     Printers = 0x0004, // My Computer\Printers 
     Personal = 0x0005, // My Documents 
     Favorites = 0x0006, // user name\Favorites 
     Startup = 0x0007, // Start Menu\Programs\Startup 
     Recent = 0x0008, // user name\Recent 
     SendTo = 0x0009, // user name\SendTo 
     BitBucket = 0x000a, // desktop\Recycle Bin 
     StartMenu = 0x000b, // user name\Start Menu 
     MyDocuments = 0x000c, // logical "My Documents" desktop icon 
     MyMusic = 0x000d, // "My Music" folder 
     MyVideo = 0x000e, // "My Videos" folder 
     DesktopDirectory = 0x0010, // user name\Desktop 
     Drives = 0x0011, // My Computer 
     Network = 0x0012, // Network Neighborhood (My Network Places) 
     Nethood = 0x0013, // user name\nethood 
     Fonts = 0x0014, // windows\fonts 
     Templates = 0x0015, 
     CommonStartMenu = 0x0016, // All Users\Start Menu 
     CommonPrograms = 0x0017, // All Users\Start Menu\Programs 
     CommonStartup = 0x0018, // All Users\Startup 
     CommonDesktopDirectory = 0x0019, // All Users\Desktop 
     AppData = 0x001a, // user name\Application Data 
     PrintHood = 0x001b, // user name\PrintHood 
     LocalAppData = 0x001c, // user name\Local Settings\Applicaiton Data (non roaming) 
     AltStartup = 0x001d, // non localized startup 
     CommonAltStartup = 0x001e, // non localized common startup 
     CommonFavorites = 0x001f, 
     InternetCache = 0x0020, 
     Cookies = 0x0021, 
     History = 0x0022, 
     CommonAppdata = 0x0023, // All Users\Application Data 
     Windows = 0x0024, // GetWindowsDirectory() 
     System = 0x0025, // GetSystemDirectory() 
     ProgramFiles = 0x0026, // C:\Program Files 
     MyPictures = 0x0027, // C:\Program Files\My Pictures 
     Profile = 0x0028, // USERPROFILE 
     SystemX86 = 0x0029, // x86 system directory on RISC 
     ProgramFilesX86 = 0x002a, // x86 C:\Program Files on RISC 
     ProgramFilesCommon = 0x002b, // C:\Program Files\Common 
     ProgramFilesCommonx86 = 0x002c, // x86 Program Files\Common on RISC 
     CommonTemplates = 0x002d, // All Users\Templates 
     CommonDocuments = 0x002e, // All Users\Documents 
     CommonAdminTools = 0x002f, // All Users\Start Menu\Programs\Administrative Tools 
     AdminTools = 0x0030, // user name\Start Menu\Programs\Administrative Tools 
     Connections = 0x0031, // Network and Dial-up Connections 
     CommonMusic = 0x0035, // All Users\My Music 
     CommonPictures = 0x0036, // All Users\My Pictures 
     CommonVideo = 0x0037, // All Users\My Video 
     Resources = 0x0038, // Resource Direcotry 
     ResourcesLocalized = 0x0039, // Localized Resource Direcotry 
     CommonOemLinks = 0x003a, // Links to All Users OEM specific apps 
     CdBurnArea = 0x003b, // USERPROFILE\Local Settings\Application Data\Microsoft\CD Burning 
     ComputersNearMe = 0x003d, // Computers Near Me (computered from Workgroup membership) 
     FlagCreate = 0x8000, // combine with CSIDL_ value to force folder creation in SHGetFolderPath() 
     FlagDontVerify = 0x4000, // combine with CSIDL_ value to return an unverified folder path 
     FlagNoAlias = 0x1000, // combine with CSIDL_ value to insure non-alias versions of the pidl 
     FlagPerUserInit = 0x0800, // combine with CSIDL_ value to indicate per-user init (eg. upgrade) 
     FlagMask = 0xFF00, // mask for all possible flag values 
    } 

    public static void SetRootFolder(System.Windows.Forms.FolderBrowserDialog fbd, CsIdl csidl) 
    { 
     Type t = fbd.GetType(); 
     FieldInfo fi = t.GetField("rootFolder", BindingFlags.Instance | BindingFlags.NonPublic); 
     fi.SetValue(fbd, (System.Environment.SpecialFolder)csidl); 
    } 

(名前空間とするSystem.Reflectionを追加)、アプリケーション内の以下のクラスを生成してから、呼び出し元のクラス内の次の構文を使用し、ルートフォルダを設定するとき。あなたが1つ見つけたら近い値をチェックする方が良いでしょう。しかし、もしあなたがcanntoならば、以下のものはかなり一般的で、私のCドライブを簡単に動かすことができます。

private void button1_Click(object sender, EventArgs e) 
    { 
     FolderBrowserDialog folderBrowser = new FolderBrowserDialog(); 
     folderBrowser.Description = "Select Chase 6 Installation Folder"; 
     folderBrowser.RootFolder = Environment.SpecialFolder.ProgramFiles; 
     folderBrowser.ShowNewFolderButton = false; 

     if (Directory.Exists(Properties.Settings.Default.defaultChasePath)) 
     { 
      string x = Properties.Settings.Default.defaultChasePath; 

      //Use API Flag to set correct path, following tahter a catch all better to check 
      //enum for full list 
      RootSetter.SetRootFolder(folderBrowser, RootSetter.CsIdl.FlagDontVerify); 

      folderBrowser.SelectedPath = x; 

     } 
     if (folderBrowser.ShowDialog(this) == DialogResult.OK) 
     { 
      string huz = folderBrowser.SelectedPath; 
     } 
    } 

私はSelectedFolderプロパティに存在しないフォルダのパスを割り当てしようとしていた:)

+0

これは動作していません – Prabu

19

RootFolderをEnvironment.SpecialFolder.Desktopに設定すると、パスが有効である限り、SelectedFolderが開きます。

RootFolderをEnvironment.SpecialFolder.MyComputerに設定すると、初めてダイアログが開き、SelectedFolderパスではなくMyComputerから開始されます。

有効な選択が行われた場合、後で同じFolderBrowserDialogインスタンスを使用すると、前に選択したパスで開きます。

+1

これは私が見る動作ではありません。私のRootFolderはMyComputerに設定されており、SelectedFolderを "C:\ Almo"に設定することができます。 C:\ Users \ Almo \ Desktopにはアクセスできないと思われるアクセス権があります。 – Almo

+1

@Almo RootFolderとSelectedFolderをEnvironment.SpecialFolder.Desktopに設定します。次に、あなたがAlmoとして実行していると仮定して、 "C:\ Users \ Almo \ Desktop"に開く必要があります。 –

+0

Whups、私は真実と偽りが混ざっている(尋ねないで)。 Almoのコメントに関する私の反対意見を無視してください。 +1 –

0

既存のパスを選択するには(特別なフォルダはありません)、独自のツリービュー形式を作成する必要があります。

+0

IMHO、より良い答えがあります:http://stackoverflow.com/help/how-to-answer。たぶん、リンク、コード、コンテキストを提供することができます... – Kiquenet

8

Environment.SpecialFolder.Desktop 

から

設定rootfolder、あなたが望むようには動作するはずです。

最初に選択したフォルダを実際に設定する唯一の方法です。あなたは、使用すると思うでしょう

Environment.SpecialFolder.MyComputer 

は動作しますが、そうではありません。

+0

実際に動作(種類)、http://stackoverflow.com/a/2406240/653513を参照してください –

5

これは私の作品:

FolderBrowserDialog diag = new FolderBrowserDialog(); 
diag.Description = "Select a folder in which to save your workspace..."; 
diag.SelectedPath = Application.StartupPath; 

if (DialogResult.OK == diag.ShowDialog()) 
{ 
    // do something here... 
} 

SelectedPathプロパティではなく、RootFolderを設定します。

EDIT: はここにいるApplication.StartupPathを示すスクリーンショットです "C:\ LocalDocumentsビン\デバッグ\プロジェクト\ FolderBrowserDialogTest \ FolderBrowserDialogTest \ Visual Studioの2010 \" デスクトップディレクトリに最も確実ないです。

enter image description here

+0

これは、アプリケーションがデスクトップのサブフォルダに沿ってどこかに配置されている場合にのみ有効です –

+0

Iそれはデスクトップとは何の関係もないことを示すスクリーンショットを追加して編集しました。それは他の場所で正常に動作します。 – pennyrave

+0

アプリケーションはSystem.Windows.Forms.Applicationです。 –

2

私のソリューション、here

私はParkerJay86によってthis solutionに基づいて、このソリューションを書きました。このソリューションは、いくつかのパスをテストしてWindows 8で動作しました。 、そのパスのサブパスと兄弟枝のハードワイヤードのバージョンで遊んでは

RootFolder = Environment.SpecialFolder.MyComputer 
SelectedPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) 

を:あなたの指定rootFolderは、私が使用してこの問題を見ていた「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; 
      } 
     } 
0

のようなDriveLetter:\で始める必要があることを考えてみましょう私はこれが本当に許可のものだと決めました。これはC:\ Users [UserID] \ Documentsでは動作しませんが、C:\ Users、またはC:\ Users \ Public \ Documentsで正常に動作します(存在しない場合でも、少なくともPublicドキュメントの代わりにドキュメント)、またはC:\ Users \ Default \ Documents(存在しない場合でも、少なくともドキュメントの代わりにマイドキュメントと呼ばれていても)。

私は、SelectedPathに "\ users [UserID]"が含まれているかどうかを確認し、Environment.SpecialFolder.Desktopを使用していない場合はEnvironment.SpecialFolder.MyComputerを使用していたかどうかを確認しました。

おそらく、SelectedPathフォルダのアクセス許可をチェックするほうがよいでしょうが、これは想定されるユースケースに当てはまります。

関連する問題