none
ReportViewer definir impresora a utilizar por código RRS feed

  • Pregunta

  • Hola, me gustaría poder definir ya por código que tal reporte imprima a una impresora y otro reporte a otra impresora, que no se tenga que seleccionar primero la impresora con un cuadro de dialogo, si no directamente que imprima ya que van a tener ya que impresora usar.

    En el siguiente código lo hago así

        Private Sub btImprimir_Click(sender As Object, e As EventArgs) Handles btImprimir.Click
            'COPIO EL NOMBRE DE LA IMPRESORA PREDETERMINADA
            Dim instance As New Printing.PrinterSettings
            Dim impresosaPredt As String = instance.PrinterName
            'PONGO LA IMPRESORA PREDETERMINADA EN EL QUE QUIERO QUE IMPRIMA
            SetDefaultPrinter("EPSON TM-U325 Receipt")
            'EXPORTO E IMPRIMO
            Export(Me.ReportViewer1.LocalReport)
            Print()
            'PONE OTRA VEZ LA IMPRESORA QUE ESTABA POR DEFECTO
            SetDefaultPrinter(impresosaPredt)
        End Sub


    Lo que hago es cambiar y cambiar las impresoras por defecto y me gustaría que cada reporte ya tenga que impresora tiene que usar. En crystalreport parece que se hace asi

    reporte.PrintOptions.PrinterName = "ElNombreImpresora"

    algo así se puede con reportviewer?

    paso mi código completo por si se le puede agregar alguna parte lo que necesito

    Imports System.IO
    Imports System.Text
    Imports System.Drawing.Imaging
    Imports System.Drawing.Printing
    Imports Microsoft.Reporting.WinForms
    
    Public Class Ticket
    
        Implements IDisposable
        Private m_currentPageIndex As Integer
        Private m_streams As IList(Of Stream)
    
        Private Sub btImprimir_Click(sender As Object, e As EventArgs) Handles btImprimir.Click
            'COPIO EL NOMBRE DE LA IMPRESORA PREDETERMINADA
            Dim instance As New Printing.PrinterSettings
            Dim impresosaPredt As String = instance.PrinterName
            'PONGO LA IMPRESORA PREDETERMINADA EN EL QUE QUIERO QUE IMPRIMA
            SetDefaultPrinter("EPSON TM-U325 Receipt")
            'ESPORTO E IMPRIMO
            Export(Me.ReportViewer1.LocalReport)
            Print()
            'PONE OTRA VEZ LA IMPRESORA QUE ESTABA POR DEFECTO
            SetDefaultPrinter(impresosaPredt)
        End Sub
    
        Declare Function SetDefaultPrinter Lib "winspool.drv" Alias "SetDefaultPrinterA" (ByVal pszPrinter As String) As Boolean
    
        Private Sub Export(ByVal report As LocalReport)
            Dim deviceInfo As String = "<DeviceInfo>" &
                "<OutputFormat>EMF</OutputFormat>" &
                "<PageWidth>3in</PageWidth>" & 'ANCHURA 10
                "<PageHeight>11.69291in</PageHeight>" & 'ALTURA 5.5
                "<MarginTop>0in</MarginTop>" & 'MARGEN SUPERIOR 0.12
                "<MarginLeft>0.25in</MarginLeft>" & 'MARGEN IZQUIERDA 0.12
                "<MarginRight>0in</MarginRight>" & 'MARGEN DERECHA 0.12
                "<MarginBottom>0in</MarginBottom>" & 'MARGEN INFERIOR 0.12
                "</DeviceInfo>"
            Dim warnings As Warning()
            m_streams = New List(Of Stream)()
            report.Render("Image", deviceInfo, AddressOf CreateStream, warnings)
            For Each stream As Stream In m_streams
                stream.Position = 0
            Next
        End Sub
    
        Private Function CreateStream(ByVal name As String, ByVal fileNameExtension As String, ByVal encoding As Encoding,
                                  ByVal mimeType As String, ByVal willSeek As Boolean) As Stream
            Dim stream As Stream = New MemoryStream()
            m_streams.Add(stream)
            Return stream
        End Function
    
        Private Sub Print()
            If m_streams Is Nothing OrElse m_streams.Count = 0 Then
                Throw New Exception("Error: no se puede imprimir.")
            End If
            Dim printDoc As New PrintDocument()
            If Not printDoc.PrinterSettings.IsValid Then
                Throw New Exception("Error: no se puede encontrar la impresora predeterminada.")
            Else
                AddHandler printDoc.PrintPage, AddressOf PrintPage
                m_currentPageIndex = 0
                printDoc.Print()
            End If
        End Sub
    
        Private Sub PrintPage(ByVal sender As Object, ByVal ev As PrintPageEventArgs)
            Dim pageImage As New Metafile(m_streams(m_currentPageIndex))
            Dim adjustedRect As New Rectangle(ev.PageBounds.Left - CInt(ev.PageSettings.HardMarginX),
                                              ev.PageBounds.Top - CInt(ev.PageSettings.HardMarginY),
                                              ev.PageBounds.Width,
                                              ev.PageBounds.Height)
            ev.Graphics.FillRectangle(Brushes.White, adjustedRect)
            ev.Graphics.DrawImage(pageImage, adjustedRect)
            m_currentPageIndex += 1
            ev.HasMorePages = (m_currentPageIndex < m_streams.Count)
        End Sub
    
    End Class


    viernes, 28 de agosto de 2020 2:44