取消openfiledialog时如何防止exception?

我的程序有一个按钮,当点击它打开一个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; 

如果我选择图片并完成文件选择,代码就可以工作。 但是,如果我在两者之间的任何时候取消该过程,我会得到例外情况“路径不是合法forms”。 我不确定哪个部分我想象我可以用try-catch来处理这个问题,但是我不肯定哪个部分导致问题? 如果我try catch调用ChoosePicture()方法,我至少可以阻止它崩溃程序,但是当fdialogbox中没有选择图片时仍然会抛出exception。

 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; 

现在它会起作用!

我们应该在对话框实际显示之前添加属性。 因此,当它打开时,它将在您第一次打开它时具有所有这些属性。

编辑:好的,您已经通过工具箱添加到设计器中,默认情况下所有这些选项。 但如果有人从代码中添加。 应始终在展示之前。 我会把它留在这里。 所以有人这样做

this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();

在代码中,将知道他们应该在显示对话框之前添加这些属性。 同样,这些真值是默认的,所以除非你在其他地方之前提到过假,并且在这里做到了。

你可以这样做,而不是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."); } } 

我这样防止这个错误。