Как я могу предотвратить исключение при отмене openfiledialog? - PullRequest
8 голосов
/ 06 января 2012

В моей программе есть кнопка, которая при нажатии открывает файл с открытым файлом для выбора картинки:

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 ]

14 голосов
/ 06 января 2012
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() для нее

EDIT : исправлено отступление

2 голосов
/ 06 января 2012

Проверьте результат диалога и действуйте соответственно:

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
        }
}
1 голос
/ 04 января 2017

Вы можете просто сделать это так вместо return fDialog.FileName; и DialogResult.Cancel - лучший вариант, так как вы ищете отмену, а не результат OK

 DialogResult result = fDialog.ShowDialog();
                if (result == DialogResult.Cancel)
                {
                    return;
                }
1 голос
/ 06 января 2012
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();

в коде, будет знать, что он должен выполнить добавление этих свойств перед отображением диалогового окна.Опять же, эти истинные значения по умолчанию, поэтому, если вы не упомянули ложь раньше и не сделали это истинным здесь.

1 голос
/ 06 января 2012

DialogResult dresult=fDialog.ShowDialog();

Проверьте, если dresult==DialogResult.Ok и только после продолжения файловых операций.

1 голос
/ 06 января 2012

Тест, чтобы увидеть, был ли выбран файл:

   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;
    }
0 голосов
/ 15 августа 2018

я добавил логическое значение и проверил, выбран файл или нет

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

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

...