none
Mudar pagina usando PrintDocument no VB.NET 2012? RRS feed

  • Pergunta

  • Boa noite a todos!

    Estou precisando de uma ajuda de vocês e a quem ajudar-me agradeço, seguinte não estou conseguindo mudar de pagina utilizando o PrintDocument do VB.NET 2012, uma vez que o relatório é impresso em bobina, porem na visualização não muda de pagina, segue o fragmento do código:

    Private Sub btnImprime_Click(sender As Object, e As EventArgs) Handles btnImprime.Click
    
          Try
    
             If chkVisualizar.Checked = False Then
                Captura_ImpressoraDefault()
                PrintCC.PrinterSettings.PrinterName = pkInstalledPrinters
    
                gMensagem = "Imprimindo de outras estações de Trabalho"
                AddHandler PrintCC.PrintPage, AddressOf Me.Dados_Conta
                PrintCC.Print()
             Else
                AddHandler PrintCC.PrintPage, AddressOf Me.Dados_Conta
    
                With PrintPreview
                   .Document = PrintCC
                   .WindowState = FormWindowState.Maximized
                   .PrintPreviewControl.Zoom = 1   'maxima a visualização
                   .Text = "Visual KITCHENS®"
                   'exibe a janela de visualização para o usuário
                   .ShowDialog()
                End With
             End If
    
             Exit Sub
    
          Catch ex As Exception
             MsgBox(gMensagem & vbCrLf & ex.Message, MsgBoxStyle.Critical, "ERRO")
          End Try
    
       End Sub
    
       Private Sub Dados_Conta(ByVal sender As Object, ByVal ev As PrintPageEventArgs)
          Dim pFont1 As New Font("COURIER NEW", 10, FontStyle.Regular)
          Dim pFont As New Font("ARIAL", 18, FontStyle.Bold)
          Dim pFont2 As New Font("ARIAL BLACK", 10, FontStyle.Regular)
          Dim lX, lY As Integer
          Dim S1 As String = "===================================="
          Dim S2 As String = "===================================="
          Dim S3 As String = "------------------------------------"
          Dim lLinha As Integer = 15
          Dim lTotalGeral As Decimal
          Dim LinhasPorPagina As Integer = 75
          Dim lQtdeItens As Integer = 0
    
          Try
    
             For ContaItens = 0 To clbSelecionados.Items.Count - 1
                lTotalGeral = 0.0
    
                gMensagem = "Abrindo Base de Dados"
                If gCN.State = ConnectionState.Open Then gCN.Close()
                gCN.Open()
    
                gSQL = "Select CLI.CLI_NOME as NomeCliente, CLI.CLI_ENDERECO as CliEnder, CLI_NUMERO as CliNumero, CCC.ID_CLIENTE as IdCliente, CCC.DATA_COMPRA as DataCompra, CCC.VALOR_COMPRA as VlrCompra " _
                     & "From tbContaCorrenteCliente as CCC, tbCliente as CLI Where CCC.ID_CLIENTE = CLI.ID_Cliente and CCC.BAIXA = " & False & " and CCC.ID_CLIENTE = " & CLng(clbSelecionados.Items(ContaItens).valor) _
                     & " and CCC.DATA_COMPRA >= CDATE('" & dtpInicial.Value & "') and CCC.DATA_COMPRA <= CDATE('" & dtpFinal.Value & "')" _
                     & " order by CCC.DATA_COMPRA asc"
                gCMD = New OleDbCommand(gSQL, gCN)
                gDtR = gCMD.ExecuteReader
                gDtR.Read()
    
                If gDtR.HasRows Then
    
                   ev.Graphics.DrawString("CLIENTE : " & gDtR.Item("NomeCliente"), pFont1, Brushes.Black, 10, lLinha)
                   lQtdeItens += 1
                   lLinha += 15
                   ev.Graphics.DrawString("ENDEREÇO: " & gDtR.Item("CliEnder") & ", " & gDtR.Item("CliNumero").ToString, pFont1, Brushes.Black, 10, lLinha)
                   lQtdeItens += 1
                   lLinha += 15
                   ev.Graphics.DrawString("CÓDIGO  : " & gDtR.Item("IdCliente").ToString, pFont1, Brushes.Black, 10, lLinha)
                   lQtdeItens += 1
                   lLinha += 15
                   ev.Graphics.DrawString("DATA    : " & Date.Now.ToShortDateString, pFont1, Brushes.Black, 10, lLinha)
                   lQtdeItens += 1
                   lLinha += 15
                   ev.Graphics.DrawString("   RELAÇÃO DE DESPESAS (CLIENTE)", pFont1, Brushes.Black, 15, lLinha)
                   lQtdeItens += 1
                   lLinha += 15
                   ev.Graphics.DrawString(S1, pFont1, Brushes.Black, 10, lLinha)
                   lQtdeItens += 1
                   lLinha += 15
                   ev.Graphics.DrawString("   DATA     DESCRIÇÃO      VALOR R$", pFont1, Brushes.Black, 10, lLinha)
                   lQtdeItens += 1
                   lLinha += 15
                   ev.Graphics.DrawString(S1, pFont1, Brushes.Black, 10, lLinha)
                   lQtdeItens += 1
                   lLinha += 15
                   ev.Graphics.DrawString(CDate(gDtR.Item("DataCompra")) & " Despesas Gerais " & Space(9 - Len(FormatCurrency(gDtR.Item("VlrCompra"), 2, , , TriState.UseDefault))) & FormatCurrency(gDtR.Item("VlrCompra"), 2, , , TriState.UseDefault), pFont1, Brushes.Black, 10, lLinha)
                   lQtdeItens += 1
                   lLinha += 15
                   lTotalGeral += gDtR.Item("VlrCompra")
    
                   gMensagem = "Capturando dados SQL"
                   Do While gDtR.Read
                      ev.Graphics.DrawString(CDate(gDtR.Item("DataCompra")) & " Despesas Gerais " & Space(9 - Len(FormatCurrency(gDtR.Item("VlrCompra"), 2, , , TriState.UseDefault))) & FormatCurrency(gDtR.Item("VlrCompra"), 2, , , TriState.UseDefault), pFont1, Brushes.Black, 10, lLinha)
                      lQtdeItens += 1
                      lLinha += 15
                      lTotalGeral += gDtR.Item("VlrCompra")
    
                      MsgBox(LinhasPorPagina)
                      MsgBox(lQtdeItens)
    
                      If lQtdeItens < LinhasPorPagina Then
                         ev.HasMorePages = False
                      Else
                         ev.HasMorePages = True
                         lLinha = 15
                         lQtdeItens = 0
                      End If
    
                   Loop
    
                   ev.Graphics.DrawString(Space(24) & "------------", pFont1, Brushes.Black, 10, lLinha)
                   lQtdeItens += 1
                   lLinha += 15
                   ev.Graphics.DrawString(Space(9) & "TOTAL GERAL R$ " & Space(12 - Len(FormatCurrency(lTotalGeral, 2, , , TriState.UseDefault))) & FormatCurrency(lTotalGeral, 2, , , TriState.UseDefault), pFont1, Brushes.Black, 10, lLinha)
                   lQtdeItens += 1
                   lLinha += 45
    
                End If
    
             Next
    
          Catch ex As Exception
             MsgBox(ex.Message & vbNewLine & gMensagem, MsgBoxStyle.Critical, "ERRO: Filtrando Dados")
          End Try
    
       End Sub
    Att.

    Dilson J. Hasselmann Desenvolvedor VB.NET

    sexta-feira, 22 de novembro de 2013 00:28

