Печать отчета RDLC без предварительного просмотра и разрешение пользователю выбирать диапазон страниц для печати в диалоговом окне «Печать» - PullRequest
0 голосов
/ 05 октября 2018

У меня есть отчет rdlc, и я даю пользователю возможность предварительно просмотреть отчет в ReportViewer или распечатать отчет без предварительного просмотра.В программе просмотра отчетов пользователь может выбрать диапазон страниц для печати при печати из программы просмотра.При печати без средства просмотра, даже если пользователь выбирает диапазон страниц в диалоговом окне печати, печатается весь отчет.Можно ли выбрать диапазон страниц для печати в диалоговом окне печати при печати без программы просмотра отчетов?

В форме окна у меня есть кнопка печати с событием щелчка:

private void button1_Click(object sender, EventArgs e)
{
   var message = "Do you wish to preview the report before printing?";
   var title = "Preview Report";
   DialogResult dg = MessageBox.Show(message, title, 
   MessageBoxButtons.YesNo);
        if (dg == DialogResult.Yes)
        {

            MainBatchListPreview mbp = new MainBatchListPreview();

            mbp.Show();
        }
        else if (dg == DialogResult.No)
        {
            LocalReport report = new LocalReport();
            report.ReportEmbeddedResource = 
            "Toolbar.Reports.MainBatchList.rdlc";
            report.DataSources.Add(new ReportDataSource("DataSet1", 
            dataGridView1.DataSource));

            report.PrintToPrinter();
        }
    }

Затем я использую следующий класс для печати без просмотра отчетов:

namespace Toolbar
{
public static class PrintWithoutReportViewer
{
    private static int m_CurrentPageIndex;
    private static IList<Stream> m_Streams;
    private static PageSettings m_PageSettings;



    public static Stream CreateStream(string name, string fileNameExtension, 
    Encoding encoding, string mimeType, bool willSeek)
    {
        Stream stream = new MemoryStream();
        m_Streams.Add(stream);
        return stream;
    }



    public static void Export(LocalReport report, bool print = true)
    {
        PaperSize paperSize = m_PageSettings.PaperSize;
        Margins margins = m_PageSettings.Margins;

        // The device info string defines the page range to print as well as the size of the page.
        // A start and end page of 0 means generate all pages.
        string deviceInfo = string.Format(
            CultureInfo.InvariantCulture,
            "<DeviceInfo>" +
            "<OutputFormat>EMF</OutputFormat>" +
            "<PageWidth>{5}</PageWidth>" +
            "<PageHeight>{4}</PageHeight>" +
            "<MarginTop>{0}</MarginTop>" +
            "<MarginLeft>{1}</MarginLeft>" +
            "<MarginRight>{2}</MarginRight>" +
            "<MarginBottom>{3}</MarginBottom>" +
            "</DeviceInfo>",
            ToInches(margins.Top),
            ToInches(margins.Left),
            ToInches(margins.Right),
            ToInches(margins.Bottom),
            ToInches(paperSize.Height),
            ToInches(paperSize.Width));

        Warning[] warnings;
        m_Streams = new List<Stream>();
        report.Render("Image", deviceInfo, CreateStream,
            out warnings);
        foreach (Stream stream in m_Streams)
            stream.Position = 0;

        if (print)
        {
            PrintDialog printDlg = new PrintDialog();
            PrintDocument printDoc = new PrintDocument();
            printDoc.DocumentName = "Report";
            printDlg.Document = printDoc;
            printDlg.AllowSelection = true;
            printDlg.AllowSomePages = true;

            //Call ShowDialog

            if (printDlg.ShowDialog() == DialogResult.OK)

                printDoc.PrintPage += new PrintPageEventHandler(PrintPage);
            m_CurrentPageIndex = 0;
            printDoc.Print();

        }
    }

    public static void RenderingCompleteEventHandler(object sender, RenderingCompleteEventArgs e)
    {

        PrintDialog startPrint = new PrintDialog();
        startPrint.ShowDialog();

    }

    // Handler for PrintPageEvents
    public static void PrintPage(object sender, PrintPageEventArgs e)
    {
        Stream pageToPrint = m_Streams[m_CurrentPageIndex];
        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 - (int)e.PageSettings.HardMarginX,
                    e.PageBounds.Top - (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_CurrentPageIndex++;
            e.HasMorePages = m_CurrentPageIndex < m_Streams.Count;
        }
    }

    public static void Print()
    {
        if (m_Streams == null || m_Streams.Count == 0)
            throw new Exception("Error: no stream to print.");
        PrintDocument printDoc = new PrintDocument();
        if (!printDoc.PrinterSettings.IsValid)
        {
            throw new Exception("Error: cannot find the default printer.");
        }
        else
        {
            printDoc.PrintPage += new PrintPageEventHandler(PrintPage);
            m_CurrentPageIndex = 0;
            printDoc.Print();
        }
    }

    public static void PrintToPrinter(this LocalReport report)
    {
        m_PageSettings = new PageSettings();
        ReportPageSettings reportPageSettings = report.GetDefaultPageSettings();

        m_PageSettings.PaperSize = reportPageSettings.PaperSize;
        m_PageSettings.Margins = reportPageSettings.Margins;

        Export(report);
    }


    public static void DisposePrint()
    {
        if (m_Streams != null)
        {
            foreach (Stream stream in m_Streams)
                stream.Close();
            m_Streams = null;
        }
    }

    private static string ToInches(int hundrethsOfInch)
    {
        double inches = hundrethsOfInch / 100.0;
        return inches.ToString(CultureInfo.InvariantCulture) + "in";
    }
 }
}

1 Ответ

0 голосов
/ 02 января 2019

Я, наконец, решил свою проблему путем многочисленных исследований, а также методом проб и ошибок.Я добавил / изменил следующее, что позволяет «все страницы и выбранный диапазон страниц».

Я добавил m_EndPage в начале класса.

private static int m_EndPage;

В "public static void Export ()"

if (result == DialogResult.OK)
            {

                printDoc.PrintPage += new PrintPageEventHandler(PrintPage);

                m_CurrentPageIndex = 0;

                page = printDoc.PrinterSettings.FromPage-1;
                m_EndPage = printDoc.PrinterSettings.ToPage - 1;
                m_CurrentPageIndex = page;

                printDoc.Print();
            }

Ниже я добавил оператор if в конце.

public static void PrintPage(object sender, PrintPageEventArgs e)
    {
        Stream pageToPrint = m_Streams[m_CurrentPageIndex];
        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 - (int)e.PageSettings.HardMarginX,
                    e.PageBounds.Top - (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_CurrentPageIndex++;

            e.HasMorePages = m_CurrentPageIndex < m_Streams.Count;

            if (m_CurrentPageIndex > m_EndPage) e.HasMorePages = false;
        }
...