El siguiente ejemplo utiliza una base de datos, como soporte de datos.
Private Sub Hoja_PrintPage(ByVal sender As Object, _
ByVal e As System.Drawing.Printing.PrintPageEventArgs) _
Handles Hoja.PrintPage
Static Posicion As Integer
Dim Cy As Single ' Coordenada vertical
Dim Cabec As Boolean = True
While Posicion < Tabla.Rows.Count
Reg = Tabla.Rows(Posicion)
If Cabec Then ' Cabeceras
Cabeceras(Cy, e)
Cabec = False
End If
LineaDetalle(Reg, e, Cy) ' Línea de detalle
Posicion = Posicion + 1 ' Incremento del contador
If Cy > e.MarginBounds.Height * 0.8 Then
e.HasMorePages = True ' Hay más hojas
Exit Sub
End If
End While
e.HasMorePages = False ' No hay más hojas
Posicion = 0 ' para más listados
End Sub
Si se compara éste ejemplo con los anteriores, podremos ver que los cambios son mínimos.
Visto varios ejemplos vamos a detallar el funcionamiento de los mismos.
Definición de elementos que intervienen
Static Posicion As Integer
Dim Cy As Single ' Coordenada vertical
Dim Cabec As Boolean = True
Posición, se ha conservado su nombre por motivos didácticos, además no está fuera de lugar tampoco, es el contador que nos permite progresar en la colección de filas de la tabla.
Se define estático, para preservar su valor con respecto a las reentradas en el procedimiento después de generar páginas nuevas.
While Posicion < Tabla.Rows.Count
El control del bucle, mientras hayan filas, posición menor que el número de filas.
Reg = Tabla.Rows(Posicion)
Fila, registro a procesar.
If Cabec Then ' Cabeceras
Cabeceras(Cy, e)
Cabec = False
End If
El control de cabeceras, cuando se produce la reentrada, pero si no se entra en el bucle no se ejecutan.
LineaDetalle(Reg, e, Cy) ' Línea de detalle
Impresión propiamente dicha de la línea de detalle.
Posicion = Posicion + 1 ' Incremento del contador
Incremento de la posición en la tabla.
If Cy > e.MarginBounds.Height * 0.8 Then
e.HasMorePages = True ' Hay más hojas
Exit Sub
End If
El control de final de página.
Se realiza porque la variable Cy, se compara con un porcentaje del alto del objeto, 80, 90 % según las necesidades.
e.HasMorePages = True ' Hay más hojas
Exit Sub
Esto es lo que provoca el salto de página en realidad, y la reentrada en el procedimiento de nuevo, y eso es desde el principio, es decir se vuelve a ejecutar
Static Posicion As Integer
Dim Cy As Single ' Coordenada vertical
Dim Cabec As Boolean = True
De ahí, que al inicializarse a cierto Cabec, la cabecera se ejecute al principio de cada página.
Y ese es el peligro del funcionamiento del evento PrintPage, si no se escribe bien, se pierden datos por lecturas indebidas.
Y al finalizar el listado, el bucle, el While.
End While
e.HasMorePages = False ' No hay más hojas
Posicion = 0 ' para más listados
Indicamos que no hay más páginas.
e.HasMorePages = False ' No hay más hojas
Y la variable posición se asigna a cero para segundos usos.
Esto es en detalle el funcionamiento del evento Printpage, desde donde se lanza el listado.
Lo más importante es
e.HasMorePages = True ' Hay más hojas
Exit Sub
Que es lo que provoca la salida del procedimiento de evento, la obtención de una página nueva, y la reentrada en el mismo, desde el principio, con todas sus consecuencias.
Cuando finaliza el proceso se ejecuta este evento, y en el se cierran archivos, si procede, o se realizan procesos de actualización, etc.
Pero al igual que el BeginPrint, se ejecuta solo una vez.
Síguenos en: Facebook Sobre aulaClic Política de Cookies