Respostas

  • DjHasselmann,

    no momento em que você chama em seu código:

    ev.HasMorePages = True

    Você está informando que, quando você acabar de o seu procedimento, um evento Print_Page será disparado; ou seja, o seu código tem ser terminado, se você continua a escrever coisas, ele ainda está na mesma página. o Argumento "e" que foi gerando na abertura do procedimento ainda está vinculado a página que o iniciou.

    Você precisa, talvez colocar isso em uma classe, transformar o resultado da sua busca (os elementos que você faz read, coloque-os em uma lista qualquer para usar em um "For Each" em uma variavel global e de acordo com que for imprimindo, ir eliminado da lista, assim quando você der o "HasMorePages" você pode terminar o "Sub" imediatamente, e capturar o vento Print_Page, zerando o contador da linha (pois é uma página nova), e imprimindo os elementos que faltam...

    Espero ter ajudado.


    • Editado SammuelMiranda quinta-feira, 23 de janeiro de 2014 12:22 Comentários
    • Marcado como Resposta DJHasselmann domingo, 15 de junho de 2014 22:32
    quinta-feira, 23 de janeiro de 2014 12:20

Todas as Respostas

  • é mudar de pagina ou dar um espaço ?


    Fulvio Cezar Canducci Dias

    segunda-feira, 25 de novembro de 2013 13:24
  • DjHasselmann,

    no momento em que você chama em seu código:

    ev.HasMorePages = True

    Você está informando que, quando você acabar de o seu procedimento, um evento Print_Page será disparado; ou seja, o seu código tem ser terminado, se você continua a escrever coisas, ele ainda está na mesma página. o Argumento "e" que foi gerando na abertura do procedimento ainda está vinculado a página que o iniciou.

    Você precisa, talvez colocar isso em uma classe, transformar o resultado da sua busca (os elementos que você faz read, coloque-os em uma lista qualquer para usar em um "For Each" em uma variavel global e de acordo com que for imprimindo, ir eliminado da lista, assim quando você der o "HasMorePages" você pode terminar o "Sub" imediatamente, e capturar o vento Print_Page, zerando o contador da linha (pois é uma página nova), e imprimindo os elementos que faltam...

    Espero ter ajudado.


    • Editado SammuelMiranda quinta-feira, 23 de janeiro de 2014 12:22 Comentários
    • Marcado como Resposta DJHasselmann domingo, 15 de junho de 2014 22:32
    quinta-feira, 23 de janeiro de 2014 12:20