2012-06-12 16 views
16

Por favor, ver la figura de abajo. Esto fue tomado de "Nueva creación del proyecto" flujo de trabajo en Visual Studio 2008.carpeta de diálogo navegador como archivo abierto de diálogo

Esta ventana se utiliza para seleccionar una carpeta en la que se almacenará el proyecto. ¿Cómo creo una ventana similar en mi aplicación C#?

enter image description here

+1

Ver [esta pregunta] (http://stackoverflow.com/questions/1250991/visual-studio-2008-folder-browser-dialog?rq=1). Básicamente parecen subclasificar el archivo estándar dialg abierto. –

+0

@UweKeim: ¿Dónde se explica la subclase en ese hilo de pregunta? Él respondió que terminó usando VistaBridge – Rockstart

+1

Hace algún tiempo descargué VistaBride y examiné las fuentes sobre cómo lo hicieron. IIRC era subclases del diálogo de abrir archivo estándar. –

Respuesta

7

Es algo similar en la oficina, un cuadro de diálogo que permite seleccionar una carpeta. La única diferencia es que el botón Seleccionar carpeta se llama "Aceptar" en lugar de "Seleccionar carpeta".

Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application(); 
Microsoft.Office.Core.FileDialog fileDialog = app.get_FileDialog(Microsoft.Office.Core.MsoFileDialogType.msoFileDialogFolderPicker); 
fileDialog.InitialFileName = "c:\\Temp\\"; //something you want 
int nres = fileDialog.Show(); 
if (nres == -1) //ok 
{ 
    Microsoft.Office.Core.FileDialogSelectedItems selectedItems = fileDialog.SelectedItems; 

    string[] selectedFolders = selectedItems.Cast<string>().ToArray(); 

    if (selectedFolders.Length > 0) 
    { 
     string selectedFolder = selectedFolders[0]; 
    } 
} 

Por supuesto, es necesario agregar referencias a Microsoft.Office.Core (Biblioteca de Microsoft Office 14.0 Object) y Microsoft.Office.Interop.Excel (Microsoft Excel 14.0 Object Library).

0

he modificado el código de C# a VB, y mi env es VS2015 + Office 2010. Mi código es ligeramente diferente a la de Daniel, como una función del código de Daniel apoya a sólo Office 2003/2007

Mediante el uso de una nueva instancia de Excel, será más lenta que la simple apertura de OpenFileDialog o OpenFolderDialog, pero es mucho más fácil de usar. Mi programa solo llama a este código una vez, por lo que intercambiar el rendimiento por facilidad de uso no es una preocupación en mi caso.

Imports Microsoft.Office 
Imports Excel = Microsoft.Office.Interop.Excel 

Private Sub Button_select_raw_dir_Click(sender As Object, e As EventArgs) Handles Button_select_raw_dir.Click 
    Dim raw_app As Excel.Application = New Excel.Application 
    Dim raw_data_open_folder_dialog As Microsoft.Office.Core.FileDialog 
    raw_data_open_folder_dialog = raw_app.FileDialog(Microsoft.Office.Core.MsoFileDialogType.msoFileDialogFolderPicker) 
    raw_data_open_folder_dialog.AllowMultiSelect = False 
    raw_data_open_folder_dialog.Title = "Please select the raw data's dir " 
    Dim nres As Integer = raw_data_open_folder_dialog.Show() 
    Dim sz_SelectedPath As String = Nothing 
    If nres = -1 Then '-1 means open... lol 
     For Each selectedItems As Object In raw_data_open_folder_dialog.SelectedItems 
      sz_SelectedPath = selectedItems.ToString() 
     Next 
     TextBox_raw_data_dir.Text = sz_SelectedPath 
    End If 

    raw_app.Quit() 
    ReleaseComObject(raw_app) 
    GC.Collect() 
    GC.WaitForPendingFinalizers() 
End Sub 

' Release excel objects to avoid memory leak 
Public Sub ReleaseComObject(ByRef obj As Object) 
    Try 
     System.Runtime.InteropServices.Marshal.ReleaseComObject(obj) 
     obj = Nothing 
    Catch ex As Exception 
     obj = Nothing 
     MsgBox("Exception! Failed to release com obj, debug your code.") 
    End Try 
End Sub 

Si quieres una versión de C#, creo que usted es lo suficientemente inteligente como para portarlo a C# :)

0

Si estás bien con la adición de un paquete Nuget, Microsoft.WindowsAPICodePack.Shell tiene una CommonOpenFileDialog que se puede utilizar en "modo carpeta", que debe coincidir con su uso deseado.

var directoryDialog = new CommonOpenFileDialog 
    { 
    IsFolderPicker = true, 
    Title = "Select Folder" 
    }; 
Cuestiones relacionadas