C# 文件夹浏览器对话框,如“打开文件”对话框

C# 文件夹浏览器对话框,如“打开文件”对话框,c#,winforms,C#,Winforms,请参阅下面的快照。这取自VisualStudio2008中的新项目创建工作流 此窗口用于选择存储项目的文件夹。如何在我的c应用程序中创建类似的窗口 我发现了一篇关于默认FolderBrowserDialog及其限制的好文章: ssware中有一个第三方Component Shell MegaPack,它为WinForms、ASP.net和WPF提供了类似windows资源管理器的文件和文件夹浏览器控件。这与Office中的类似,是一个允许选择文件夹的对话框。 唯一的区别是“选择文件夹”按钮的名

请参阅下面的快照。这取自VisualStudio2008中的新项目创建工作流

此窗口用于选择存储项目的文件夹。如何在我的c应用程序中创建类似的窗口


我发现了一篇关于默认FolderBrowserDialog及其限制的好文章:


ssware中有一个第三方Component Shell MegaPack,它为WinForms、ASP.net和WPF提供了类似windows资源管理器的文件和文件夹浏览器控件。

这与Office中的类似,是一个允许选择文件夹的对话框。 唯一的区别是“选择文件夹”按钮的名称为“确定”,而不是“选择文件夹”

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

当然,您需要添加对Microsoft.Office.Core Microsoft Office 14.0对象库和Microsoft.Office.Interop.Excel Microsoft Excel 14.0对象库的引用。

我将代码从C修改为VB,我的环境是VS2015+Office 2010。我的代码与Daniel的稍有不同,因为Daniel代码中的一些函数只支持Office 2003/2007

通过使用一个新的excel实例,它将比仅仅打开OpenFileDialog或OpenFolderDialog慢,但是它更方便用户。我的程序只调用这段代码一次,所以在我的例子中,为了用户友好性而牺牲性能不是一个问题

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

如果您想要C版本,我相信您足够聪明,可以将其移植到C:

如果您可以添加nuget软件包,Microsoft.WindowsAPICodePack.Shell有一个CommonOpenFileDialog,可以在文件夹模式下使用,该模式应与您所需的用途相匹配

var directoryDialog = new CommonOpenFileDialog
  {
     IsFolderPicker = true,
     Title = "Select Folder"
  };
请退房。它提供的正是你所需要的,还有更多

BetterFolderBrowser是一个.NET组件库,旨在帮助开发人员通过使用类似的浏览器对话框作为标准来代替当前的浏览器对话框,从而为用户提供更好的文件夹浏览和选择体验。当前的浏览器对话框仅允许使用树状图显示格式选择单个文件夹。这使得使用标准的Windows资源管理器对话框可以更轻松地查看、修改、搜索和选择


看见基本上,它们似乎是标准文件OpenDialg的子类。@UweKeim:在这个问题线程中解释的子类在哪里?他回答说,他最终使用了Vistabridge。很久以前,我下载了VistaBride,并查看了他们如何使用VistaBride的来源。IIRC它是标准文件打开对话框的子类化。+1用于提出一个问题,该问题实际上得到了您所要求的确切解决方案的回答。作为解决方案,我使用了SaveFileDialog,并将插入的作为文件名。然后我用path.GetFullPath剥离了路径。