mostrar - ventanas de dialogo en c#
Carpeta de diálogo del navegador como diálogo de abrir archivo (4)
Por favor, vea la instantánea a continuación. Esto se tomó del flujo de trabajo "Creación de un nuevo proyecto" en Visual Studio 2008.
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 #?
Encontré un buen artículo sobre el FolderBrowserDialog predeterminado y sus limitaciones: http://www.ssware.com/articles/folderbrowserdialog-unmasked-everything-you-wanted-to-know-about-the-folder-browser-component-from-dotnet-framework.htm
Existe un componente de terceros "Shell MegaPack" ( http://www.ssware.com/megapack.htm ) de ssware que ofrece un explorador de Windows como archivos y carpetas con controles de navegador para WinForms, ASP.net y WPF.
Es algo similar en Office, un diálogo que permite seleccionar una carpeta. La única diferencia es que el botón Seleccionar carpeta se llama "OK" 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, debe agregar referencias a Microsoft.Office.Core (Biblioteca de objetos de Microsoft Office 14.0) y Microsoft.Office.Interop.Excel (Biblioteca de objetos de Microsoft Excel 14.0).
Modifiqué el código de C # a VB, y mi env es VS2015 + Office 2010. Mi código es ligeramente diferente al de Daniel, ya que algunas funciones del código de Daniel solo admiten Office 2003/2007.
Al usar una nueva instancia de Excel, será más lento que simplemente abrir un 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 cambiar 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 desea una versión de C #, creo que es lo suficientemente inteligente como para trasladarla a C # :)
Si está de acuerdo con agregar un paquete nuget, Microsoft.WindowsAPICodePack.Shell tiene un CommonOpenFileDialog
que se puede usar en el "modo de carpeta" que debe coincidir con su uso deseado.
var directoryDialog = new CommonOpenFileDialog
{
IsFolderPicker = true,
Title = "Select Folder"
};