【问题标题】:How can I prevent an exception when I cancel an openfiledialog?取消 openfiledialog 时如何防止异常?
【发布时间】:2012-02-03 16:47:28
【问题描述】:

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

【问题讨论】:

  • 将 Dialogresult 的代码包装在 If else 语句周围
  • 发生这种情况是因为您忽略了 ShowDialog() 的返回值。也可能是不好的缩进。
  • 在实际显示对话框之前添加对话框约束。之后一切都完成了,这个检查根本不重要
  • 除非你是在设计器中设置,否则这个设置在第一次使用时其实对控件没有影响。
  • 听起来您需要在进一步处理之前检查从 ChoosePicture() 方法返回的值。如果该方法返回一个空字符串或 null,则不要继续进行。显示调用 ChoosePicture() 方法的代码

标签: c# image exception file-io openfiledialog


【解决方案1】:
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()

编辑:固定缩进

【讨论】:

  • 我试过你的结果,仍然抛出错误:“路径不是合法形式”
  • 您在哪一行得到错误。如果您取消对话框,则它永远不应落入它对 FileName 属性执行任何操作的块中。在if语句上设置一个断点,点击Cancel时让我们知道result的值是什么
  • 我只是拿了你的原始代码并尝试了它,即使尝试获取文件名我也没有收到错误,它是一个空字符串。从 ChoosePicture() 方法返回值后是否发生错误?
  • 它发生在我基于返回值的其他值的其他地方。你的代码很好,我应该看看更大的范围。谢谢。
  • 在显示对话框之前保留文件对话框的属性。这种向控件添加属性的方式在第一次发生时没有任何意义
【解决方案2】:

测试是否选择了文件:

   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】:

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

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

    【讨论】:

    • 我试过你的结果,仍然抛出错误:“路径不是合法形式”
    • 它发生在我基于返回值的其他值的其他地方。你的代码很好,我应该看看更大的范围。谢谢。
    【解决方案4】:

    DialogResult dresult=fDialog.ShowDialog();

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

    【讨论】:

      【解决方案5】:
      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 并在此处设置为 true。

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

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

              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.");
                  }
              }
          

          我防止这样的错误。

          【讨论】:

            猜你喜欢
            • 2020-01-07
            • 2014-09-01
            • 1970-01-01
            • 1970-01-01
            • 2018-06-08
            • 2010-10-22
            • 1970-01-01
            • 2018-01-22
            • 1970-01-01
            相关资源
            最近更新 更多