Winform中ReportViewer控件如何隐藏导出时的“正在导出”提示弹窗
Winform ReportViewer 隐藏导出进度提示窗口解决方案
你之前尝试的方法失效的核心原因:
- 原生导出流程的进度窗口是ReportViewer内部异步创建的,同步遍历窗口集合时大概率还未生成
- 该窗口属于顶级独立窗体,不是ReportViewer的子控件,所以无法通过
Controls.Find方法找到 - 第一个方法存在拼写错误:
Applictaion应为Application,窗体标题属性为Text而非Title
方案1:自定义导出逻辑(最稳定,推荐)
完全绕开原生导出按钮的流程,自己调用ReportViewer的Render方法实现导出,不会触发进度提示窗口:
using System.IO; using Microsoft.Reporting.WinForms; private void CustomExportPdf() { Warning[] warnings; string[] streamIds; string mimeType; string encoding; string extension; // 直接渲染为PDF字节流,无进度提示 byte[] pdfBytes = reportViewer1.LocalReport.Render( "PDF", null, out mimeType, out encoding, out extension, out streamIds, out warnings ); // 自定义保存对话框 SaveFileDialog saveDlg = new SaveFileDialog(); saveDlg.Filter = "PDF文件(*.pdf)|*.pdf"; saveDlg.FileName = "报表导出.pdf"; if (saveDlg.ShowDialog() == DialogResult.OK) { File.WriteAllBytes(saveDlg.FileName, pdfBytes); MessageBox.Show("导出完成"); } }
使用说明:你可以在界面新增自定义导出按钮调用该方法,也可以替换原生导出按钮的点击事件触发该逻辑,全程不会出现「正在导出」提示窗口。
方案2:拦截原生流程的进度窗口
如果必须保留原生导出按钮的使用逻辑,可以通过Windows API异步轮询查找窗口并隐藏:
using System.Runtime.InteropServices; // 导入Win32 API [DllImport("user32.dll", CharSet = CharSet.Auto)] private static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll", CharSet = CharSet.Auto)] private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); private const int SW_HIDE = 0; // 点击导出按钮后调用该方法,异步隐藏进度窗口 private async void HideExportProgressWindow() { // 轮询2秒,每100ms查找一次窗口 for(int i = 0; i < 20; i++) { // 英文系统将第二个参数改为"Exporting" IntPtr hwnd = FindWindow(null, "正在导出"); if(hwnd != IntPtr.Zero) { ShowWindow(hwnd, SW_HIDE); break; } await Task.Delay(100); } }
使用说明:需确保窗口标题和你当前系统语言的ReportViewer提示标题一致即可生效。
内容的提问来源于stack exchange,提问作者BlueSkyCaps
相关产品推荐
相关产品推荐

