Как предотвратить исключение при отмене 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.");
        }
    }

Я предотвращаю эту ошибку.