取消openfiledialog时如何防止异常?

时间:2012-01-05 20:54:51

标签: c# image exception file-io 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();
}

使用对话框框上的检查未解决我的问题:

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 个答案:

答案 0 :(得分:14)

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()

编辑:修复缩进

答案 1 :(得分:2)

检查对话框结果并采取相应措施:

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
        }
}

答案 2 :(得分:1)

测试是否选择了文件:

   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;
    }

答案 3 :(得分:1)

DialogResult dresult=fDialog.ShowDialog();

检查是否dresult==DialogResult.Ok并且仅在继续文件操作之后。

答案 4 :(得分:1)

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();

代码中的

将知道他们应该在显示对话框之前添加这些属性。同样,这些真值是默认值,所以除非你在其他地方之前提到过false并在此处将其设为真。

答案 5 :(得分:1)

你可以这样做,而不是return fDialog.FileName;DialogResult.Cancel是一个更好的选择,因为你寻找取消而不是OK结果。

 DialogResult result = fDialog.ShowDialog();
                if (result == DialogResult.Cancel)
                {
                    return;
                }

答案 6 :(得分:0)

我添加了一个布尔值,并检查是否选择了文件

protected:
        char tbuf[100];
        FILE *tFile;
        int choice;
        unsigned long int  pkt_received;
        unsigned long int I_pkt_rec;
        unsigned long int P_pkt_rec;

        double start_time;
        playbackbuffer* plb;
};

我避免了这种错误。