Fragensteller
ReportViewer - Bericht direkt drucken

Frage
-
Hallo!Ich zeige in einem VB.net-Projekt einen Bericht in einem Formularmittels des ReportViewer an.Nun würde ich den Bericht beim Anzeigen gern auch direkt auf einembestimmten Drucker ausdrucken.Den Drucker kann ich über PrinterSettings einstellen.Aber wie kann ich die Seiteneinstellungen manipulieren und waswesentlich interessanter ist - wie kann ich das Drucken des Berichtesmit den von mir gewünschten Einstellungen am Ende anschieben, ohne daßich den Druckdialog anzeigen und der Nutzer bestätigen muss.Den Artikel von Microsoft(http://msdn.microsoft.com/de-de/library/ms252091.aspx) kenn ich, aberder hilft mit im Moment nicht weiter, da ich ihn nicht auf meinReportViewer-Szenario übertragen bekomme.Und was mich vorallem irritiert ... geht es wirklich nur über dasErstellen eines EMF-Files???Danke für eure Hilfe, ich hoffe ihr könnt mir weiterhelfen ...Lutz
Alle Antworten
-
Zumindest was das Direkt-Drucken angeht habe ich Fortschritte gemacht.Nach einigem Probieren und dem Verbinden der verschiedenen Beispiele imWeb hab ich folgenden Code um einen Report aus dem ReportViewer direktzu drucken.Einzig beim Arbeiten mit den Seiten-Einstellung und Papiergrößen etcmuss ich noch bißchen probieren. Ziel ist es die Einstellungen für einenBon-Drucker vorzugeben!Imports System.Drawing.PrintingImports System.Drawing.ImagingImports System.IOPublic Class frmReportDim streamids() As StringPrivate m_currentPageIndex As IntegerPrivate m_streams As IList(Of Stream)Private Sub frmReport_Load(sender As Object, e As EventArgs)Handles MyBase.LoadDim sSql As StringsSql ="Laden des Reports in ReportViewer"End SubPrivate Function PrintLocalReport() As BooleanConst printerName As String = "MeinDrucker"TryDim deviceInfo As String = _"<DeviceInfo>" & _"<OutputFormat>EMF</OutputFormat>" & _" <PageWidth>" &Me.ReportViewer.PrinterSettings.DefaultPageSettings.Bounds.Width / 100 &"in</PageWidth>" & _" <PageHeight>" &Me.ReportViewer.PrinterSettings.DefaultPageSettings.Bounds.Height / 100& "in</PageHeight>" & _"<MarginTop>0.01in</MarginTop>" & _"<MarginLeft>0.01in</MarginLeft>" & _"<MarginRight>0.01in</MarginRight>" & _"<MarginBottom>0.01in</MarginBottom>" & _"</DeviceInfo>"Dim warnings() As Microsoft.Reporting.WinForms.Warningm_streams = New List(Of Stream)Me.ReportViewer.LocalReport.Render("Image", deviceInfo,AddressOf CreateStream, warnings)If m_streams Is Nothing Or m_streams.Count = 0 ThenReturn FalseEnd IfFor Each s As Stream In m_streamss.Position = 0NextDim printDoc As New PrintDocument()printDoc.PrinterSettings.PrinterName = printerNameIf Not printDoc.PrinterSettings.IsValid ThenDim msg As String = String.Format("Can't find printer""{0}"".", printerName)MsgBox(msg)Return FalseEnd IfAddHandler printDoc.PrintPage, AddressOf PrintPageHandlerm_currentPageIndex = 0printDoc.Print()Return TrueCatch ex As ExceptionDim sCatchErrMsg As String = "frmReport.PrintLocalReport" &vbCrLf & vbCrLf & ex.MessageMsgBox(sCatchErrMsg, MsgBoxStyle.Exclamation)FinallyIf m_streams IsNot Nothing ThenFor Each s As Stream In m_streamss.Close()Nextm_streams = NothingEnd IfEnd TryReturn FalseEnd FunctionPrivate Sub PrintPageHandler(ByVal sender As Object, ByVal e AsPrintPageEventArgs)TryDim pageImage As New Metafile(m_streams(m_currentPageIndex))e.Graphics.DrawImage(pageImage, e.MarginBounds)m_currentPageIndex += 1e.HasMorePages = m_currentPageIndex < m_streams.CountCatch ex As ExceptionDim sCatchErrMsg As String = "frmReport.PrintPageHandler" &vbCrLf & vbCrLf & ex.MessageMsgBox(sCatchErrMsg, MsgBoxStyle.Exclamation)End TryEnd SubPrivate Function CreateStream(ByVal name As String, ByValfileNameExtension As String, ByVal encoding As System.Text.Encoding,ByVal mimeType As String, ByVal willSeek As Boolean) As StreamTryDim stream As Stream = New MemoryStream()m_streams.Add(stream)Return streamCatch ex As ExceptionDim sCatchErrMsg As String = "frmReport.CreateStream" &vbCrLf & vbCrLf & ex.MessageMsgBox(sCatchErrMsg, MsgBoxStyle.Exclamation)Return NothingEnd TryEnd FunctionPrivate Sub btnPrintDirekt_Click(sender As Object, e As EventArgs)Handles btnPrintDirekt.ClickCall PrintLocalReport()End SubEnd Class
-
Hallo Lutz,
Schau Dir mal an folgendes Artikel http://blogs.msdn.com/b/brianhartman/archive/2009/02/27/manually-printing-a-report.aspx
Gruss,
Ionut