2009-04-01 12 views
24

Tôi có một FolderBrowserDialog, được hiển thị với mã được hiển thị bên dưới. Tuy nhiên, nó vẫn mở bằng 'Máy tính', tức là thư mục gốc của cây thư mục, được chọn. Làm cách nào để mở nó trên thư mục đã chọn?Làm cách nào để mở một FolderBrowserDialog tại thư mục đã chọn?

 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; 
     } 

Trả lời

0

Tôi đã cố gắng để gán một đường dẫn thư mục không tồn tại đến SelectedFolder tài sản. Khi bạn sử dụng một đường dẫn hợp lệ, thư mục gốc mất sự liên quan. Khi bạn không chỉ định giá trị SelectedFolder, ít nhất một trong các giá trị Environment.SepcialFolder sẽ đủ.

SẮP SẮP: Cố gắng sử dụng phản chiếu để tự động đặt thư mục gốc không đặc biệt. Hãy theo dõi.

+2

*** Sắp có? từ năm 2009 đến năm 2017? *** – Kiquenet

10

Từ sự giúp đỡ của Microsoft cho lớp FolderBrowserDialog:

Thông thường, sau khi tạo mới FolderBrowserDialog, bạn đặt RootFolder đến vị trí mà từ đó để bắt đầu duyệt. Tùy chọn, bạn có thể đặt SelectedPath thành đường dẫn tuyệt đối của thư mục con của RootFolder rằng ban đầu sẽ chọn .

Bạn có thể đặt SelectedPath thành một vị trí không tương đương với thư mục con của RootFolder (tức là Máy tính của tôi) không? Điều đó có thể sẽ khiến nó trở lại RootFolder như vị trí đã được trình bày.

+7

Đường dẫn 'c: \ yadda yadda' phải là thư mục con của 'Máy tính của tôi', phải không? – ProfK

3

Hộp thoại thư mục trình bao là một trình bao bọc xung quanh cửa sổ API không khớp với tất cả các đường dẫn có liên quan (tôi cho rằng đó sẽ là một nhiệm vụ khó khăn ..) điều này có thể được bắt chước bằng cách sử dụng lớp của riêng bạn. Tạo lớp sau bên trong ứng dụng của bạn (thêm không gian tên và System.Reflection)

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); 
    } 

và sau đó bên trong lớp gọi điện khi đặt thư mục gốc sử dụng cú pháp sau. Nó sẽ là tốt hơn để kiểm tra fum enum một giá trị gần bạn nên tìm một nhưng nếu bạn cannto thì dưới đây là khá chung chung và cho phép tôi để di chuyển thorugh ổ C của tôi một cách dễ dàng đủ.

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; 
     } 
    } 

Hy vọng rằng sẽ giúp :)

+0

tính năng này không hoạt động – Prabu

19

Nếu bạn đặt RootFolder thành Environment.SpecialFolder.Desktop thì nó sẽ mở ra cho SelectedFolder miễn là đường dẫn hợp lệ.

Khi bạn đặt RootFolder thành Environment.SpecialFolder.MyComputer, thì lần đầu tiên hộp thoại mở ra, nó sẽ luôn bắt đầu tại MyComputer, không phải đường dẫn SelectedFolder.

Nếu lựa chọn hợp lệ được thực hiện, thì các lần sử dụng tiếp theo của cùng một cá thể FolderBrowserDialog sẽ mở tại đường dẫn đã chọn trước đó.

+1

Đây không phải là hành vi tôi thấy. My RootFolder được đặt thành MyComputer và tôi có thể đặt SelectedFolder thành "C: \ Almo" và nó sẽ mở ở đó. Những gì nó sẽ không làm là mở tại "C: \ Users \ Almo \ Desktop" mà tôi nghi ngờ là một vấn đề quyền. – Almo

+1

@Almo Đặt RootFolder và SelectedFolder thành Environment.SpecialFolder.Desktop. Sau đó, giả sử bạn đang chạy dưới dạng Almo, nó sẽ mở thành "C: \ Users \ Almo \ Desktop". –

+0

Whups, tôi đã đúng và sai trộn lên (không hỏi). Bỏ qua lời chia buồn của tôi về bình luận của Almo. +1 –

0

Để chọn đường dẫn hiện có (không có thư mục f ... ng đặc biệt), bạn phải viết biểu mẫu dựa trên hình ảnh của riêng treeview.

+0

IMHO, có thể là câu trả lời hay hơn: http://stackoverflow.com/help/how-to-answer. Có thể cung cấp ngữ cảnh với các liên kết, mã, ... – Kiquenet

8

Set rootfolder để

Environment.SpecialFolder.Desktop 

và nó sẽ làm việc như bạn muốn.

Đây là cách duy nhất để thực sự đặt thư mục đã chọn ban đầu.Bạn sẽ nghĩ rằng việc sử dụng

Environment.SpecialFolder.MyComputer 

sẽ hoạt động, nhưng không.

+0

Nó thực sự hoạt động (loại), xem http://stackoverflow.com/a/2406240/653513 –

5

này làm việc cho tôi:

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... 
} 

Thiết lập thuộc tính SelectedPath, không RootFolder.

EDIT: Dưới đây là một ảnh chụp màn hình cho thấy Application.StartupPath là trong "C: \ LocalDocuments \ Visual Studio 2010 \ Projects \ FolderBrowserDialogTest \ FolderBrowserDialogTest \ bin \ Debug", đó là chắc chắn không nhất trong danh mục Desktop.

enter image description here

+0

Điều này chỉ hoạt động khi ứng dụng được đặt ở đâu đó dọc theo các thư mục con của Desktop –

+0

I chỉnh sửa bằng cách thêm một ảnh chụp màn hình cho thấy rằng nó không có gì để làm với máy tính để bàn. Nó hoạt động tốt ở nơi khác. – pennyrave

+0

chỉ để làm rõ Ứng dụng là System.Windows.Forms.Application –

2

Giải pháp của tôi, here

tôi đã viết giải pháp này dựa trên this solution bởi ParkerJay86. Giải pháp làm việc trên Windows 8 với một số đường dẫn được kiểm tra. Hãy xem xét rằng rootFolder định của bạn nên bắt đầu với DriveLetter:\ như "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

Tôi đã nhìn thấy vấn đề này bằng:

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

By chơi xung quanh với các phiên bản hard-wired về subpath của con đường đó, ngành anh chị em, Tôi quyết định điều này thực sự là một điều khoản. Nó không hoạt động với C: \ Users [UserID] \ Documents, nhưng nó hoạt động tốt với C: \ Users, hoặc C: \ Users \ Public \ Documents (mặc dù nó không tồn tại hoặc ít nhất nó được gọi là Public Tài liệu thay vì Tài liệu) hoặc C: \ Users \ Default \ Documents (mặc dù không tồn tại hoặc ít nhất nó được gọi là Tài liệu của tôi thay vì Tài liệu).

Những gì tôi đã kết thúc làm là kiểm tra xem SelectedPath có chứa "\ users [UserID]", sau đó sử dụng Environment.SpecialFolder.Desktop nếu nó đã làm và Environment.SpecialFolder.MyComputer nếu nó không.

Có thể, việc kiểm tra quyền truy cập thư mục SelectedPath sẽ là một thử nghiệm tốt hơn, nhưng điều này sẽ làm cho các trường hợp sử dụng dự kiến.

Các vấn đề liên quan