Вопрос по .net, c#, dialog, openfiledialog – Как использовать OpenFileDialog для выбора папки?

210

Как пользоватьсяOpenFileDialog выбрать папки?

Я собирался использовать следующий проект:https://github.com/scottwis/OpenFileOrFolderDialog

Однако я столкнулся с одной проблемой. Он используетGetOpenFileName функция иOPENFILENAME состав. А такжеOPENFILENAME имеет имя членаtemplateID, Это идентификатор шаблона диалога. И проект содержитres1.rc файл и шаблонный диалог init тоже. Но я не могу понять, как прикрепить этот файл к моему проекту на C #.

Есть ли лучший способ использоватьOpenFileDialog выбрать папки?

Спасибо Dan за указание на OpenFileDialog-Hack! Это намного лучше, чем FolderBrowserDialog, потому что OFD показывает папки с закладками и т. Д., Поэтому каждый - особенно в крупных компаниях - находит свое дерьмо. FBD не принесет много пользы в этих местах. JayC667
Существует хакерское решение, использующее OpenFileDialog, гдеValidateNames а такжеCheckFileExists оба установлены в ложь иFileName дается фиктивное значение, чтобы указать, что каталог выбран. Я говорю хак, потому что это сбивает с толку пользователей о том, как выбрать папку. УвидетьSelect file or folder from the same dialog Daniel Ballinger
Если вы откроете файл проекта в редакторе, вы увидите некоторые дополнительные свойства внизу: & lt; VCIncludePath ... & gt ;, & lt; Win32Resource ... & gt; и & lt; Target Name = "BeforeBuild" ... & gt ;. Вы увидите, что он запускает rc.exe для компиляции файла ресурсов res1.rc (не забудьте также скопировать файл & quot; resource.h & quot; в свой проект). Убедитесь, что у вас установлен VisualC и что VCIncludePath указывает на правильное местоположение (github 's указывает на версию VC9.0, и вам может потребоваться изменить ее). После компиляции файла .rc полученный файл .res добавляется в качестве ресурса для вашего исполняемого файла с помощью директивы Win32Resource. mistika
@ComradeJoecool Я преобразовал свой комментарий вanswer, Я пробовал это несколько раз, и у меня не было "файла не найдено" вопрос. Вы повторно используете тот же экземпляр OpenFileDialog? Daniel Ballinger
@DanielBallinger ах, я нашел свою проблему, так как я использую Powershell для создания диалога, настройкиValidateNames а такжеCheckFileExists вfalse не работал, мне нужно было установить их0 (или лучше изучите PowerShell) ComradeJoecool

Ваш Ответ

7   ответов
15

Есть хакерское решение, использующееOpenFileDialog гдеValidateNames а такжеCheckFileExists оба установлены в ложь иFileName дается фиктивное значение, чтобы указать, что каталог выбран.

Я говорю хак, потому что это сбивает с толку пользователей о том, как выбрать папку. Они должны быть в нужной папке, а затем просто нажать «Открыть», пока имя файла говорит «Выбор папки».

C# Folder selection dialog

Это основано наВыберите файл или папку из того же диалога Денис Станковский.

OpenFileDialog folderBrowser = new OpenFileDialog();
// Set validate names and check file exists to false otherwise windows will
// not let you select "Folder Selection."
folderBrowser.ValidateNames = false;
folderBrowser.CheckFileExists = false;
folderBrowser.CheckPathExists = true;
// Always default to Folder Selection.
folderBrowser.FileName = "Folder Selection.";
if (folderBrowser.ShowDialog() == DialogResult.OK)
{
    string folderPath = Path.GetDirectoryName(folderBrowser.FileName);
    // ...
}
Я вижу, да, я получил это работает. Одна раздражающая вещь в том, чтоFolder Selection. будет прикреплен к концу имени файла так:C:\Folder Selection. Я думаю, вы всегда можете удалить эти символы из строки. По-прежнему выглядит лучше, чем FolderBrowserDialog
@Lokiare Вот что я имел в виду, когда сказал, что это взлом. Смотрите инструкции из второго абзаца.
Это не работает для меня. Это не позволит мне выбрать папки. Это просто открывает их.
@ComradeJoecool, вам не нужно вручную удалять это вручную. Вот для чего предназначена последняя строка в коде: string folderPath = Path.GetDirectoryName (folderBrowser.FileName);
151

Как примечание для будущих пользователей, которые хотели бы избежать использованияFolderBrowserDialogMicrosoft использовала для выпуска API под названием WindowsAPICodePack, который имел полезный диалог под названиемCommonOpenFileDialog, который может быть установлен вIsFolderPicker Режим.

Если у вас есть доступ к пакетам nuget, он все еще доступен в общедоступных списках какWindowsAPICodePack

Для строки включения:

using Microsoft.WindowsAPICodePack.Dialogs;

Использование:

CommonOpenFileDialog dialog = new CommonOpenFileDialog();
dialog.InitialDirectory = "C:\\Users";
dialog.IsFolderPicker = true;
if (dialog.ShowDialog() == CommonFileDialogResult.Ok)
{
    MessageBox.Show("You selected: " + dialog.FileName);
}

NOTICE: Official Microsoft Nuget Package is available now

  • Microsoft.WindowsAPICodePack-Core
  • Microsoft.WindowsAPICodePack-Shell

каждый пакет от Microsoft и будет устанавливать оба.
URL проекта:http://code.msdn.microsoft.com/WindowsAPICodePack.

Пользователь NuGetaybe Пользователь загрузил серию неофициальных пакетов. Большинство людей, кажется, доверяют ему как надежному источнику.

Это все, что мне нужно было установить, чтобы использоватьCommonOpenFileDialog, (nuget обработал зависимости)

Install-Package WindowsAPICodePack-Shell
@smwikipedia Я думаю, что если вы установите WindowsAPICodePack через Nuget, у вас автоматически установится .Shell. По крайней мере, это мой случай.
@ Энтони нет, ты не будешь. Я только что подтвердил это. Оболочка должна быть добавлена вручную. Я проверял это в Visual Studio 2013. Не уверен насчет 2015, 2017 и т. Д.
Это должно быть ответом. И обратите внимание, что вам нужно установитьMicrosoft.WindowsAPICodePack.Shell пакет через NuGet, прежде чем вы можете использовать этоCommonOpenFileDialog.
Я думаю, что это ближайший ответ на вопрос "Как использовать OpenFileDialog для выбора папки?" FolderBrowseDialog очень непригоден для использования. Спасибо за этот ответ.
Это выбирает один файл, а не папку ...
2

Вот еще одно решение, в котором весь источник доступен в одном простом ZIP-файле.

Он представляет OpenFileDialog с дополнительными флагами Windows, что делает его похожим на диалог выбора папок Windows 7+.

Для данного веб-сайта это общественное достояние: «Там нет лицензии, как таковой, так как вы можете взять и делать с кодом то, что вы будете». & Quot;

Ссылки на Archive.org:

Работай отлично! Также вы можете выбрать несколько папок, добавив эту строку в & quot; FolderSelectDialog.cs & quot; : public string [] FileNames {get {return ofd.FileNames; }} и change ofd.Multiselect = true; в конструкторе
21

Странно, что столько ответов / голосов, но никто не добавляет следующий код в качестве ответа:

using (var fldrDlg = new FolderBrowserDialog())
{ 
    //fldrDlg.Filter = "Png Files (*.png)|*.png";
    //fldrDlg.Filter = "Excel Files (*.xls, *.xlsx)|*.xls;*.xlsx|CSV Files (*.csv)|*.csv"

    if (fldrDlg.ShowDialog() == DialogResult.OK)
    {
        //fldrDlg.SelectedPath -- your result
    }
}
Логика та же, но мой ответ намного короче, и вам не нужно создавать дополнительную переменную для DialogResult.
Есть ли разница между вашим ответом и @ Ionic & # x103; Biz & # x103; UAnswer?
14

Звучит так же, как и вы, сразу послеFolderBrowserDialog.

Я предполагаю, что это получает отрицательную оценку b / c (как уже указала мистика), FolderBrowserDialog имеет ужасное удобство использования, и OP явно хотел использовать OpenFileDialog.
@mbx Возможно. Чтобы быть справедливым, OP не говорит "я не могу использовать ничего, кроме OpenFileDialog". Когда я первоначально ответил на это (более 4 с половиной лет назад ...), предполагалось, что ОП просто не знает, как позволить пользователю открыть папку. Я действительно не вернулся к этому вопросу после публикации этого ответа, поэтому я не видел ни одной дискуссии о юзабилити - и я не учел ее при ответе.
336

В основном вам нужноFolderBrowserDialog учебный класс:

Prompts the user to select a folder. This class cannot be inherited.

Пример:

using(var fbd = new FolderBrowserDialog())
{
    DialogResult result = fbd.ShowDialog();

    if (result == DialogResult.OK && !string.IsNullOrWhiteSpace(fbd.SelectedPath))
    {
        string[] files = Directory.GetFiles(fbd.SelectedPath);

        System.Windows.Forms.MessageBox.Show("Files found: " + files.Length.ToString(), "Message");
    }
}

Если вы работаете вWPF Вы должны добавить ссылку наSystem.Windows.Forms.

Вы также должны добавитьusing System.IO заDirectory учебный класс

FolderBrowserDialog не хватает удобства использования. Основным недостатком является то, что он не позволяет копировать путь к папке из Проводника Windows для быстрой навигации, что делает его бесполезным, когда вам необходимо детализировать более трех уровней. Детализация в каждой папке нежелательна, особенно когда хранилище медленное или когда у вас много папок на одном из уровней.
Пожалуйста,don't ever use it! Я помню, как пользователь, я обвинял этих бедных программистов, которые сделали еще одно приложение с этим ужаснымtree view dialog (which is just the FolderBrowserDialog), Он совершенно непригоден для использования: куча корневых папок, отсутствующая панель избранного и самые ужасные & # x2014; Вы даже не можете вставить туда путь! И теперь, как программист, я вижу совет по его использованию & # x2026; Пожалуйста, не делайте этого.
@clairestreb, предложение в оригинальном посте. Он ссылается на решение, которое также использует OpenFileDialog для открытия папок. OP просто не может скомпилировать его, и мой комментарий описывает, как это сделать.
В качестве альтернативы этому диалогу со сломанным пользовательским интерфейсом, используйтеCommonOpenFileDialog: new CommonOpenFileDialog { IsFolderPicker = true }.
Диалоги ookii (www.ookii.org/Software/Dialogs/) чрезвычайно полезны для этого.
0

Посмотрите наOokii Dialogs библиотеки, в которых реализован диалог браузера папок для Windows Forms и WPF соответственно.

enter image description here

Ookii.Dialogs.WinForms

https://github.com/caioproiete/ookii-dialogs-winforms


Ookii.Dialogs.Wpf

https://github.com/caioproiete/ookii-dialogs-wpf

Похожие вопросы