Temat: MyNeoReport - ktoś używał i może podzielić się opinią?
I jeszcze kod do "cichego" drukowania(zaadaptowany z rozwiązania, do którego link podałem w jednym z postów):
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing.Imaging;
using System.IO;
using System.Drawing.Printing;
using Microsoft.Reporting.WinForms;
namespace .........
{
class PrintingProvider
{
private int currentPageIndex;
private IList<Stream> streams;
private LocalReport report;
decimal marginLeft;
decimal MarginTop;
string printerName;
public PrintingProvider(LocalReport report, decimal marginLeft, decimal MarginTop, string printerName)
{
this.report= report;
this.marginLeft = marginLeft;
this.marginTop = marginTop;
this.printerName = printerName;
}
private Stream CreateStream(string name, string fileNameExtension, Encoding encoding,
string mimeType, bool willSeek)
{
MemoryStream memStream = new MemoryStream();
streams.Add(memStream);
return memStream;
}
private void Export()
{
string deviceInfo =
"<DeviceInfo>" +
" <OutputFormat>EMF</OutputFormat>" +
" <PageWidth>21cm</PageWidth>" +
" <PageHeight>29.7cm</PageHeight>" +
" <MarginTop>" + this.marginTop.ToString("n2").Replace(",", ".") + "mm</MarginTop>" +
" <MarginLeft>" + this.marginLeft.ToString("n2").Replace(",", ".") + "mm</MarginLeft>" +
" <MarginRight>0.0in</MarginRight>" +
" <MarginBottom>0.0in</MarginBottom>" +
"</DeviceInfo>";
Warning[] warnings;
streams = new List<Stream>();
this.report.Render("Image", deviceInfo, CreateStream, out warnings);
foreach (Stream stream in streams)
stream.Position = 0;
}
private void Print()
{
if (streams == null || streams.Count == 0)
return;
PrintDocument printDoc = new PrintDocument();
printDoc.PrinterSettings.PrinterName = this.PrinterName;
if (!printDoc.PrinterSettings.IsValid)
{
...... // brak drukarki
return;
}
printDoc.PrintPage += new PrintPageEventHandler(PrintPage);
printDoc.DocumentName = "..........";
printDoc.PrintController = new StandardPrintController();
printDoc.Print();
}
public void PrintIt()
{
this.Export();
this.currentPageIndex = 0;
this.Print();
}
private void PrintPage(object sender, PrintPageEventArgs ev)
{
Metafile pageImage = new Metafile(streams[currentPageIndex]);
ev.Graphics.DrawImage(pageImage, ev.PageBounds);
currentPageIndex++;
ev.HasMorePages = (currentPageIndex < streams.Count);
}
}
}
Jeśli chcesz wykorzystać zewnętrzne klasy, np. tę do obsługi barkodów, musisz dodać w kodzie:
report.AddTrustedCodeModuleInCurrentAppDomain("System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
report.AddTrustedCodeModuleInCurrentAppDomain("I25, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
Możesz też wygenerować tzw. mapę raportu, czyli panel z "klikalnymi" linkami po lewej stronie raportu, odnoszącymi się do elementów, którym na etapie projektowania nadałeś nazwy. Co przydatne, mapa eksportuje się do PDFa w formie "bookmarków" i do DOCa, gdzie na tej podstawie jednym kliknięciem (albo w kodzie przez COM) można wygenerować spis treści.
I to chyba najważniejsze przydatne sprawy. Powodzenia, w razie problemów pisz :)
Adrian Olszewski edytował(a) ten post dnia 29.11.10 o godzinie 12:51