Как я могу изменить расширение имени файла в SaveFileDialog, когда пользователь меняет фильтр?

2

В нашем приложении есть SaveFileDialog, который предлагает различные форматы, в которые пользователь может экспортировать медиа. Мы определяем выбор формата пользователя с использованием свойства FilterIndex SaveFileDialog. Различные форматы имеют разные расширения файлов, поэтому нам нужно, чтобы имя файла, которое пользователь ввел для изменения расширения, когда пользователь меняет выбранный фильтр. Возможно ли это, и если да, то как?

EDIT: Я хочу, чтобы это произошло во время отображения диалогового окна, когда пользователь меняет фильтр, поэтому пользователь получает обратную связь о том, каким будет имя файла, а не потом, когда пользователь закрывает диалог. Я пробовал использовать фильтр сообщений, но он не получает сообщений для диалога. Я пробовал Application.Idle, но это никогда не срабатывает во время работы диалога. Я пробовал фоновый поток, но FilterIndex не обновляется до тех пор, пока пользователь не закроет диалог.

  • 3
    Я предполагаю, что вы хотите изменить расширение внутри SaveFileDialog, а не после закрытия диалога? В этом случае вы должны настаивать на этом. Учитывая несколько ответов, это не всем понятно. В противном случае, не читайте мой ответ!
  • 0
    То же самое с моим ответом, основанным на моем ответе на том факте, что свойство FileName уже содержит расширение и что было бы две возможности изменить его с помощью фильтра, как показано в моем ответе.
Показать ещё 1 комментарий
Теги:
winforms
savefiledialog

3 ответа

1
Лучший ответ

Поскольку SaveFileDialog нельзя унаследовать, я думаю, вы должны создать свой собственный, используя FileDialog в качестве базового класса.

0

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

...
if (saveDialog.ShowDialog() == DialogResult.OK)
{
    switch (saveDialog.FilterIndex)
    { 
        case 0:
            ...
            break;
        case 1:
            ...
            break;
        default:
            ...
            break;
    }
}
...
  • 0
    SaveFileDialog не меняет расширение. Я проверил
  • 1
    Это меняет расширение. Доверьтесь мне.
Показать ещё 3 комментария
-1

Добавьте свои фильтры:

saveFileDialog1.Filter = "txt files (*.txt)|*.txt|Word files (*.doc)|*.doc";

то

if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
  switch (saveFileDialog1.FilterIndex)
  {
    case 1:
      saveFileDialog1.FileName = System.IO.Path.ChangeExtension(saveFileDialog1.FileName, "txt");
      break;
    case 2:
      saveFileDialog1.FileName = System.IO.Path.ChangeExtension(saveFileDialog1.FileName, "doc");
      break;
  }
  // Here you would save your file with the filename in saveFileDialog1.FileName.
  MessageBox.Show(saveFileDialog1.FileName);
}

Повторите дважды, сначала выберите "txt файлы", затем "Файлы Word". Введите "test" в качестве имени файла.
Вы увидите, что имя файла отличается в обоих случаях: text.txt и test.doc.

Если вы введете имя файла с расширением типа "test.htm", расширение будет изменено при переключении фильтра.

Если вы введете имя файла типа "test.htm" и НЕ меняете фильтр, то корпус коммутатора заботится о расширении для вас.

  • 0
    SaveFileDialog действительно изменяет расширение, если он уже ввел расширение. ЕСЛИ он переключает фильтр. Если он этого не делает, расширение не изменяется, но, как предложил Иван Бурклов, он может проверить FilterIndex, а затем изменить его вручную.
  • 0
    Файл не сохраняется, пока он не сохранит его. Он может обработать имя файла так, как ему захочется, прежде чем он его сохранит.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню