Как предотвратить исключение при отмене openfiledialog?
моя программа имеет кнопку, которая при нажатии открывает openfiledialog, чтобы выбрать изображение:
private string ChoosePicture()
{
fDialog.Title = "Select Picture";
fDialog.Filter = "Image Files (*.bmp, *.gif, *.jpg)|*.bmp; *.gif*;*.jpg";
fDialog.InitialDirectory = "C:";
fDialog.ShowDialog();
fDialog.AddExtension = true;
fDialog.CheckFileExists = true;
fDialog.CheckPathExists = true;
//returns a string for the directory
return fDialog.FileName.ToString();
}
использование флажка в диалоговом окне dialogresult также не разрешило мою проблему:
fDialog.AddExtension = true;
fDialog.CheckFileExists = true;
fDialog.CheckPathExists = true;
DialogResult res = fDialog.ShowDialog();
if (res == DialogResult.OK)
{
//returns a string for the directory
return fDialog.FileName.ToString();
}
return null;
код работает, если я выберу изображение и завершу выбор файла. Однако, если я отменяю процесс в любой момент между ними, я получаю исключение "путь не имеет юридической формы". Я не уверен, какую часть я себе представляю, я мог бы позаботиться об этом с try-catch
, но я не уверен, какая часть вызывает проблему? Если я поставлю try catch
по вызову ChoosePicture()
метод, я могу, по крайней мере, остановить его от сбоя программы, но исключение все еще бросается, когда изображение не выбрано в fdialogbox.
7 ответов
DialogResult result = fileDialog.ShowDialog();
if (result == DialogResult.OK) {
//returns a string for the directory
return fDialog.FileName;
}
return null; //not sure what you will return if they cancel
кроме того, FileName уже является строкой, поэтому не нужно использовать .ToString()
на
редактировать: исправлены отступы
проверьте результат диалога и действуйте соответственно:
private string ChoosePicture()
{
fDialog.Title = "Select Picture";
fDialog.Filter = "Image Files (*.bmp, *.gif, *.jpg)|*.bmp; *.gif*;*.jpg";
fDialog.InitialDirectory = "C:";
DialogResult res = fDialog.ShowDialog();
if(res == DialogResult.OK)
{
fDialog.AddExtension = true;
fDialog.CheckFileExists = true;
fDialog.CheckPathExists = true;
//returns a string for the directory
return fDialog.FileName.ToString();
}
else
{
return null; // or something
}
}
Проверьте, был ли выбран файл:
fDialog.ShowDialog();
if (!string.IsNullOrEmpty(fDialog.FileName))
{
fDialog.AddExtension = true;
fDialog.CheckFileExists = true;
fDialog.CheckPathExists = true;
//returns a string for the directory
return fDialog.FileName.ToString();
} else {
return String.Empty;
}
DialogResult dresult=fDialog.ShowDialog();
проверить, если dresult==DialogResult.Ok
и только после продолжения файловых операций.
fDialog.AddExtension = true;
fDialog.CheckFileExists = true;
fDialog.CheckPathExists = true;
DialogResult res = fDialog.ShowDialog();
if (res == DialogResult.OK)
{
//returns a string for the directory
return fDialog.FileName.ToString();
}
return null;
теперь это будет работать !
мы должны добавить свойства в диалоговое окно, прежде чем оно будет показано. Поэтому, когда он откроется, он будет иметь все эти свойства, когда вы откроете их в первый раз.
Edit: хорошо, вы уже добавили в конструктор панель инструментов и по умолчанию все эти параметры. но если некоторые добавляют из кода. она должна быть всегда до того, как ее покажут. Я оставлю это здесь. так что кто-то, кто это делает
this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
в коде будет знать, что они должны сделать это добавление свойств перед отображением диалога. Опять же, эти истинные значения по умолчанию так, если вы не упомянули false раньше в другом месте и не сделали его истинным здесь.
вы можете просто сделать это вместо return fDialog.FileName;
и DialogResult.Cancel
является лучшим вариантом, так как вы ищете отмену, а не для результата OK.
DialogResult result = fDialog.ShowDialog();
if (result == DialogResult.Cancel)
{
return;
}
Я добавил логическое значение и проверил, выбран ли файл или нет
public Form1()
{
InitializeComponent();
}
bool fileSelected = false; //default false because nothing selected at start.
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
openFile();
if (fileSelected == true)
{
codes...
}
}
string path= "";
private void openFile()
{
OpenFileDialog file= new OpenFileDialog();
file.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
file.Filter = "Text File|*.txt";
//file.RestoreDirectory = true;
if (file.ShowDialog() == DialogResult.OK)
{
path= dosya.FileName;
fileSelected = true;
}
else
{
MessageBox.Show("File not selected.");
}
}
Я предотвращаю эту ошибку.