none
Imprimir listview RRS feed

  • Pregunta

  • Hola a todos como podria imprimir el contenido de un listview 

    lo que necesito es darle formato  a la impresion es decir:

    debe tener un encabezado de la siguente manera:

    NOMBRE DE EMPRESA                                       FECHA                                       Nº DE HOJA

    logo de la empresa               

                                                                            TITULO

    -  - - - - - - - - - - - - - - - -  - - - - -  - - - - - - -  - - - - - - - - - -  - -- - - - - - - -  - - - - - - - -  - - - - - - - -  -

    aqui las columnas del listview ejemplo:

    ID                NOMBRE                   APELLIDO                    DNI                

     - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  - - -- - - - - - - - - -  - - - - -  - - - - -  - - - - -

    aqui el contenido de las columnas ejemplo

    1                RAUL                         PEREZ                             30000011

    Les agradeceria su ayuda es la primera vez que quiero hacer algo como esto 

    se deberia mostrar en una vista preliminar antes de imprimir 

    saludos!!!

                                                                          


    millo

    • Cambiado Enrique M. Montejo sábado, 11 de noviembre de 2017 16:16 Pregunta relacionada con controles de Windows Forms.
    lunes, 6 de noviembre de 2017 3:11

Respuestas

  • Hola Rodrigo, fijate si el código te ayuda como para orientarte, un button (imprimir) y toma los datos del listview, imagen de un pictuebox

    Boton imprimir

      Private Sub Button24_Click(sender As Object, e As EventArgs) Handles Button24.Click
            PrintDialog1.AllowSomePages = True
            PrintDialog1.ShowHelp = True
            Dim result As DialogResult = PrintDialog1.ShowDialog()
            If (result = DialogResult.OK) Then
                PrintDocument1.Print()
            End If
        End Sub

    En el evento PrintDocument

     Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
            Dim i, x As Integer
            Dim N As Integer = 1
            Dim item As ListViewItem
            x = 0
            e.Graphics.DrawImage(PictureBox2.Image, 20, 80, 100, 100)
            Dim rect As New Rectangle(0, 200, 900, 800)
            e.Graphics.DrawRectangle(Pens.Gray, rect)
            e.Graphics.DrawString("Serpiente@Code", New Font("Verdana", 12, FontStyle.Bold), Brushes.Blue, 2, 50)
            e.Graphics.DrawString("Fecha: " & Date.Now.ToString("dd/MM/yyyy"), New Font("Verdana", 10, FontStyle.Bold), Brushes.Gray, 250, 80)
            e.Graphics.DrawString("Numero de Hoja: " & N, New Font("Verdana", 10, FontStyle.Bold), Brushes.Gray, 500, 80)
            e.Graphics.DrawString("Documneto Ipresión ListView", New Font("Verdana", 11, FontStyle.Bold), Brushes.Blue, 300, 150)
            '__________________________________________________________________________________________________________
            e.Graphics.DrawString("DNI", New Font("Verdana", 10, FontStyle.Bold), Brushes.Black, 140, 200)
            e.Graphics.DrawString("PrecioPD", New Font("Verdana", 10, FontStyle.Bold), Brushes.Black, 240, 200)
            e.Graphics.DrawString("Adicional", New Font("Verdana", 10, FontStyle.Bold), Brushes.Black, 340, 200)
            e.Graphics.DrawString("Docente", New Font("Verdana", 10, FontStyle.Bold), Brushes.Black, 440, 200)
            e.Graphics.DrawString("Monto", New Font("Verdana", 10, FontStyle.Bold), Brushes.Black, 540, 200)
            e.Graphics.DrawString("Fecha", New Font("Verdana", 10, FontStyle.Bold), Brushes.Black, 640, 200)
    
            '________________________________________________________________________________________________________
            For i = 0 To ListView1.Items.Count - 1
                item = ListView1.Items(i)
                If Not String.IsNullOrEmpty(item.SubItems(1).Text) Then
                    e.Graphics.DrawString(item.SubItems(0).Text, New Font("Verdana", 11, FontStyle.Regular), Brushes.Black, 140, 240 + (x * 20))
                    e.Graphics.DrawString(item.SubItems(1).Text, New Font("Verdana", 11, FontStyle.Regular), Brushes.Black, 240, 240 + (x * 20))
                    e.Graphics.DrawString(item.SubItems(2).Text, New Font("Verdana", 11, FontStyle.Regular), Brushes.Black, 340, 240 + (x * 20))
                    e.Graphics.DrawString(item.SubItems(3).Text, New Font("Verdana", 11, FontStyle.Regular), Brushes.Black, 440, 240 + (x * 20))
                    e.Graphics.DrawString(item.SubItems(4).Text, New Font("Verdana", 11, FontStyle.Regular), Brushes.Black, 540, 240 + (x * 20))
                    e.Graphics.DrawString(item.SubItems(5).Text, New Font("Verdana", 11, FontStyle.Regular), Brushes.Black, 640, 240 + (x * 20))
                    x = x + 1
                End If
            Next
    
    
        End Sub

    Este ejemplo cuenta con una imagen, titulo, fecha, nº hoja, y los datos de un ListView con 6 columnas y varios items

    Saludos

    • Marcado como respuesta rodrigoruiz lunes, 13 de noviembre de 2017 22:12
    lunes, 13 de noviembre de 2017 6:05

