none
Imprimir con Printdocument, ayuda con e.HasmorePages = true/false RRS feed

  • Pregunta

  • Objetivo: Imprimir 8 registros por cada página de una lista de N registros provenientes de un DataGridView.

    Estoy desarrollando un formulario que contiene un DataGridView, que mediante un par de controles ejecuto una consulta de registros dentro de una Base de Datos Access. El procedimiento de consulta se ejecuta sin problemas y muestra en el DataGridView los registros deseados. Estos registros, según la consulta, varían de Cero a N cantidad de registros.

    Necesito imprimir todos los registros que me muestra el DataGridView en hojas tamaño oficio y estoy haciendo las pruebas, mediante el control PrintDocument; el proyecto requiere que en cada hoja se impriman 8 registros (P.Ej.: Tengo 40 registros en la Tabla = 8 registros en cada hoja = 5 hojas oficio impresas)

    El problema que tengo es con el salto de página, ya que no logro acomodar dicho código para que me lo haga; he probado varios códigos de distintos ejemplos de Internet y aun así no lo he logrado. Otro detalle es que la mayoría de los criterios para dar el salto de página es que cuentan las líneas de la página y lo comparan con el contador de registros del DataGridView, cuando mi criterio es que el salto de página se realice después de haber impreso 8 registros en la página (p.Ej.: if contregistros > 8 registros then e.hasmorepages = true …. Until tabla.rowcount -1 )

    Envío el código del control PrintDocument1 del formulario implicado; espero encontrar opiniones de apoyo y alguna propuesta de solución a mi caso. Saludos.

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    PrintDocument1.Print()
    End Sub
    Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    Try
    Dim rowfont As New Font("Arial", 10, FontStyle.Regular) Dim registroactual As String = "" Dim banderapos As Boolean = False Dim xpos As Integer = 50 Dim ypos As Integer = 50 Dim contadorregistros As Integer = 0
    For i As Integer = 0 To DGTabla.RowCount - 1
    registroactual = registroactual & DGTabla(0, i).Value & vbTab & txtTotal.Text & vbTab & "Fechaderecibo"
    If banderapos = False Then
    e.Graphics.DrawString(registroactual, rowfont, Brushes.Black, xpos, ypos) banderapos = True
    Else
    e.Graphics.DrawString(registroactual, rowfont, Brushes.Black, 500, ypos) banderapos = False ypos += 250
    End If
    registroactual = "" contadorregistros = contadorregistros + 1
    Next
    If (contadorregistros < DGTabla.RowCount - 1) Then e.HasMorePages = True Else e.HasMorePages = False End If
    Catch ex As Exception MsgBox("Error en debido a: " & ex.Message, MsgBoxStyle.Exclamation, "Advertencia!!") End Try
    End Sub
    Éste es el resultado que logro:
    Registros

    miércoles, 20 de septiembre de 2017 20:18

Respuestas

  • Me temo que no has entendido bien cómo funciona el HasMorePages. Estás intentando hacer un bucle que recorra todos los registros y poniendo HasMorePages a True cada 8 registros. Así no funciona. Dentro del PrintPage solo puedes ejecutar lo que va a una sola página. Eso quiere decir que el bucle solo puede hacer 8 iteraciones. En ese momento pones HasMorePges=True y sales del PrintPage. Eso hace que se imprima la página con los primeros 8 registros, y a causa del HasMorePges=True se vuelve a disparar el PrintPage. En este segundo disparo, vuelves a imprimir otros 8 registros, con un bucle que haga 8 iteraciones comenzando con el registro número 9. Evidentemente, ese "9" hay que guardarlo en una variable fuera del PrintPage, porque todo lo que hagas dentro se pierde cuando sales del procedimiento tras acabar de imprimir cada página. Esto se repite hasta que ya no haya más registros. Entonces se pone HasMorePages=False antes de salir del PrintPage, y eso hace que ya no se dispare más veces.

    En resumidas cuentas, el PrintPage no tiene que imprimir tus 40 filas. Solo tiene que imprimir 8. Y cuáles son las 8 que imprime lo tienes que decir desde fuera del PrintPage, usando una variable a nivel de clase que "salve" cuál es la siguiente fila que toca imprimir.

    miércoles, 20 de septiembre de 2017 20:59

