2012-06-12 26 views
16

Si prega di vedere l'istantanea di seguito. Questo è stato preso dal flusso di lavoro "Creazione di nuovi progetti" in Visual Studio 2008.Finestra di dialogo del browser delle cartelle come finestra di dialogo Apri file

Questa finestra viene utilizzata per selezionare una cartella in cui verrà archiviato il progetto. Come posso creare una finestra simile nella mia domanda C#?

enter image description here

+1

Sede [questa domanda] (http://stackoverflow.com/questions/1250991/visual-studio-2008-folder-browser-dialog?rq=1). Fondamentalmente sembrano sottoclasse il dialg aperto standard del file. –

+0

@UweKeim: dove viene spiegata la sottoclasse in quella domanda? Ha risposto che ha finito per usare VistaBridge – Rockstart

+1

Qualche tempo fa ho scaricato VistaBride e ho esaminato le fonti su come l'hanno fatto. IIRC era sottoclasse della finestra di dialogo standard di apertura file. –

risposta

7

È simile in Office, una finestra di dialogo che consente di selezionare una cartella. L'unica differenza è che il pulsante Seleziona cartella è denominato "OK" invece di "Seleziona cartella".

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

Naturalmente, è necessario aggiungere i riferimenti a Microsoft.Office.Core (Microsoft Office Libreria 14,0 Object) e Microsoft.Office.Interop.Excel (Microsoft Excel Libreria 14,0 Object).

0

ho modificato il codice da C# a VB, e il mio ENV è VS2015 + Office 2010. Il mio codice è leggermente diversa da quella di Daniel, come qualche funzione dal codice di Daniel supporta al solo Office 2003/2007

Utilizzando un nuova istanza di Excel, sarà più lenta dell'apertura di OpenFileDialog o OpenFolderDialog, ma è molto più user friendly. Il mio programma chiama questo codice solo una volta, quindi il trading delle prestazioni per la facilità d'uso non è un problema nel mio 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 

Se volete una versione C#, credo sei abbastanza intelligente per crearlo in C# :)

0

Se siete ok con l'aggiunta di un pacchetto di NuGet, Microsoft.WindowsAPICodePack.Shell ha un CommonOpenFileDialog che può essere utilizzato in "modalità cartella" che dovrebbe corrispondere all'utilizzo desiderato.

var directoryDialog = new CommonOpenFileDialog 
    { 
    IsFolderPicker = true, 
    Title = "Select Folder" 
    }; 
Problemi correlati