取消打开文件对话框时,如何防止出现异常

本文关键字:何防止 异常 文件 对话框 取消 | 更新日期: 2023-09-27 18:19:45

我的程序有一个按钮,点击后会打开一个打开的文件对话框来选择图片:

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可以处理哪一部分,但我不确定是哪一部分导致了问题?如果我在对ChoosePicture()方法的调用周围放一个try catch,我至少可以阻止它崩溃程序,但当在fdialogbox中没有选择图片时,仍然会抛出异常。

取消打开文件对话框时,如何防止出现异常

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

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

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

我防止这样的错误。