المتابعون للمدونة

الاثنين، 11 نوفمبر 2013

طباعة التقرير مباشرة (نسخة C#)


طباعة التقرير مباشرة (نسخة C#) 

هذه نسخة سي شارب من الفئة ReportPrinter، التي تستخدم لطباعة التقرير مباشرة بدون عرضه أولا في الأداة ReportViewer.. وقد وضعت نسخة VB.NET في الموضوع السابق. 

هذا هو الكود:


using System;

using System.IO;

using System.Text;

using System.Globalization;

using System.Drawing;

using System.Drawing.Imaging;

using System.Drawing.Printing;

using Microsoft.Reporting.WinForms;

using System.Collections.Generic;

using System.Collections.Specialized;

using System.Diagnostics;

using System.ComponentModel;

using System.Data;

using System.Linq;

using System.Threading.Tasks;

using System.Windows.Forms;

 

public class ReportPrinter

{

    public static void Print(LocalReport Report)

    {

        AutoPrintCls AuroPrint = new AutoPrintCls(Report);

        AuroPrint.Print();

    }

 

    public static void Print(ServerReport Report)

    {

        AutoPrintCls AuroPrint = new AutoPrintCls(Report);

        AuroPrint.Print();

    }

 

    private class AutoPrintCls : PrintDocument

    {

        private PageSettings m_pageSettings;

        private int m_currentPage;

        private List<Stream> m_pages = new List<Stream>();

 

        internal AutoPrintCls(ServerReport serverReport)

            : this((Report)serverReport)

        {

            RenderAllServerReportPages(serverReport);

        }

 

        internal AutoPrintCls(LocalReport localReport)

            : this((Report)localReport)

        {

            RenderAllLocalReportPages(localReport);

        }

 

        private AutoPrintCls(Report report)

        {

            ReportPageSettings reportPageSettings = report.GetDefaultPageSettings();

            m_pageSettings = new PageSettings();

            m_pageSettings.PaperSize = reportPageSettings.PaperSize;

            m_pageSettings.Margins = reportPageSettings.Margins;

            m_pageSettings.Landscape = reportPageSettings.IsLandscape;

        }

 

        protected override void Dispose(bool disposing)

        {

            base.Dispose(disposing);

 

            if (disposing)

            {

                foreach (Stream s in m_pages)

                {

                    s.Dispose();

                }

 

                m_pages.Clear();

            }

        }

 

        protected override void OnBeginPrint(PrintEventArgs e)

        {

            base.OnBeginPrint(e);

 

            m_currentPage = 0;

        }

 

        protected override void OnPrintPage(PrintPageEventArgs e)

        {

            base.OnPrintPage(e);

 

            Stream pageToPrint = m_pages[m_currentPage];

            pageToPrint.Position = 0;

 

            // Load each page into a Metafile to draw it.

            using (Metafile pageMetaFile = new Metafile(pageToPrint))

            {

                Rectangle adjustedRect = new Rectangle(e.PageBounds.Left - Convert.ToInt32((int)(e.PageSettings.HardMarginX)), e.PageBounds.Top - Convert.ToInt32((int)(e.PageSettings.HardMarginY)), e.PageBounds.Width, e.PageBounds.Height);

                // Draw a white background for the report

                e.Graphics.FillRectangle(Brushes.White, adjustedRect);

 

                // Draw the report content

                e.Graphics.DrawImage(pageMetaFile, adjustedRect);

 

                // Prepare for next page.  Make sure we haven't hit the end.

                m_currentPage += 1;

                e.HasMorePages = m_currentPage < m_pages.Count;

            }

        }

 

        protected override void OnQueryPageSettings(QueryPageSettingsEventArgs e)

        {

            e.PageSettings = (PageSettings)m_pageSettings.Clone();

        }

 

        private void RenderAllServerReportPages(ServerReport serverReport)

        {

            try

            {

                string deviceInfo = CreateEMFDeviceInfo(0, 0);

 

                // Generating Image renderer pages one at a time can be expensive.  In order

                // to generate page 2, the server would need to recalculate page 1 and throw it

                // away.  Using PersistStreams causes the server to generate all the pages in

                // the background but return as soon as page 1 is complete.

                NameValueCollection firstPageParameters = new NameValueCollection();

                firstPageParameters.Add("rs:PersistStreams", "True");

 

                // GetNextStream returns the next page in the sequence from the background process

                // started by PersistStreams.

                NameValueCollection nonFirstPageParameters = new NameValueCollection();

                nonFirstPageParameters.Add("rs:GetNextStream", "True");

 

                string mimeType = null;

                string fileExtension = null;

 

 

                Stream pageStream = serverReport.Render("IMAGE", deviceInfo, firstPageParameters, out mimeType,out fileExtension);

 

 

 

                // The server returns an empty stream when moving beyond the last page.

                while (pageStream.Length > 0)

                {

                    m_pages.Add(pageStream);

 

                    pageStream = serverReport.Render("IMAGE", deviceInfo, nonFirstPageParameters,out mimeType,out fileExtension);

                }

            }

            catch (Exception e)

            {

                MessageBox.Show("possible missing information ::  " + e.Message);

            }

        }

 

        private void RenderAllLocalReportPages(LocalReport localReport)

        {

            try

            {

                string deviceInfo = CreateEMFDeviceInfo(0, 0);

 

                Warning[] warnings = null;

 

                localReport.Render("IMAGE", deviceInfo, LocalReportCreateStreamCallback,out warnings);

            }

            catch (Exception e)

            {

                MessageBox.Show("error :: " + e.Message);

            }

        }

 

        private Stream LocalReportCreateStreamCallback(string name, string extension, Encoding encoding, string mimeType, bool willSeek)

        {

            MemoryStream stream = new MemoryStream();

            m_pages.Add(stream);

 

            return stream;

        }

 

        private string CreateEMFDeviceInfo(int startPage, int endPage)

        {

            int hundrethsOfInch = m_pageSettings.Landscape ? m_pageSettings.PaperSize.Height : m_pageSettings.PaperSize.Width;

            int hundrethsOfInch2 = m_pageSettings.Landscape ? m_pageSettings.PaperSize.Width : m_pageSettings.PaperSize.Height;

            string _text = string.Format(CultureInfo.InvariantCulture, "{0}{1}{2}{3}{4}{5}", new object[] { ToInches(m_pageSettings.Margins.Top), ToInches(m_pageSettings.Margins.Left), ToInches(m_pageSettings.Margins.Right), ToInches(m_pageSettings.Margins.Bottom), ToInches(hundrethsOfInch2), ToInches(hundrethsOfInch) });

            return string.Format(CultureInfo.InvariantCulture, "emf{0}{1}{2}", new object[] { startPage, endPage, _text });

        }

 

        private static string ToInches(int hundrethsOfInch)

        {

            double inches = hundrethsOfInch / 100.0;

            return inches.ToString(CultureInfo.InvariantCulture) + "in";

        }

    }

}

وسأشرح لكم كيفية استخدام هذه الفئة في الموضوع التالي.

 

ملحوظة:

لكي يعمل هذا الكود يجب أن تضيف إلى المشروع مرجعا Reference إلى النطاقين التاليين:

Microsoft.ReportViewer.Common

Microsoft.ReportViewer.WinForms

لفعل هذا اضغط القائمة الرئيسية Project ومنها اضغط الأمر Add References.. وفي النافذة التي ستظهر، اختر من القائمة اليسرى العنصر Extensions.. لاحظ أنك ستجد إصدارين من الملف Microsoft.ReportViewer.WinForms. اختر الإصدار الأحدث (رقم 11) كما تظهر تفاصيله في الجزء الأيمن من النافذة عند اختيار العنصر.

 

 

ليست هناك تعليقات:

إرسال تعليق

ملحوظة: يمكن لأعضاء المدونة فقط إرسال تعليق.

صفحة الشاعر