How to invoke print button of Microsoft report Viewer using c sharp programmatically
15,717
Solution 1
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.
Solution 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;
}
}
}
Author by
user1146956
Updated on June 06, 2022Comments
-
user1146956 almost 2 years
How can I invoke the print button of report viewer using c sharp code
-
user1146956 over 12 yearsBut i need to display .rdlc file on report viewer control and print that report file using custom button.How to solve this problem?
-
Cody Gray over 12 years@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.
-
abhijeet chimankar about 3 yearsThanks. Anybody using this code please make this minor change. 1. Update
IList
toIList<Stream>
2. Updatem_streams = new List();
tom_streams = new List<Stream>();
3. Updatem_currentPageIndex < m_streams.Count
tom_currentPageIndex < m_streams.Count
Ref: Microsoft Tutorial Walkthrough: Printing a Local Report without Preview link