Todas las respuestas

  • Hola

    Asumo que antes de llenar el listview, tienes tus datos en un contenedor, ya sea un datatable, un reader o una lista genérica. Lo que puedes hacer es imprimir desde el mismo contenedor, hay varias formas que puedes buscar en internet o tutoriales en youtube.

    Por ejemplo te adjunto un enlace de como se imprimiría con PrintForm, 

    How to: Print a Form by Using the PrintForm Component (Visual Basic)

    Saludos


    Brayan De la Cruz
    Lima - Perú

    • Propuesto como respuesta Juan Mondragón lunes, 6 de noviembre de 2017 23:32
    lunes, 6 de noviembre de 2017 3:27
  • Hola

    Asumo que antes de llenar el listview, tienes tus datos en un contenedor, ya sea un datatable, un reader o una lista genérica. Lo que puedes hacer es imprimir desde el mismo contenedor, hay varias formas que puedes buscar en internet o tutoriales en youtube.

    Por ejemplo te adjunto un enlace de como se imprimiría con PrintForm, 

    How to: Print a Form by Using the PrintForm Component (Visual Basic)

    Saludos


    Brayan De la Cruz
    Lima - Perú

    brayan estube viendo el enlace que me pasaste

    Pero mi caso es el siguiente necesito imprimir los que muestro en el listview como paso el data table para poder imprimir su contenido ademas me debe respetar el fomato del listview respetar los anchos de cada columna los nombres de las columnas la alineaciones que tiene cada una etc 

    Private Sub LlenarListView()
            Dim Lista As ListViewItem
            Me.ListView1.Items.Clear()
            Me.ListView1.Columns.Clear()
    
       Dt2 = sql.LEER("SELECT * FROM transacciones")
            Query = Dt2.Rows(0).ItemArray(2).ToString
    
           con esto le doy formato a mi listview
            Dt = sql.LEER("SELECT * FROM detalle_transacciones")
    
            For i As Integer = 0 To Dt.Rows.Count - 1
                Dim Ancho As Integer = Int(Dt.Rows(i).Item("ANCHO"))
                Dim Alin As Integer = Int(Dt.Rows(i).Item("ALINEACION"))
                ListView1.Columns.Add(Dt.Rows(i).Item("Titulo"), Ancho, DirectCast(Alin, HorizontalAlignment))
                ListView1.View = View.Details
            Next
           
        End Sub

    con este metodo lleno mi listview el cual le doy formato al listview como por ejemplo ancho alineacion y titulos a las cabeceras de las columnas  

    con esto traigo los datos de mi base de datos y lo muestro en el listview
    
    
     Dt1 = sql.LEER(Query.Replace("%WHERE%", CboBuscar.SelectedItem.itemdata & " like '" & TxtBuscar.Text & "%'"))
            For y = 0 To Dt1.Rows.Count - 1
                Lista = Me.ListView1.Items.Add(Dt1.Rows(y)("Id_Usuario").ToString)
                Lista.SubItems.Add(Dt1.Rows(y)("Apellido").ToString)
                Lista.SubItems.Add(Dt1.Rows(y)("Nombre").ToString)
                Lista.SubItems.Add(Dt1.Rows(y)("Dni").ToString)
                Lista.SubItems.Add(Dt1.Rows(y)("Perfil").ToString)
            Next

    necesito saber como utilizar el contenido del datatable y asi imprimirlo  con printdocuments

    espero me puedas ayudar 

    saludoss



    millo

    • Marcado como respuesta Juan Mondragón viernes, 10 de noviembre de 2017 20:23
    • Desmarcado como respuesta Juan Mondragón viernes, 10 de noviembre de 2017 20:23
    miércoles, 8 de noviembre de 2017 0:21
  • Hola Rodrigo, fijate si el código te ayuda como para orientarte, un button (imprimir) y toma los datos del listview, imagen de un pictuebox

    Boton imprimir

      Private Sub Button24_Click(sender As Object, e As EventArgs) Handles Button24.Click
            PrintDialog1.AllowSomePages = True
            PrintDialog1.ShowHelp = True
            Dim result As DialogResult = PrintDialog1.ShowDialog()
            If (result = DialogResult.OK) Then
                PrintDocument1.Print()
            End If
        End Sub

    En el evento PrintDocument

     Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
            Dim i, x As Integer
            Dim N As Integer = 1
            Dim item As ListViewItem
            x = 0
            e.Graphics.DrawImage(PictureBox2.Image, 20, 80, 100, 100)
            Dim rect As New Rectangle(0, 200, 900, 800)
            e.Graphics.DrawRectangle(Pens.Gray, rect)
            e.Graphics.DrawString("Serpiente@Code", New Font("Verdana", 12, FontStyle.Bold), Brushes.Blue, 2, 50)
            e.Graphics.DrawString("Fecha: " & Date.Now.ToString("dd/MM/yyyy"), New Font("Verdana", 10, FontStyle.Bold), Brushes.Gray, 250, 80)
            e.Graphics.DrawString("Numero de Hoja: " & N, New Font("Verdana", 10, FontStyle.Bold), Brushes.Gray, 500, 80)
            e.Graphics.DrawString("Documneto Ipresión ListView", New Font("Verdana", 11, FontStyle.Bold), Brushes.Blue, 300, 150)
            '__________________________________________________________________________________________________________
            e.Graphics.DrawString("DNI", New Font("Verdana", 10, FontStyle.Bold), Brushes.Black, 140, 200)
            e.Graphics.DrawString("PrecioPD", New Font("Verdana", 10, FontStyle.Bold), Brushes.Black, 240, 200)
            e.Graphics.DrawString("Adicional", New Font("Verdana", 10, FontStyle.Bold), Brushes.Black, 340, 200)
            e.Graphics.DrawString("Docente", New Font("Verdana", 10, FontStyle.Bold), Brushes.Black, 440, 200)
            e.Graphics.DrawString("Monto", New Font("Verdana", 10, FontStyle.Bold), Brushes.Black, 540, 200)
            e.Graphics.DrawString("Fecha", New Font("Verdana", 10, FontStyle.Bold), Brushes.Black, 640, 200)
    
            '________________________________________________________________________________________________________
            For i = 0 To ListView1.Items.Count - 1
                item = ListView1.Items(i)
                If Not String.IsNullOrEmpty(item.SubItems(1).Text) Then
                    e.Graphics.DrawString(item.SubItems(0).Text, New Font("Verdana", 11, FontStyle.Regular), Brushes.Black, 140, 240 + (x * 20))
                    e.Graphics.DrawString(item.SubItems(1).Text, New Font("Verdana", 11, FontStyle.Regular), Brushes.Black, 240, 240 + (x * 20))
                    e.Graphics.DrawString(item.SubItems(2).Text, New Font("Verdana", 11, FontStyle.Regular), Brushes.Black, 340, 240 + (x * 20))
                    e.Graphics.DrawString(item.SubItems(3).Text, New Font("Verdana", 11, FontStyle.Regular), Brushes.Black, 440, 240 + (x * 20))
                    e.Graphics.DrawString(item.SubItems(4).Text, New Font("Verdana", 11, FontStyle.Regular), Brushes.Black, 540, 240 + (x * 20))
                    e.Graphics.DrawString(item.SubItems(5).Text, New Font("Verdana", 11, FontStyle.Regular), Brushes.Black, 640, 240 + (x * 20))
                    x = x + 1
                End If
            Next
    
    
        End Sub

    Este ejemplo cuenta con una imagen, titulo, fecha, nº hoja, y los datos de un ListView con 6 columnas y varios items

    Saludos

    • Marcado como respuesta rodrigoruiz lunes, 13 de noviembre de 2017 22:12
    lunes, 13 de noviembre de 2017 6:05
  • Hola Rodrigo, fijate si el código te ayuda como para orientarte, un button (imprimir) y toma los datos del listview, imagen de un pictuebox

    Boton imprimir

      Private Sub Button24_Click(sender As Object, e As EventArgs) Handles Button24.Click
            PrintDialog1.AllowSomePages = True
            PrintDialog1.ShowHelp = True
            Dim result As DialogResult = PrintDialog1.ShowDialog()
            If (result = DialogResult.OK) Then
                PrintDocument1.Print()
            End If
        End Sub

    En el evento PrintDocument

     Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
            Dim i, x As Integer
            Dim N As Integer = 1
            Dim item As ListViewItem
            x = 0
            e.Graphics.DrawImage(PictureBox2.Image, 20, 80, 100, 100)
            Dim rect As New Rectangle(0, 200, 900, 800)
            e.Graphics.DrawRectangle(Pens.Gray, rect)
            e.Graphics.DrawString("Serpiente@Code", New Font("Verdana", 12, FontStyle.Bold), Brushes.Blue, 2, 50)
            e.Graphics.DrawString("Fecha: " & Date.Now.ToString("dd/MM/yyyy"), New Font("Verdana", 10, FontStyle.Bold), Brushes.Gray, 250, 80)
            e.Graphics.DrawString("Numero de Hoja: " & N, New Font("Verdana", 10, FontStyle.Bold), Brushes.Gray, 500, 80)
            e.Graphics.DrawString("Documneto Ipresión ListView", New Font("Verdana", 11, FontStyle.Bold), Brushes.Blue, 300, 150)
            '__________________________________________________________________________________________________________
            e.Graphics.DrawString("DNI", New Font("Verdana", 10, FontStyle.Bold), Brushes.Black, 140, 200)
            e.Graphics.DrawString("PrecioPD", New Font("Verdana", 10, FontStyle.Bold), Brushes.Black, 240, 200)
            e.Graphics.DrawString("Adicional", New Font("Verdana", 10, FontStyle.Bold), Brushes.Black, 340, 200)
            e.Graphics.DrawString("Docente", New Font("Verdana", 10, FontStyle.Bold), Brushes.Black, 440, 200)
            e.Graphics.DrawString("Monto", New Font("Verdana", 10, FontStyle.Bold), Brushes.Black, 540, 200)
            e.Graphics.DrawString("Fecha", New Font("Verdana", 10, FontStyle.Bold), Brushes.Black, 640, 200)
    
            '________________________________________________________________________________________________________
            For i = 0 To ListView1.Items.Count - 1
                item = ListView1.Items(i)
                If Not String.IsNullOrEmpty(item.SubItems(1).Text) Then
                    e.Graphics.DrawString(item.SubItems(0).Text, New Font("Verdana", 11, FontStyle.Regular), Brushes.Black, 140, 240 + (x * 20))
                    e.Graphics.DrawString(item.SubItems(1).Text, New Font("Verdana", 11, FontStyle.Regular), Brushes.Black, 240, 240 + (x * 20))
                    e.Graphics.DrawString(item.SubItems(2).Text, New Font("Verdana", 11, FontStyle.Regular), Brushes.Black, 340, 240 + (x * 20))
                    e.Graphics.DrawString(item.SubItems(3).Text, New Font("Verdana", 11, FontStyle.Regular), Brushes.Black, 440, 240 + (x * 20))
                    e.Graphics.DrawString(item.SubItems(4).Text, New Font("Verdana", 11, FontStyle.Regular), Brushes.Black, 540, 240 + (x * 20))
                    e.Graphics.DrawString(item.SubItems(5).Text, New Font("Verdana", 11, FontStyle.Regular), Brushes.Black, 640, 240 + (x * 20))
                    x = x + 1
                End If
            Next
    
    
        End Sub

    Este ejemplo cuenta con una imagen, titulo, fecha, nº hoja, y los datos de un ListView con 6 columnas y varios items

    Saludos

    Marcelo Gracias por proporcionarme ayuda ahora  siguiendo tu ejemplo me surgio 2 problemas 

    genere un random de mi lista de usuarios con lo cual me ocupa un mas de una pagina al imprimir el problema es que no puedo hacer el salto de pagina 

    y  eso arrastraria  otro problema con el numero de pagina se supone que deberia ser pagina nº 2 y asi sucesivamente 

    Podrias indicarme como solucionarlo???


    millo

    lunes, 13 de noviembre de 2017 22:17
  • Ya pude resolver el salto de pagina 

    si es mas de una pagina salta a la  siguiente con sus correspondientes datos lo que no puedo hacer es indicarle un margen inferior a la hoja porque me imprime hasta el final de la hoja.. como podria corregir eso??

    adjunto una imagen

    Ese recuadro que hice deberia de aparecer en la siguiente hoja dejando un margen inferior que nose como corregir eso

    siempre siguiendo el ejemplo de marcelo!!

    Espero me puedan ayudar


    millo

    martes, 14 de noviembre de 2017 0:25
  • Hola Rodigo, bien! va tomando forma, bueno como te dige no soy muy ducho en el PrintDocument, para mi es un Picturebox je, segueramente habrá quien te aconseje mejor,  pero al caso de lo que comentas, pues tienes el evento e.HasMorPage que es algo que se puede utilizar para provocar una nueva página, y con esto salvas el problema de el margen inferiór pues limitas la cantidad de items (líneas) que dibujas en el para esto declaramos a nivel formulario dos integer (para que no retomen su valor si vuelves a imprimir Ojo con esto luego lo vemos)

        Public pg As Integer = 0
        Public N As Integer = 1

    Estos los utilizamos para contar las páginas y para limitar los items, en el ejemplo que te puse a mi me sirve ingrear 42 items por página pero eso depende de el tamaño de los caracteres y demas, tu lo vas probando entonses al inicio del for donde recorremos el ListView colocamos lo siguiente

    ..............

       For pg = pg To ListView1.Items.Count - 1
                If it = 42 Then
                    e.HasMorePages = True
                    N += 1
                    it = 0
                    Exit For
                End If
                item = ListView1.Items(pg)
                If Not String.IsNullOrEmpty(item.SubItems(1).Text) Then
                    e.Graphics.DrawString(item.SubItems(0).Text, New Font("Verdana", 11, FontStyle.Regular), Brushes.Black, 140, 240 + (x * 20))
                    e.Graphics.DrawString(item.SubItems(1).Text, New Font("Verdana", 11, FontStyle.Regular), Brushes.Black, 240, 240 + (x * 20))
                    e.Graphics.DrawString(item.SubItems(2).Text, New Font("Verdana", 11, FontStyle.Regular), Brushes.Black, 340, 240 + (x * 20))
                    e.Graphics.DrawString(item.SubItems(3).Text, New Font("Verdana", 11, FontStyle.Regular), Brushes.Black, 440, 240 + (x * 20))
                    e.Graphics.DrawString(item.SubItems(4).Text, New Font("Verdana", 11, FontStyle.Regular), Brushes.Black, 540, 240 + (x * 20))
                    e.Graphics.DrawString(item.SubItems(5).Text, New Font("Verdana", 11, FontStyle.Regular), Brushes.Black, 640, 240 + (x * 20))
                    x = x + 1
                    it += 1
                End If
            Next

    ..............

    Con esto obligamos al cambio de página salimos del for,  "Pg" en el inicio tiene el valor 0 cuando ingrese la segunda página conservará el valor donde dejo el anteriór

    Ahora debemos asegurarnos que cuendo dejes de imprimir estos valores públicos vuelvan a sus valores de origen para esto vamos al evneto del PrintDocument, EndPrint y los volvemos a su origen

        Private Sub PrintDocument1_EndPrint(sender As Object, e As PrintEventArgs) Handles PrintDocument1.EndPrint
            N = 1
            pg = 0
            it = 0
        End Sub

    Peueba y comentas, ve jugando con los valores de los gráficos (x,y) y alinea mejor todas las columnas

    Saludos

    Edito; it es tambien un integer puede o no estar a nivel formulario pero si es necesario que vuelva a 0


    • Editado Marcelo PF martes, 14 de noviembre de 2017 5:12
    martes, 14 de noviembre de 2017 5:09