3

How can I invoke the print button of report viewer using c sharp code

Cœur
  • 37,241
  • 25
  • 195
  • 267
user1146956
  • 91
  • 1
  • 3
  • 4

2 Answers2

4

Don't.

Print the report programmatically without displaying a preview to the user in the first place. All you have to do is specify the name of a printing device, and the report will be printed automatically without user intervention. Sample code is here: Walkthrough: Printing a Local Report without Preview.

Cody Gray - on strike
  • 239,200
  • 50
  • 490
  • 574
  • But i need to display .rdlc file on report viewer control and print that report file using custom button.How to solve this problem? – user1146956 Jan 13 '12 at 11:37
  • @user1146956: You don't have to get rid of the button or the viewer control. But if you want to *print* the report *without user intervention*, then you should do it as the above link suggests. Don't try and click the button using code; that'll never work out. – Cody Gray - on strike Jan 13 '12 at 11:39
2
directly copy this code in a class called "Printing" and Call the "Run" method with your reportviewer name as parameter. Example obj.Run(reportviewer1);

////////////////////////////////////////////////////////////////////////////////////
using System;
using System.IO;
using System.Data;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Printing;
using System.Collections.Generic;
using System.Windows.Forms;
using Microsoft.Reporting.WinForms;


class Printing
{
private int m_currentPageIndex;
private IList m_streams;


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

    private void Export(LocalReport report)
    {
        string deviceInfo =
          @"
            EMF
            8.5in
            11in
            0.25in
            0.25in
            0.25in
            0.25in
        ";
        Warning[] warnings;
        m_streams = new List();
        report.Render("Image", deviceInfo, CreateStream,
           out warnings);
        foreach (Stream stream in m_streams)
            stream.Position = 0;
    }

    private void PrintPage(object sender, PrintPageEventArgs ev)
    {
        Metafile pageImage = new
           Metafile(m_streams[m_currentPageIndex]);

        // Adjust rectangular area with printer margins.
        Rectangle adjustedRect = new Rectangle(
            ev.PageBounds.Left - (int)ev.PageSettings.HardMarginX,
            ev.PageBounds.Top - (int)ev.PageSettings.HardMarginY,
            ev.PageBounds.Width,
            ev.PageBounds.Height);

        // Draw a white background for the report
        ev.Graphics.FillRectangle(Brushes.White, adjustedRect);

        // Draw the report content
        ev.Graphics.DrawImage(pageImage, adjustedRect);

        // Prepare for the next page. Make sure we haven't hit the end.
        m_currentPageIndex++;
        ev.HasMorePages = (m_currentPageIndex < m_streams.Count);
    }

    private 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 void Run(ReportViewer rpt)
    {
        Export(rpt.LocalReport);
        Print();
    }

    public void Dispose()
    {
        if (m_streams != null)
        {
            foreach (Stream stream in m_streams)
                stream.Close();
            m_streams = null;
        }
    }
}
  • Thanks. Anybody using this code please make this minor change. 1. Update `IList` to `IList` 2. Update `m_streams = new List();` to `m_streams = new List();` 3. Update `m_currentPageIndex < m_streams.Count` to `m_currentPageIndex < m_streams.Count` Ref: Microsoft Tutorial __Walkthrough: Printing a Local Report without Preview__ [link](https://learn.microsoft.com/en-us/previous-versions/ms252091(v=vs.140)?redirectedfrom=MSDN) – abhijeet chimankar Apr 26 '21 at 23:30