none
ReportViewer - Bericht direkt drucken RRS feed

  • Frage

  • Hallo!
     
    Ich zeige in einem VB.net-Projekt einen Bericht in einem Formular
    mittels des ReportViewer an.
    Nun würde ich den Bericht beim Anzeigen gern auch direkt auf einem
    bestimmten Drucker ausdrucken.
     
    Den Drucker kann ich über PrinterSettings einstellen.
    Aber wie kann ich die Seiteneinstellungen manipulieren und was
    wesentlich interessanter ist - wie kann ich das Drucken des Berichtes
    mit 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
    der hilft mit im Moment nicht weiter, da ich ihn nicht auf mein
    ReportViewer-Szenario übertragen bekomme.
    Und was mich vorallem irritiert ... geht es wirklich nur über das
    Erstellen eines EMF-Files???
     
    Danke für eure Hilfe, ich hoffe ihr könnt mir weiterhelfen ...
     
    Lutz
     
    Montag, 28. Januar 2013 08:13

Alle Antworten

  • Zumindest was das Direkt-Drucken angeht habe ich Fortschritte gemacht.
     
    Nach einigem Probieren und dem Verbinden der verschiedenen Beispiele im
    Web hab ich folgenden Code um einen Report aus dem ReportViewer direkt
    zu drucken.
    Einzig beim Arbeiten mit den Seiten-Einstellung und Papiergrößen etc
    muss ich noch bißchen probieren. Ziel ist es die Einstellungen für einen
    Bon-Drucker vorzugeben!
     
    Imports System.Drawing.Printing
    Imports System.Drawing.Imaging
    Imports System.IO
     
    Public Class frmReport
        Dim streamids() As String
        Private m_currentPageIndex As Integer
        Private m_streams As IList(Of Stream)
         Private Sub frmReport_Load(sender As Object, e As EventArgs)
    Handles MyBase.Load
            Dim sSql As String
     sSql ="Laden des Reports in ReportViewer"
        End Sub
         Private Function PrintLocalReport() As Boolean
     Const printerName As String = "MeinDrucker"
            Try
                Dim 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.Warning
                m_streams = New List(Of Stream)
                Me.ReportViewer.LocalReport.Render("Image", deviceInfo,
    AddressOf CreateStream, warnings)
                If m_streams Is Nothing Or m_streams.Count = 0 Then
                    Return False
                End If
                For Each s As Stream In m_streams
                    s.Position = 0
                Next
                 Dim printDoc As New PrintDocument()
                printDoc.PrinterSettings.PrinterName = printerName
                If Not printDoc.PrinterSettings.IsValid Then
                    Dim msg As String = String.Format("Can't find printer
    ""{0}"".", printerName)
                    MsgBox(msg)
                    Return False
                End If
                AddHandler printDoc.PrintPage, AddressOf PrintPageHandler
                m_currentPageIndex = 0
                printDoc.Print()
                Return True
            Catch ex As Exception
                Dim sCatchErrMsg As String = "frmReport.PrintLocalReport" &
    vbCrLf & vbCrLf & ex.Message
                MsgBox(sCatchErrMsg, MsgBoxStyle.Exclamation)
            Finally
                If m_streams IsNot Nothing Then
                    For Each s As Stream In m_streams
                        s.Close()
                    Next
                    m_streams = Nothing
                End If
            End Try
             Return False
        End Function
         Private Sub PrintPageHandler(ByVal sender As Object, ByVal e As
    PrintPageEventArgs)
            Try
                Dim pageImage As  New Metafile(m_streams(m_currentPageIndex))
                e.Graphics.DrawImage(pageImage, e.MarginBounds)
                m_currentPageIndex += 1
                e.HasMorePages = m_currentPageIndex < m_streams.Count
            Catch ex As Exception
                Dim sCatchErrMsg As String = "frmReport.PrintPageHandler" &
    vbCrLf & vbCrLf & ex.Message
                MsgBox(sCatchErrMsg, MsgBoxStyle.Exclamation)
            End Try
        End Sub
         Private Function CreateStream(ByVal name As String, ByVal
    fileNameExtension As String, ByVal encoding As System.Text.Encoding,
    ByVal mimeType As String, ByVal willSeek As Boolean) As Stream
            Try
                Dim stream As Stream = New MemoryStream()
                m_streams.Add(stream)
                Return stream
            Catch ex As Exception
                Dim sCatchErrMsg As String = "frmReport.CreateStream" &
    vbCrLf & vbCrLf & ex.Message
                MsgBox(sCatchErrMsg, MsgBoxStyle.Exclamation)
                Return Nothing
            End Try
        End Function
         Private Sub btnPrintDirekt_Click(sender As Object, e As EventArgs)
    Handles btnPrintDirekt.Click
            Call PrintLocalReport()
        End Sub
    End Class
     
    Montag, 28. Januar 2013 14:41
  • 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

    Dienstag, 29. Januar 2013 14:12
    Moderator
  • Am 29.01.2013 15:12, schrieb Ionut Duma:
    > Hallo Lutz,
    >
    > Schau Dir mal an folgendes Artikel
     
    Danke, den Artikel hatte ich auch schon gefunden. Habe jetzt keine
    eigene PrintDocument-Klasse abgeleitet, aber die Schritte mache ich so
    ähnlich.
     
     
    Dienstag, 29. Januar 2013 15:17
  • Hast du die Einstellungen für einen Bondrucker 80 mm geschafft? Bei mir wird mit diesem Code immer ein großer linker Rand gemacht, obwohl "<MarginLeft>0.01in</MarginLeft>"  eingestellt ist.
    Montag, 27. Juni 2016 06:22