Usuário com melhor resposta
Mudar pagina usando PrintDocument no VB.NET 2012?

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
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
Todas as 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