rdlc 套打實現

來源:互聯網
上載者:User

就是通過反射調用ReportViewer裡的函數實現套打功能,在WinForm下測試並正在使用,WebForm下未經測試,不知可否使用。

 在使用套打前不能ReportViewer.SetDisplayMode,Set後會造成列印兩份檔案出來,原因不清楚。

 1 public static class ReportViewerExt
 2     {
 3         /// <summary>
 4         /// 用預設印表機直接列印。
 5         /// </summary>
 6         /// <param name="reportViewer"></param>
 7         public static void DirectPrint(this ReportViewer reportViewer)
 8         {
 9             Type reportViewerType = reportViewer.GetType();
10 
11             FieldInfo printFieldInfo = reportViewerType.GetField("Print", 
12                 BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField);
13             CancelEventHandler printEvent = (CancelEventHandler)printFieldInfo.GetValue(reportViewer);
14             if (printEvent != null) { printEvent(reportViewer, null); }
15 
16             Object createEMFDeviceInfo = reportViewerType.InvokeMember("CreateEMFDeviceInfo", 
17                 BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod, null, 
18                 reportViewer, new object[] { 1, 1 });
19             Delegate createAndRegisterStream = Delegate.CreateDelegate(typeof(CreateAndRegisterStream), 
20                 reportViewer, reportViewerType.GetMethod("CreateStreamEMFPrintOnly", 
21                 BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod));
22             Type internalRenderingCompleteDelegateType = 
23                 reportViewerType.Assembly.GetType("Microsoft.Reporting.WinForms.InternalRenderingCompleteDelegate");
24             Delegate internalRenderingCompleteDelegate = Delegate.CreateDelegate(internalRenderingCompleteDelegateType, 
25                 reportViewer, reportViewerType.GetMethod("OnRenderingCompletePrintOnly", 
26                 BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod));
27             Type postRenderArgsType = reportViewerType.Assembly.GetType("Microsoft.Reporting.WinForms.PostRenderArgs");
28             Object postRenderArgs = Activator.CreateInstance(postRenderArgsType, false, true);
29             Object report = reportViewerType.InvokeMember("Report", BindingFlags.NonPublic | BindingFlags.GetProperty | 
30                 BindingFlags.Instance, null, reportViewer, null);
31             Object backgroundThread = reportViewerType.InvokeMember("BackgroundThread", BindingFlags.NonPublic | 
32                 BindingFlags.GetProperty | BindingFlags.Instance, null, reportViewer, null);
33             backgroundThread.GetType().InvokeMember("BeginRender", BindingFlags.Public | BindingFlags.InvokeMethod | 
34                 BindingFlags.Instance, null, backgroundThread, new object[] { "IMAGE", true, createEMFDeviceInfo, 
35                     createAndRegisterStream, internalRenderingCompleteDelegate, postRenderArgs, report });
36 
37             Type reportDocumentType = reportViewerType.Assembly.GetType("Microsoft.Reporting.WinForms.ReportPrintDocument");
38             Object currentReport = reportViewerType.InvokeMember("CurrentReport", BindingFlags.NonPublic | 
39                 BindingFlags.GetProperty | BindingFlags.Instance, null, reportViewer, null);
40             Object fileManager = currentReport.GetType().InvokeMember("FileManager", BindingFlags.GetProperty, null, 
41                 currentReport, null);
42             Object pageSettings = reportViewerType.InvokeMember("PageSettings", BindingFlags.NonPublic | 
43                 BindingFlags.GetProperty | BindingFlags.Instance, null, reportViewer, null);
44             Object pageSettingsClone = ((ICloneable)pageSettings).Clone();
45             ConstructorInfo constructorInfo = reportDocumentType.GetConstructor(BindingFlags.NonPublic | 
46                 BindingFlags.Instance, null, new Type[] { fileManager.GetType(), pageSettings.GetType() }, null);
47 
48             PrintDocument document = (PrintDocument)constructorInfo.Invoke(new object[] { fileManager, pageSettingsClone });
49 
50             document.DocumentName = (String)report.GetType().InvokeMember("DisplayNameForUse", BindingFlags.NonPublic | 
51                 BindingFlags.GetProperty | BindingFlags.Instance, null, report, null);
52             document.PrinterSettings = (PrinterSettings)reportViewerType.InvokeMember("CreateDefaultPrintSettings", 
53                 BindingFlags.NonPublic | BindingFlags.InvokeMethod | BindingFlags.Instance, null, reportViewer, null);
54             document.PrinterSettings.PrintRange = PrintRange.AllPages;
55             document.Print();
56         }
57     }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.