none
[AJUDA] Como dividir impressão em várias páginas RRS feed

  • Pergunta

  • Seguinte galera, criei um form para impressão de alguns dados de um tabela Access. Até ai tudo bem, realizei a conexão tudo funcionando normal, porém os dados que quero imprimir, tem +1500 Linhas, e quando simulo a impressão, a página fica totalmente lerda (Devido ao programa carregar muitos dados em um página só). Enfim realizei várias pesquisas, achei casos semelhantes, porém ao tentar fazer não ta fluindo, eis minha pergunta: Como faço para limitar uma certa quantidade de linhas por pagina, e ao mesmo tempo gerar outras paginas??

    Segue a parte do código que interessa:

    
    
    Private Sub PrintDoc_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDoc.PrintPage
    
            Dim strconexao As String
            strconexao = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source= " & Application.StartupPath & "\BD.accdb"
            Dim conectar As New OleDb.OleDbConnection
    
    
            conectar.ConnectionString = strconexao
            conectar.Open()
    
            Dim cmd As New OleDb.OleDbCommand
    
    
            cmd.Connection = conectar
    
            cmd.CommandText = "SELECT * FROM TBProdutos order by nome"
    
            Dim reader As OleDb.OleDbDataReader
            reader = cmd.ExecuteReader()
            Dim gp As GraphicsPath = New GraphicsPath()
            Dim radius As Single = 5
            Dim x As Single = 50
            Dim y As Single = 50
            Dim Altura As Integer = 70
            Dim Largura As Integer = 670
    
    
    '------------comeco da borda-----------------'
            gp.AddLine(x + radius, y, x + Largura - (radius * 2), y)
            gp.AddArc(x + Largura - (radius * 2), y, radius * 2, radius * 2, 270, 90)
            gp.AddLine(x + Largura, y + radius, x + Largura, y + Altura - (radius * 2))
            gp.AddArc(x + Largura - (radius * 2), y + Altura - (radius * 2), radius * 2, radius * 2, 0, 90)
            gp.AddLine(x + Largura - (radius * 2), y + Altura, x + radius, y + Altura)
            gp.AddArc(x, y + Altura - (radius * 2), radius * 2, radius * 2, 90, 90)
            gp.AddLine(x, y + Altura - (radius * 2), x, y + radius)
            gp.AddArc(x, y, radius * 2, radius * 2, 180, 90)
    
            gp.CloseFigure()
            e.Graphics.DrawPath(Pens.Black, gp)
            gp.Dispose()
    '--------------- fim da borda -------------'
    
            Dim font As New Font("Arial", 9, FontStyle.Regular, GraphicsUnit.Point)
            Dim font1 As New Font("Segoe UI Semilight", 14, FontStyle.Bold, GraphicsUnit.Point)
            Dim font2 As New Font("Arial", 9, FontStyle.Bold, GraphicsUnit.Point)
    
            Dim LinhasX1 As Single = 50
            Dim LinhasX2 As Single = 560
            Dim a As Integer
    
            Do While reader.Read()
                Dim nome As String = reader("nome")
                Dim modelo As String = reader("modelo")
                Dim precoc As Double = reader("preco_custo")
                Dim dataos As String = DateTime.Now.ToString("dd/MM/yyyy HH:mm")
                If nome.Length > 30 Then
                    nome = nome.Substring(0, 29) & "."
                End If
                If modelo.Length > 55 Then
                    modelo = modelo.Substring(0, 54) & "."
                End If
                e.Graphics.DrawString(nome, font, Brushes.Black, 50, 180 + a)
                e.Graphics.DrawString("Nome:", font2, Brushes.Black, 50, 166)
                e.Graphics.DrawString(modelo, font, Brushes.Black, 330, 180 + a)
                e.Graphics.DrawString("Modelo:", font2, Brushes.Black, 330, 166)
                e.Graphics.DrawString(precoc.ToString("c"), font, Brushes.Black, 650, 180 + a)
                e.Graphics.DrawString("Preço Custo:", font2, Brushes.Black, 650, 166)
    
                e.Graphics.DrawImage(Image.FromFile(Application.StartupPath & "\logo.png"), 150, 58)
                e.Graphics.DrawString("Rua xxxx, xx - zzz", font, Brushes.Black, 450, 73)
                e.Graphics.DrawString("   (11) 0000-0000 / (11) 0000-0000", font, Brushes.Black, 450, 85)
                e.Graphics.DrawString("RELATÓRIO", font1, Brushes.Black, 350, 130)
                e.Graphics.DrawString(dataos, font, Brushes.Black, 603, 125)
                a += 13
    
            Loop
        End Sub


    sexta-feira, 31 de outubro de 2014 18:03

Respostas

Todas as Respostas

  • Por que você não conta o numero de linhas retornadas de sua consulta e limita a impressão de 80 linhas por pagina:

    Veja ai um tutorial de Macoratti
    sexta-feira, 31 de outubro de 2014 18:27
  • Rapaz, como tinha dito antes, tentei uns metodos para fazer a contagem de linhas, até que ele limitava, mas não consegui joga-las para as seguintes páginas. Teria como você me explicar algum jeito mais sucinto?
    sexta-feira, 31 de outubro de 2014 18:38
  • Clica no link que passei, ele faz a impressão por pagina
    sexta-feira, 31 de outubro de 2014 18:41
  • Desculpa não vi :P
    Então, dei uma lida no tutorial (obviamente lendo as partes em relação a limitação das linhas) E o seguinte, no codigo ele não declarou a variável "linhaAtual" e é exatamente isso que me "buga", o que diabos declaro nela? Obvio que são as linhas referentes aos dados da tabela mas, como atribuo esse valor??

    "While (linhaAtual < linhasPorPagina And leitor.Read())"

    sexta-feira, 31 de outubro de 2014 19:00
  • kkk Macoratti nunca passa todo o código, baixa o fonte no final da pagina que tem tudo declarado
    sexta-feira, 31 de outubro de 2014 19:28