Подтвердить что ты не робот

Диалоговое окно браузера папки, например, диалог открытия файла

См. снимок ниже. Это было взято из рабочего процесса "Создание нового проекта" в Visual Studio 2008.

Это окно используется для выбора папки, в которой будет храниться проект. Как создать аналогичное окно в моем приложении С#?

enter image description here

4b9b3361

Ответ 1

Это нечто похожее в 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).

Ответ 2

Я нашел хорошую статью о умолчанию FolderBrowserDialog и ее ограничениях: http://www.ssware.com/articles/folderbrowserdialog-unmasked-everything-you-wanted-to-know-about-the-folder-browser-component-from-dotnet-framework.htm

Существует сторонний компонент "Shell MegaPack" (http://www.ssware.com/megapack.htm) из ssware, который предлагает проводник Windows, такой как управление браузерами файлов и папок для WinForms, ASP.net и WPF.

Ответ 3

Я изменил код с С# на VB, а мой env - 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 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

Если вы хотите версию на С#, я считаю, что вы достаточно умны, чтобы перенести ее на С#:)