2009-04-01 11 views
24

Mam FolderBrowserDialog, wyświetlane z kodem pokazanym poniżej. Jednak wciąż otwiera się, wybierając "Komputer", tj. Katalog główny drzewa folderów. Jak mogę go otworzyć w wybranym folderze?Jak otworzyć FolderBrowserDialog w wybranym folderze?

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

Odpowiedz

0

Próbowałem przypisać nieistniejącą ścieżkę folderu do właściwości SelectedFolder. Gdy używasz poprawnej ścieżki, folder główny traci znaczenie. Jeśli nie przypiszesz wartości SelectedFolder, wystarczy jedna z wartości Environment.SepcialFolder.

JUŻ WKRÓTCE: Próba użycia odbicia do dynamicznego ustawiania nieza szczególnego folderu głównego. Bądźcie czujni.

+2

*** Już wkrótce? od 2009 do 2017? *** – Kiquenet

10

Z pomocą Microsoft dla klasy FolderBrowserDialog:

Zazwyczaj po utworzeniu nowego FolderBrowserDialog, ustawić RootFolder do miejsca, z którego aby rozpocząć przeglądanie. Opcjonalnie można ustawić wartość SelectedPath na bezwzględną ścieżkę podfolderu folderu RootFolder, która początkowo będzie zaznaczona jako .

Czy jest możliwe ustawienie SelectedPath w miejscu, które nie jest równoznaczne z podfolderem folderu RootFolder (np. My Computer)? To prawdopodobnie spowodowałoby, że zanurkowałoby z powrotem do folderu RootFolder jako prezentowana lokalizacja.

+7

Ścieżka "c: \ yadda yadda" powinna być podkatalogiem "Mój komputer", nieprawdaż? – ProfK

3

Okno dialogowe folderu folderów jest opakowaniem wywołania funkcji API systemu Windows, które nie pasuje do wszystkich odpowiednich ścieżek (przypuszczam, że byłoby to zadanie pod górę). Można je jednak naśladować przy użyciu własnej klasy. Generować następujące klasy wewnątrz aplikacji (dodanie nazw i 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); 
    } 

a następnie wewnątrz klasy wywołującego podczas ustawiania folder główny użyć następującej składni. Byłoby lepiej sprawdzić enum fior wartość bliską, gdybyś znalazł jedną, ale jeśli nie możesz, ta poniżej jest dość ogólna i pozwala mi swobodnie poruszać się po dysku 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; 
     } 
    } 

nadzieję, że pomoże :)

+0

to nie działa – Prabu

19

Jeśli ustawisz RootFolder na Environment.SpecialFolder.Desktop, otworzy się ono na SelectedFolder, o ile ścieżka jest prawidłowa.

Po ustawieniu RootFolder na Environment.SpecialFolder.MyComputer, przy pierwszym otwarciu okna dialogowego, zawsze rozpocznie się ono na MyComputer, a nie na ścieżce SelectedFolder.

Po dokonaniu prawidłowego wyboru, kolejne zastosowania tej samej instancji FolderBrowserDialog zostaną otwarte w poprzednio wybranej ścieżce.

+1

To nie jest zachowanie, które widzę. Mój folder RootFolder jest ustawiony na MyComputer i mogę ustawić SelectedFolder na "C: \ Almo" i otworzy się tam. To, czego nie zrobi, jest otwarte w "C: \ Users \ Almo \ Desktop", co do którego podejrzewam, że jest problemem uprawnień. – Almo

+1

@Almo Ustaw RootFolder i SelectedFolder na Environment.SpecialFolder.Desktop. Następnie, zakładając, że działasz jako Almo, powinna otworzyć się na "C: \ Users \ Almo \ Desktop". –

+0

Whups, mam prawdziwe i fałszywe pomieszane (nie pytaj). Zignoruj ​​mój sprzeciw wobec komentarza Almo. +1 –

0

Aby wybrać istniejącą ścieżkę (bez specjalnych folderów f ...) musisz napisać własną formę opartą na drzewie.

+0

IMHO, może być lepsza odpowiedź: http://stackoverflow.com/help/how-to-answer. Może podać kontekst z linkami, kod, ... – Kiquenet

8

Set rootfolder do

Environment.SpecialFolder.Desktop 

i powinno działać jak chcesz.

Jest to jedyny sposób, aby właściwie ustawić początkowy wybrany folder.Można by pomyśleć, że praca będzie działać, ale nie działa.

+0

To faktycznie działa (rodzaj), zobacz http://stackoverflow.com/a/2406240/653513 –

5

Działa to dla mnie:

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

Ustaw właściwość SelectedPath, nie RootFolder.

EDIT: Oto zrzut ekranu przedstawiający Application.StartupPath bycia w "C: \ LocalDocuments \ Visual Studio 2010 \ Projects \ FolderBrowserDialogTest \ FolderBrowserDialogTest \ bin \ Debug", który jest zdecydowanie najbardziej nie w katalogu Desktop.

enter image description here

+0

Działa to tylko wtedy, gdy aplikacja jest umieszczona gdzieś wzdłuż podfolderów pulpitu –

+0

I edytowane przez dodanie zrzutu ekranu pokazującego, że nie ma to nic wspólnego z pulpitem. Działa dobrze w innym miejscu. – pennyrave

+0

tylko w celu wyjaśnienia aplikacji jest System.Windows.Forms.Application –

2

Moje rozwiązanie, here

pisałem to rozwiązanie oparte na this solution przez ParkerJay86. Rozwiązanie działało w systemie Windows 8 z kilkoma testowanymi ścieżkami. Zastanów się, czy określony rootFolder powinien zacząć DriveLetter:\ jak „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

widziałem ten problem przy użyciu:

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

Poprzez zabawy z przewodowych wersjach podścieżek tej ścieżce i oddziałów rodzeństwo, Uznałem, że to naprawdę jest kwestia uprawnień. Nie działa z C: \ Users [identyfikator_użytkownika] \ Documents, ale działa dobrze z C: \ Users lub C: \ Users \ Public \ Documents (mimo że nie istnieje lub przynajmniej nazywa się Public Dokumenty zamiast Dokumentów) lub C: \ Użytkownicy \ Domyślne \ Dokumenty (nawet jeśli nie istnieje lub przynajmniej nazywa się Moje dokumenty zamiast Dokumentów).

To, co zrobiłem, to sprawdzenie, czy SelectedPath zawiera "\ users [UserID]", a następnie użycie Environment.SpecialFolder.Desktop, jeśli tak, i Environment.SpecialFolder.MyComputer, jeśli tak się nie stało.

Prawdopodobnie sprawdzenie uprawnień do folderu Wybrana ścieżka byłoby lepszym testem, ale spowoduje to oczekiwane przypadki użycia.

Powiązane problemy