Продолжайте открывать OpenFileDialog, пока не выберете действительный файл

У меня есть код, который открывает OpenFileDialog, я проверяю размер файла, чтобы убедиться, что он не превышает определенный предел. Но если пользователь выбрал файл большого размера, мне нужно его предупредить и вернуть в диалоговое окно, чтобы выбрать другой файл или нажать «Отмена».

Вот что я пробовал:

        OpenFileDialog dialog = new OpenFileDialog();
        dialog.Filter = "Jpeg files, PDF files, Word files|*.jpg;*.pdf;*.doc;*.docx";
        while (dialog.ShowDialog() != DialogResult.Cancel)
        {
                var size = new FileInfo(dialog.FileName).Length;
                if (size > 250000)
                {
                    MessageBox.Show("File size exceeded");
                    continue;
                }
        }

РЕДАКТИРОВАТЬ: Я также пробовал следующий код, но он открывает диалоговое окно каждый раз, когда вызывается ShowDialog. Итак, если пользователь выбрал файл, в 3 раза превышающий предельный размер, диалоговое окно появится 3 раза.

  OpenFileDialog dialog = new OpenFileDialog();
        dialog.Filter = "Jpeg files, PDF files, Word files|*.jpg;*.pdf;*.doc;*.docx";
        dialog.FileOk += delegate(object s, CancelEventArgs ev)
        {
            var size = new FileInfo(dialog.FileName).Length;
            if (size > 250000)
            {
                XtraMessageBox.Show("File size");
                dialog.ShowDialog();
            }
        };
        if (dialog.ShowDialog() == DialogResult.OK)
        {
            XtraMessageBox.Show("File Selected");
        }

person Nour    schedule 07.10.2012    source источник


Ответы (4)


Вы на полпути, событие FileOk - это то, что вы хотите использовать. Вам не хватает установки для свойства e.Cancel значения true. Это сохраняет диалог открытым и избавляет от необходимости отображать его снова и снова. Нравится:

        OpenFileDialog dialog = new OpenFileDialog();
        dialog.Filter = "Jpeg files, PDF files, Word files|*.jpg;*.pdf;*.doc;*.docx";
        dialog.FileOk += delegate(object s, CancelEventArgs ev) {
            var size = new FileInfo(dialog.FileName).Length;
            if (size > 250000) {
                MessageBox.Show("Sorry, file is too large");
                ev.Cancel = true;             // <== here
            }
        };
        if (dialog.ShowDialog() == DialogResult.OK) {
            MessageBox.Show(dialog.FileName + " selected");
        }
person Hans Passant    schedule 07.10.2012
comment
Бинго, +1 за правильный ответ, на самом деле мой подход правильный, но ему не хватает else break; после (если). но это заставляет диалоговое окно мигать, ваш способ будет держать диалог открытым и показывать сообщение перед закрытием. Большое спасибо. - person Nour; 08.10.2012

ev.Cancel = true; Проверить, служит ли следующий фрагмент кода вашей цели?

    public void SomeMethod()
    {
        OpenFileDialog dialog = new OpenFileDialog();
        dialog.FileOk += new CancelEventHandler(dialog_FileOk);
        dialog.Filter = "Jpeg files, PDF files, Word files|*.jpg;*.pdf;*.doc;*.docx";
        dialog.ShowDialog();
    }

    void dialog_FileOk(object sender, CancelEventArgs e)
    {
        OpenFileDialog dialog = sender as  OpenFileDialog;
        var size = new FileInfo(dialog.FileName).Length;
        if (size > 250000)
        {
            MessageBox.Show("File size exceeded");
            e.Cancel = true;
          }

    }
person RockWorld    schedule 07.10.2012
comment
На самом деле я пробовал аналогичный способ, но он открывает диалоговое окно для каждого выбранного неправильного файла, я отредактирую вопрос, чтобы добавить код. - person Nour; 07.10.2012

Да, что касается ваших требований, это нормально, но в целом открытие диалогового окна после отображения подсказки для размера - не лучший способ. Вместо этого должно отображаться приглашение, лучше всего отображать ошибку проверки размера из главного окна. Пользователь должен снова выбрать нужный файл, снова открыв диалоговое окно файла, в соответствии с принципами удобства использования HCI.

person Furqan Safdar    schedule 07.10.2012
comment
Ваш довольно правильный, но закрытие диалогового окна и затем отображение значка ошибки проверки заставляет пользователя снова открыть диалоговое окно, перейти в ту же папку и снова проверить, что усложняет ему задачу. - person Nour; 08.10.2012

Добавьте обработчик в FileDialog.FileOk и позвольте проверить размер файла внутри их.

person dotINSolution    schedule 07.10.2012
comment
Спасибо, но посмотрите новую версию вопроса. - person Nour; 07.10.2012