Kali ini saya ingin berbagi bagaimana cara mencetak langsung report ke printer menggunakan RDLC
Kenapa RDLC? Kenapa tidak Crystal Report?
![]() |
contoh report rdlc |
Beda halnya dengan Crystal Report yang merupakan third party product. Crystal Report, tersedia didalam studio visual, tetapi sebetulnya dia merupakan produk mandiri yang tidak dibuat oleh Microsoft secara langsung, sehingga ketika kita ingin menggunakannya di mesin production membutuhkan lisensi
Apakah RDLC bisa mencetak langsung ke printer sebagaimana Crystal Report? jawabannya bisa. begini caranya :
Langkah 1
Buatlah report dengan menggunakan rdlc katakan nama reportnya adalan Customer.rdlc
Langkah 2
Buatlah Class untuk mencetak langsung report rdlc seperti dibawah ini. Class ini dibuat terpisah agar nantinya dapat digunakan berulang-ulang oleh semua form (reusable class). sehingga tidak perlu membuat class/object pencetak report secara langsung.
using Microsoft.Reporting.WinForms;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Printing;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace LogicLayer.Helper
{
public class Report : IDisposable
{
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.27in
11in
0.59055in
0.49213in
0.49213in
0.59055in
";
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]);
Rectangle adjustedRect = new Rectangle(
ev.PageBounds.Left - (int)ev.PageSettings.HardMarginX,
ev.PageBounds.Top - (int)ev.PageSettings.HardMarginY,
ev.PageBounds.Width,
ev.PageBounds.Height);
ev.Graphics.FillRectangle(Brushes.White, adjustedRect);
ev.Graphics.DrawImage(pageImage, adjustedRect);
ev.Graphics.DrawLine(Pens.Black, 80, 100, 320, 100);
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();
}
}
// Create a local report for Customer.rdlc, load the data,
// export the report to an .emf file, and print it.
public void Print(string reportPath, string reportName, object dataSource, List Params = null)
{
LocalReport report = new LocalReport();
report.ReportPath = reportPath;
BindingSource bindingSource = new BindingSource();
bindingSource.DataSource = dataSource;
ReportDataSource rptSource = new ReportDataSource(reportName, bindingSource);
if (Params != null)
report.SetParameters(Params);
report.DataSources.Add(rptSource);
Export(report);
Print();
}
public void Dispose()
{
if (m_streams != null)
{
foreach (Stream stream in m_streams)
stream.Close();
m_streams = null;
}
}
}
}
Langkah 3
Setelah membuat object/class diatas. kita tinggal memanggil print function seperti dibawah ini. datasourse yang digunakan bukanlah Dataset melainkan object list.
public void Print()
{
string reportPath = Directory.GetCurrentDirectory() + "\\Report\\Catalog.rdlc";
LogicLayer.Helper.Report rpt = new LogicLayer.Helper.Report();
var list = CatalogItem.GetAll();
rpt.Print(reportPath, "Catalog", list);
}
Adapun kalo ingin menggunakan dataset kita tinggal mengganti object list tersebut dengan dataset. dan jalan lupa pula, ketika diganti dari object list ke dataset setting di report rdlc nya juga dirubah. berikut contoh jika menggunakan dataset
public void Print()
{
string reportPath = Directory.GetCurrentDirectory() + "\\Report\\Catalog.rdlc";
LogicLayer.Helper.Report rpt = new LogicLayer.Helper.Report();
Dataset ds = CatalogItem.GetDataset();
rpt.Print(reportPath, "Catalog", ds);
}
Coding diatas sudah ditest menggunakan applikasi desktop C# dan sudah diimplementasikan kedalam applikasi point of sales.
Selamat mencoba..!!!
No comments:
Post a Comment