none
Ayuda. Como imprimir contendido de una tabla para mas de una pagina con PrintDocument en Visual Basic .NET 2013 RRS feed

  • Pregunta

  • Hola a todos!

    Me presento soy Luis Alberto.

    Mi problema es el siguiente:

    Tengo una tabla llamada "inventario" con unos 190 registros o mas. Deseo imprimir todo el contenido de la tabla utilizando el control PrintDocument. El problema es que solo me imprime 69 registros o lo que equivale a una pagina. Luego no imprime el resto.

    Dejo aqui el codigo asociado al control printdocument para solicitarles alguna ayuda al respecto.

    Dim dsi As New DataSet
    Dim strsql As String = "SELECT nombreproducto, medida, cantidad, categoria FROM inventario"
    Dim adpi As New OleDb.OleDbDataAdapter(strsql, conn)

    dsi.Tables.Add("tabla")
    adpi.Fill(dsi.Tables("tabla"))

    Dim prFont As New Font("Arial", 12, FontStyle.Bold)
    e.Graphics.DrawString("Inventario Total", prFont, Brushes.Black, 0, 0)
     prFont = New Font("Arial", 10, FontStyle.Regular)
    e.Graphics.DrawString(Date.Now.ToString, prFont, Brushes.Black, 5, 25)
    prFont = New Font("Arial", 8, FontStyle.Regular)


    e.Graphics.DrawString("Producto  Medida Cantidad", prFont, Brushes.Black, 0, 45)
    e.Graphics.DrawString("_____________________", prFont, Brushes.Black, 0, 48)

     Dim registros As Integer
     registros = dsi.Tables(0).Rows.Count
     Dim i As Integer = 0
    For i = 0 To registros - 1
            e.Graphics.DrawString(dsi.Tables("tabla").Rows(i).Item("nombreproducto").ToString, prFont,         Brushes.Black, 0, 48 + (i + 1) * 15)
              e.Graphics.DrawString(dsi.Tables("tabla").Rows(i).Item("medida").ToString, prFont, Brushes.Black, 210, 48 + (i + 1) * 15)
              e.Graphics.DrawString(dsi.Tables("tabla").Rows(i).Item("cantidad").ToString, prFont, Brushes.Black, 250, 48 + (i + 1) * 15)

                If i <= registros - 1 Then
                    e.HasMorePages = True
                End If

    Next

    Saludos espero alguna ayuda lo agredecere mucho!!


    • Editado ubluis viernes, 6 de febrero de 2015 21:40
    viernes, 6 de febrero de 2015 21:21

Respuestas

  • Imports System.Drawing.Printing
    
    Public Class Form1
    
        Dim filas As IEnumerator
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Dim tabla As New DataTable
            tabla.Columns.Add("col1", GetType(Double))
    
            Randomize()
            For k As Integer = 1 To 200
                tabla.Rows.Add(Rnd() * 1000)
            Next
    
            filas = tabla.Rows.GetEnumerator
            Dim pd As New PrintDocument
            AddHandler pd.PrintPage, AddressOf ImprimePágina
            If filas.MoveNext Then pd.Print()
        End Sub
    
        Private Sub ImprimePágina(ByVal sender As Object, ByVal e As PrintPageEventArgs)
    
            Dim prFont As New Font("Arial", 12, FontStyle.Bold)
    
            e.Graphics.DrawString("Inventario Total", prFont, Brushes.Black, 0, 0)
    
            prFont = New Font("Arial", 10, FontStyle.Regular)
            e.Graphics.DrawString(Date.Now.ToString, prFont, Brushes.Black, 5, 25)
    
            prFont = New Font("Arial", 8, FontStyle.Regular)
            e.Graphics.DrawString("Producto Medida Cantidad", prFont, Brushes.Black, 0, 45)
            e.Graphics.DrawString("_____________________", prFont, Brushes.Black, 0, 48)
    
            Dim i As Integer = 0
            For i = 0 To 1000
                'e.Graphics.DrawString(dsi.Tables("tabla").Rows(i).Item("nombreproducto").ToString, prFont, Brushes.Black, 0, 48 + (i + 1) * 15)
                'e.Graphics.DrawString(dsi.Tables("tabla").Rows(i).Item("medida").ToString, prFont, Brushes.Black, 210, 48 + (i + 1) * 15)
                'e.Graphics.DrawString(dsi.Tables("tabla").Rows(i).Item("cantidad").ToString, prFont, Brushes.Black, 250, 48 + (i + 1) * 15)
    
                Dim fila As DataRow = CType(filas.Current, DataRow)
                Dim yPos = 48 + (i + 1) * 15
    
                If Not yPos > e.MarginBounds.Bottom Then
                    e.Graphics.DrawString(fila.Table.Rows.IndexOf(fila).ToString, prFont, Brushes.Black, 150, yPos)
                    e.Graphics.DrawString(fila.Item("col1").ToString, prFont, Brushes.Black, 250, yPos)
                Else
                    Exit For
                End If
    
                e.HasMorePages = filas.MoveNext
                If Not e.HasMorePages Then Exit For
            Next
    
        End Sub
    
    End Class
    

    O sea, debes mantener una referencia externa del registro que estás imprimiendo. En este caso, ya que tenemos una colección, usamos su iterador.

    viernes, 6 de febrero de 2015 22:14