Исключение расширений файлов из диалога открытия файлов в C # - PullRequest
4 голосов
/ 28 мая 2009

Я пытаюсь установить фильтр на моем C # openFileDialog, который исключает определенные расширения файлов. Например, я хочу, чтобы он показывал все файлы в каталоге, которые не являются файлами .txt.

Есть ли способ сделать это?

Ответы [ 6 ]

4 голосов
/ 28 мая 2009

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

Лучше всего позволить им выбрать все файлы, а затем попросить пользователя выбрать тот, который не разрешен, ИЛИ отфильтровать его по всем возможным файлам, с которыми вы можете иметь дело.

2 голосов
/ 28 мая 2009

Нет прямого способа сделать это с помощью BCL OpenFileDialog.

Я могу придумать пару вариантов:

1) Создайте фильтр, в котором есть все типы, которые вы хотите поддерживать. Это моя рекомендация, так как это наиболее распространенный способ выполнения операций такого типа.

2) Используйте что-то вроде этой пользовательской реализации OpenFileDialog . Затем можно переопределить метод OnFileNameChanged (), чтобы потенциально отключить кнопку «Открыть», если выбранный файл имеет расширение .txt.

3) Позвольте пользователю выбрать файл .txt, вызвать диалоговое окно с ошибкой и снова открыть диалоговое окно файла. Это кажется мне неуклюжим и не слишком большим для меня ...

1 голос
/ 28 мая 2009

Найдено с помощью поиска Google "OpenFileDialog"

РЕДАКТИРОВАТЬ: Извините, что не расширил аспекты ИСКЛЮЧЕНИЯ. Возможно, вам не нужно идти в такой крайности, но это будет соответствовать вашим потребностям ....

  • Выполните рекурсивный поиск в каталоге всех файлов, которые пользователь может выбрать. (Надеюсь, это небольшой набор папок.)
  • Уникально идентифицируйте расширения в этих файлах. (System.IO.Path.GetExtension () и метод Linq .Distint () могут хорошо работать здесь)
  • Удалить запись «.txt» из списка.
  • Создайте строку фильтра, просматривая эти расширения.
0 голосов
/ 29 мая 2009

Нельзя установить фильтр на , исключить расширения из файловых диалогов.

Однако вы можете реализовать делегата для события FileOk в диалоговом окне. Это событие вызывается непосредственно перед тем, как файл, выбранный пользователем, будет принят, а аргументы события предоставляют свойство Cancel, которое можно установить для запрета выбора.

Это не так элегантно, как на самом деле сделать неправильные файлы невидимыми, но это позволит вам запретить выбор неправильного типа файлов.

PS: Не забудьте сообщить пользователю, почему файл не был принят, в противном случае у них может возникнуть вопрос, почему диалоговое окно не закрывается при выборе файла 'txt'.

0 голосов
/ 28 мая 2009

Это совершенно другой подход, который вы вряд ли будете использовать.

Вместо использования OpenFileDialog, проанализируйте нужные вам функции и создайте свое собственное диалоговое окно. Вы можете легко предоставить любую фильтрацию, какую захотите, но затем трудность переходит к реализации и поддержке нового пользовательского интерфейса.

Я не советую вам это делать, но иногда пользователи довольно настаивают на том, что им нужно.

Другой альтернативный вариант: вместо использования диалога придумайте что-то совершенно другое, что хорошо вписывается в приложение. Это может быть невозможно, но тогда мы мало что знаем о приложении.

0 голосов
/ 28 мая 2009

Боюсь, это невозможно. Вам либо придется

  • a) Включите длинный список всех расширений, которые должны быть разрешены, или

  • b) Разрешить все расширения, а затем использовать простой код регистрации, который открывает диалоговое окно, если выбранный файл имеет расширение .txt.

Кроме того, не могли бы вы предоставить немного больше контекста для этого вопроса? У меня возникли проблемы при рассмотрении сценария, в котором мне может понадобиться исключить определенного расширения. Вероятно, вы не можете обойтись просто фильтром (и, возможно, небольшой проверкой кода) почти во всех ситуациях.

...