【问题标题】:Keep opening OpenFileDialog until selecting valid file继续打开 OpenFileDialog 直到选择有效文件
【发布时间】:2012-09-27 18:55:09
【问题描述】:

我有打开 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");
        }

【问题讨论】:

    标签: c# .net while-loop openfiledialog


    【解决方案1】:

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

    【讨论】:

    • 实际上我尝试了类似的方法,但它会为每个选择的错误文件打开一次对话框,我将编辑问题以添加代码。
    【解决方案2】:

    您已经完成了一半,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");
            }
    

    【讨论】:

    • 宾果游戏,正确答案 +1,实际上我的方法是正确的,但它缺少 else 中断;在(如果)之后。但它会使对话框闪烁,您的方式将保持对话框打开并在关闭前显示消息。非常感谢。
    【解决方案3】:

    将处理程序添加到FileDialog.FileOk 并验证其内部的文件大小。

    【讨论】:

    • 谢谢,但请查看新版本的问题。
    【解决方案4】:

    是的,就您的要求而言,这是可以的,但通常在显示大小提示后打开对话框并不是最好的方法。相反,应该显示一个提示,最好是在主窗口中显示大小的验证错误。根据人机交互的可用性原则,用户有责任通过再次打开文件对话框再次选择正确的文件。

    【讨论】:

    • 您的说法相当正确,但关闭对话框然后显示验证错误图标,迫使用户再次打开对话框,浏览到同一文件夹并再次检查,这对他来说更难。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 2020-11-12
    • 2017-10-19
    相关资源
    最近更新 更多