继续打开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; } } 

编辑:在尝试之前我尝试了以下代码:

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

但每次调用ShowDialog时它都会打开对话框,因此如果用户选择了3次大尺寸的文件,对话框将出现3次。

你在中途,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"); } 

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

是的,只要你的需求是关注的,这是可以的,但一般在显示提示大小后打开对话框不是最好的方法。 应该显示一个提示,最好是在主窗口中显示大小的validation错误。 根据HCI的可用性原则,再次打开文件对话框应该是用户有责任再次选择正确的文件。

向FileDialog.FileOk添加一个处理程序,并validation其中的文件大小。