System.Windows.Forms.SaveFileDialog не применяет расширение по умолчанию

Я пытаюсь заставить SaveFileDialog и FileOpenDialog применить расширение к имени файла, введенному пользователем. Я попытался использовать образец, предложенный в question 389070, но это не работает должным образом:

var dialog = new SaveFileDialog())

dialog.AddExtension = true;
dialog.DefaultExt = "foo";
dialog.Filter = "Foo Document (*.foo)|*.foo";

if (dialog.ShowDialog() == DialogResult.OK)
{
    ...
}

Если пользователь вводит текст test в папке, где существует файл test.xml, диалоговое окно предложит имя test.xml (тогда как я действительно хочу видеть только *.foo в списке). Хуже того: если пользователь выберет test.xml, то я действительно получу test.xml в качестве имени выходного файла.

Как я могу убедиться, что SaveFileDialog действительно позволяет пользователю выбирать только файл *.foo? Или, по крайней мере, что он заменяет/добавляет расширение, когда пользователь нажимает Save?

Предлагаемые решения (реализовать обработчик события FileOk) выполняют только часть работы, так как я действительно хотел бы отключить кнопку Save, если имя файла имеет неправильное расширение.

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


person Pierre Arnaud    schedule 21.10.2009    source источник
comment
Я не уверен, но вы можете попробовать установить для MultipleDottedExtensions значение True, возможно, это изменит это поведение.   -  person Bobby    schedule 02.11.2009
comment
Нет, это вообще ничего не меняет; но спасибо за подсказку.   -  person Pierre Arnaud    schedule 03.11.2009


Ответы (5)


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

person Darin Dimitrov    schedule 21.10.2009

Вы можете обработать событие FileOk, и отмените его, если это не правильное расширение

private saveFileDialog_FileOk(object sender, CancelEventArgs e)
{
    if (!saveFileDialog.FileName.EndsWith(".foo"))
    {
        MessageBox.Show("Please select a filename with the '.foo' extension");
        e.Cancel = true;
    }
}
person Thomas Levesque    schedule 02.11.2009

Ближайшее, что у меня есть, это использование события FileOk. Например:

dialog.FileOk += openFileDialog1_FileOk;

private void openFileDialog1_FileOk(object sender, System.ComponentModel.CancelEventArgs e)
{
  if(!dialog.FileName.EndsWith(".foo"))
  { 
     e.Cancel = true;
  }
}

Проверьте событие FileOK в MSDN.

person Ian    schedule 02.11.2009

Я столкнулся с этой же проблемой и смог контролировать то, что было показано, выполнив следующие действия:

с OpenFileDialog первый элемент в строке фильтра был значением по умолчанию.

openFileDialog1.Filter = "Program x Files (*.pxf)|*.pxf|txt files (*.txt)|*.txt";
openFileDialog1.ShowDialog();

с SaveFileDialog второй элемент в фильтре использовался по умолчанию:

SaveFileDialog saveFileDialog1 = new SaveFileDialog();

saveFileDialog1.Filter = "txt files (*.txt)|*.txt|Program x Files (*.pxf)|*.pxf";
saveFileDialog1.FilterIndex = 2;
saveFileDialog1.RestoreDirectory = true;

if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
    if (saveFileDialog1.FileName != null)
    {
        // User has typed in a filename and did not click cancel
        saveFile = saveFileDialog1.FileName;
        MessageBox.Show(saveFile);
        saveCurrentState();

    }
} 

После использования этих двух фильтров с соответствующими файловыми диалогами наконец-то произошли ожидаемые результаты. По умолчанию, когда пользователь нажимает кнопку сохранения и появляется диалоговое окно сохранения файла, выбранный тип файла соответствует типу файлов Program X, определенному в фильтре для диалогового окна сохранения файла. Точно так же тип файла, выбранный для диалога openfiledialog, является типом файлов Program X, определенным в фильтре для диалога openfileDialog.

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

person John Bartels    schedule 19.02.2012
comment
Нет, извините, вы не правильно поняли мою проблему: с вашим примером кода для SaveFileDialog ничто не мешает пользователю ввести foo и заставить Windows предложить имя файла foo.xml, если в открытой папке есть файл XML с таким именем. В настоящее время вы не можете убедиться, что выбранное имя файла соответствует выбранному расширению *.pfx (в вашем случае). - person Pierre Arnaud; 23.02.2012

person    schedule
comment
Отключение функции автозаполнения немного жестко, не так ли? - person Pierre Arnaud; 25.02.2012