Todas las respuestas

  • Me temo que no has entendido bien cómo funciona el HasMorePages. Estás intentando hacer un bucle que recorra todos los registros y poniendo HasMorePages a True cada 8 registros. Así no funciona. Dentro del PrintPage solo puedes ejecutar lo que va a una sola página. Eso quiere decir que el bucle solo puede hacer 8 iteraciones. En ese momento pones HasMorePges=True y sales del PrintPage. Eso hace que se imprima la página con los primeros 8 registros, y a causa del HasMorePges=True se vuelve a disparar el PrintPage. En este segundo disparo, vuelves a imprimir otros 8 registros, con un bucle que haga 8 iteraciones comenzando con el registro número 9. Evidentemente, ese "9" hay que guardarlo en una variable fuera del PrintPage, porque todo lo que hagas dentro se pierde cuando sales del procedimiento tras acabar de imprimir cada página. Esto se repite hasta que ya no haya más registros. Entonces se pone HasMorePages=False antes de salir del PrintPage, y eso hace que ya no se dispare más veces.

    En resumidas cuentas, el PrintPage no tiene que imprimir tus 40 filas. Solo tiene que imprimir 8. Y cuáles son las 8 que imprime lo tienes que decir desde fuera del PrintPage, usando una variable a nivel de clase que "salve" cuál es la siguiente fila que toca imprimir.

    miércoles, 20 de septiembre de 2017 20:59
  • Envío el código que he modificado con tu ayuda. Espero que, al compartir dicho código, sea herramienta de ayuda para otras personas que lo necesiten.

    En comparación al código anteriormente expuesto, declaré la variable que cuenta cada registro impreso [contadorregistros] en la clase, fuera de los subs y tal variable la usé como iniciador del ciclo FOR [i = contadorregistros] para posteriormente crear un IF que validara el paso del contador cada 8 registros para realizar la impresión en una nueva página [e.HasMorePages = true] de lo contrario, que siguiera imprimiendo en la misma página [e.HasMorePages = false] .

    Para finalizar, agradezco y de manera extensa tu respuesta ya que con lo que redactó fue posible a la primera prueba obtener con éxito lo que buscaba.

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    contadorregistros = 0 PrintDocument1.Print()
    End Sub
    Dim contadorregistros As Integer = 0
    Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    Try
    Dim rowfont As New Font("Arial", 10, FontStyle.Regular) Dim registroactual As String = "" Dim banderapos As Boolean = False Dim xpos As Integer = 50 Dim ypos As Integer = 80
    For i As Integer = contadorregistros To DGTabla.RowCount - 1
    registroactual = registroactual & DGTabla(0, i).Value & vbTab & txtTotal.Text & vbTab & "Fechaderecibo"
    If banderapos = False Then
    e.Graphics.DrawString(registroactual, rowfont, Brushes.Black, xpos, ypos) banderapos = True contadorregistros = contadorregistros + 1
    Else
    e.Graphics.DrawString(registroactual, rowfont, Brushes.Black, 500, ypos) banderapos = False ypos += 250 contadorregistros = contadorregistros + 1
    End If
    MsgBox("Contador de registros = " & contadorregistros) registroactual = ""
    If contadorregistros = 8 Or contadorregistros = 16 Or contadorregistros = 24 Or contadorregistros = 32 _ Or contadorregistros = 40 Or contadorregistros = 48 Or contadorregistros = 56 Or contadorregistros = 64 _ Or contadorregistros = 72 Or contadorregistros = 80 Or contadorregistros = 88 Or contadorregistros = 96 _ Or contadorregistros = 104 Or contadorregistros = 112 Or contadorregistros = 120 Or contadorregistros = 128 _ Or contadorregistros = 136 Or contadorregistros = 144 Or contadorregistros = 152 Or contadorregistros = 160 _ Or contadorregistros = 168 Or contadorregistros = 176 Or contadorregistros = 184 Or contadorregistros = 192 _ Or contadorregistros = 200 Or contadorregistros = 208 Or contadorregistros = 216 Or contadorregistros = 224 _ Or contadorregistros = 232 Or contadorregistros = 240 Or contadorregistros = 248 Or contadorregistros = 256 _ Or contadorregistros = 264 Or contadorregistros = 272 Or contadorregistros = 280 Or contadorregistros = 288 _ Or contadorregistros = 296 Or contadorregistros = 304 Or contadorregistros = 312 Or contadorregistros = 320 _ Or contadorregistros = 328 Or contadorregistros = 336 Or contadorregistros = 344 Or contadorregistros = 352 _ Or contadorregistros = 360 Or contadorregistros = 368 Or contadorregistros = 376 Or contadorregistros = 384 _ Or contadorregistros = 392 Or contadorregistros = 400 Or contadorregistros = 408 Or contadorregistros = 416 _ Or contadorregistros = 424 Or contadorregistros = 432 Or contadorregistros = 440 Or contadorregistros = 448 _ Or contadorregistros = 456 Or contadorregistros = 464 Or contadorregistros = 472 Or contadorregistros = 480 _ Or contadorregistros = 488 Or contadorregistros = 496 Or contadorregistros = 504 Or contadorregistros = 512 _ Or contadorregistros = 520 Or contadorregistros = 528 Or contadorregistros = 536 Or contadorregistros = 544 _ Or contadorregistros = 552 Or contadorregistros = 560 Or contadorregistros = 568 Or contadorregistros = 576 _ Or contadorregistros = 584 Or contadorregistros = 592 Or contadorregistros = 600 Or contadorregistros = 608 _ Or contadorregistros = 616 Or contadorregistros = 624 Or contadorregistros = 632 Or contadorregistros = 640 _ Or contadorregistros = 648 Or contadorregistros = 656 Or contadorregistros = 664 Or contadorregistros = 672 _ Then
    e.HasMorePages = True
    Exit Sub
    Else
    e.HasMorePages = False
    End If
    Next
    Catch ex As Exception
    MsgBox("Error en debido a: " & ex.Message, MsgBoxStyle.Exclamation, "Advertencia!!")
    End Try
    End Sub
    Por ahora quiero saber como poner la hoja en tamaño oficio, agradecería toda la ayuda posible y quisiera también que me analizaran el código arriba. Gracias por la ayuda.


    jueves, 21 de septiembre de 2017 17:01
  • Excelente explicación, hay muchos ejemplos pero este es el punto calve que no encontraba, muchas gracias.
    miércoles, 4 de septiembre de 2019 14:56