2009-04-01 35 views
24

Tengo un FolderBrowserDialog, que se muestra con el código que se muestra a continuación. Sin embargo, sigue abriéndose con 'Computadora', es decir, la raíz del árbol de carpetas, seleccionada. ¿Cómo hago para que se abra en la carpeta seleccionada?¿Cómo abro un FolderBrowserDialog en la carpeta seleccionada?

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

Respuesta

0

yo estaba tratando de asignar una ruta de carpeta que no exista a la propiedad SelectedFolder. Cuando utiliza una ruta válida, la carpeta raíz pierde relevancia. Cuando no se asigna un valor SelectedFolder, al menos uno de los valores Environment.SepcialFolder será suficiente.

PRÓXIMAMENTE: Intenta utilizar la reflexión para establecer dinámicamente una carpeta raíz no especial. Manténganse al tanto.

+2

*** ¿Próximamente? de 2009 a 2017? *** – Kiquenet

10

Desde la ayuda de Microsoft para la clase FolderBrowserDialog:

Normalmente, después de la creación de un nuevo FolderBrowserDialog, se establece la RootFolder a la ubicación desde la que para iniciar la navegación. Opcionalmente, puede establecer el SelectedPath en una ruta absoluta de una subcarpeta de RootFolder que inicialmente se seleccionará .

¿Está configurando SelectedPath en una ubicación que no equivale a una subcarpeta de RootFolder (es decir, Mi PC)? Eso probablemente haría que volviera a la RootFolder como la ubicación presentada.

+7

Una ruta 'c: \ yadda yadda' debe ser una subcarpeta de 'Mi PC', ¿no es así? – ProfK

3

El cuadro de diálogo carpetabrowser es un contenedor alrededor de una llamada API de Windows que no coincide con todas las rutas relevantes posibles (supongo que sería una tarea cuesta arriba ...) sin embargo, esto puede imitarse usando su propia clase. Generar la siguiente clase dentro de su aplicación (la adición de espacio de nombres y 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); 
    } 

y luego dentro de su clase llamada al configurar la carpeta raíz utilice la sintaxis siguiente. Sería mejor verificar la enumeración de un valor cercano en caso de encontrar uno, pero si no se puede, entonces el siguiente es bastante genérico y me permite moverme a través de mi disco C con bastante facilidad.

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

Espero que ayude :)

+0

esto no está funcionando – Prabu

19

Si configura RootFolder en Environment.SpecialFolder.Desktop, se abrirá en SelectedFolder siempre que la ruta sea válida.

Cuando configura RootFolder en Environment.SpecialFolder.MyComputer, la primera vez que se abre el cuadro de diálogo, siempre comienza en MyComputer, no en la ruta SelectedFolder.

Si se realiza una selección válida, los usos posteriores de la misma instancia de FolderBrowserDialog se abrirán en la ruta previamente seleccionada.

+1

Este no es el comportamiento que veo. My RootFolder está configurado en MyComputer, y puedo establecer SelectedFolder en "C: \ Almo" y se abrirá allí. Lo que no hará es abrir en "C: \ Users \ Almo \ Desktop", que sospecho que es un problema de permisos. – Almo

+1

@ Almo Establezca RootFolder y SelectedFolder en Environment.SpecialFolder.Desktop. Luego, presumiendo que se está ejecutando como Almo, debería abrirse en "C: \ Users \ Almo \ Desktop". –

+0

Whups, me confundí verdadero y falso (no preguntes). Ignora mi voto disidente sobre el comentario de Almo. +1 –

0

Para seleccionar la ruta existente (sin carpetas de archivos especiales) debe escribir su propia forma basada en la vista de árbol.

+0

en mi humilde opinión, puede ser una mejor respuesta: http://stackoverflow.com/help/how-to-answer. Tal vez proporcionar contexto con enlaces, código, ... – Kiquenet

8

Conjunto RootFolder a

Environment.SpecialFolder.Desktop 

y debería funcionar como se desea.

Es la única manera de configurar realmente la carpeta seleccionada inicialmente.Usted pensaría que usando

Environment.SpecialFolder.MyComputer 

funcionaría, pero no es así.

+0

En realidad funciona (tipo de), ver http://stackoverflow.com/a/2406240/653513 –

5

Esto funciona para mí:

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

Establecer la propiedad SelectedPath, no RootFolder.

EDIT: Aquí hay una captura de pantalla que muestra el Application.StartupPath estar en "C: \ LocalDocuments \ Visual Studio 2010 \ Projects \ FolderBrowserDialogTest \ FolderBrowserDialogTest \ bin \ Debug", que es lo más definitivamente no en el directorio de escritorio.

enter image description here

+0

Esto funciona solo cuando la aplicación se coloca en algún lugar a lo largo de las subcarpetas de escritorio –

+0

I editado agregando una captura de pantalla que muestra que no tiene nada que ver con el escritorio. Funciona bien en otros lugares. – pennyrave

+0

solo para aclarar la aplicación es System.Windows.Forms.Application –

2

Mi solución, here

escribí esta solución basada en this solution por ParkerJay86. La solución funcionó en Windows 8 con varias rutas probadas. Considere que su RootFolder especificado debe comenzar con DriveLetter:\ como "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

que estaba viendo este problema usando:

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

Al jugar un poco con las versiones cableadas de subtrazados de ese camino y ramas de hermanos, Decidí que esto realmente es una cuestión de permisos. No funciona con C: \ Users [UserID] \ Documents, pero funciona bien con C: \ Users, o C: \ Users \ Public \ Documents (aunque eso no exista o, al menos se llame Public Documentos en lugar de Documentos), o C: \ Users \ Default \ Documents (aunque eso no exista o, al menos, se llame Mis documentos en lugar de Documentos).

Lo que terminé haciendo fue verificar si SelectedPath contiene "\ users [UserID]", luego usar Environment.SpecialFolder.Desktop si lo hizo y Environment.SpecialFolder.MyComputer si no lo hizo.

Probablemente, comprobar los permisos de la carpeta SelectedPath sería una mejor prueba, pero esto servirá para los casos de uso esperados.

Cuestiones relacionadas