IMPRIMIR USANDO O PRINTPREVIEWCONTROL

ALVAROVB2009 28/09/2016 14:32:48
#467644
Galera boa tarde, preciso de uma ajuda para imprimir em várias páginas utilizando o componente PrintPreviewControl

Tenho o comando abaixo e que se eu imprimir apenas 1 página fica show, o problema é quando preciso imprimir mais de 1 página
Esse é meu primeiro projeto no vb.net e estou um pouco perdido com os comandos ainda, desenvolvo em vb6 e lá tem o datareport que faz sóznho a criação de mais páginas, tem o printer.newpage para criar uma nova página na mão, tem o Crystal etc, aqui estou usando esse componente carregado a partir de um datatable e preciso montar a impressão de uma carteirinha para associados e são 2 carteirinhas por linha e 8 por página

Vendo alguns projetos vi que a orientação era colocar o e.HasMorePages = True, porém quando mando imprimir ele não gera o documento, é como se ele entrasse em um loop infinito, exibindo na tela apenas a quantidade de documento que esta sendo criado sem exibir nada
Alguém pode me mostrar onde estou errando ?

Dim Da As New OleDb.OleDbDataAdapter([Ô]SELECT nomeassociado,matricula,admisassociado,cartProfisAssociado,rgAssociado FROM tbAssociados WHERE codAssociado in ([Ô] & CodigosSelecionados & [Ô])[Ô], Cn)
Dim Dt = New DataTable
Da.Fill(Dt)

Dim Linha As Integer = 70
Dim Coluna As Integer = 140
Dim ComplementoLinha1 As Integer = 15
Dim ComplementoLinha2 As Integer = 30
Dim ComplementoLinha3 As Integer = 95
Dim Carteirinha As Single = 0
Dim TotalCarteirinha As Single = 1 [ô]Saber quantas etiquetas foram impressas na página
Dim I As Integer

For I = 0 To Dt.Rows.Count - 1
[ô]coloquei esse bloco, sem ele funciona perfeito a impressão de 1 página
If TotalCarteirinha > 8 Then
TotalCarteirinha = 1
e.HasMorePages = True
Coluna = 140
Else
e.HasMorePages = False
End If
[ô]fim do bloco
If Carteirinha = 0 Then
e.Graphics.DrawString(UCase(Dt.Rows(I).ItemArray(0)), New Font([Ô]arial[Ô], 8, FontStyle.Regular), Brushes.Black, Linha, Coluna, New StringFormat())
e.Graphics.DrawString([Ô]Matricula: [Ô], New Font([Ô]arial[Ô], 6, FontStyle.Regular), Brushes.Black, Linha, Coluna + ComplementoLinha1)
e.Graphics.DrawString(Dt.Rows(I).ItemArray(1), New Font([Ô]arial[Ô], 6, FontStyle.Regular), Brushes.Black, Linha + 40, Coluna + ComplementoLinha1)
e.Graphics.DrawString([Ô]Admissão: [Ô], New Font([Ô]arial[Ô], 6, FontStyle.Regular), Brushes.Black, Linha + 80, Coluna + ComplementoLinha1)
e.Graphics.DrawString(FormatDateTime(Dt.Rows(I).ItemArray(2), DateFormat.ShortDate), New Font([Ô]arial[Ô], 6, FontStyle.Regular), Brushes.Black, Linha + 120, Coluna + ComplementoLinha1)
e.Graphics.DrawString([Ô]CTPS: [Ô], New Font([Ô]arial[Ô], 6, FontStyle.Regular), Brushes.Black, Linha, Coluna + ComplementoLinha2)
e.Graphics.DrawString(IIf(Dt.Rows(I).IsNull(3), [Ô][Ô], Dt.Rows(I).ItemArray(3)), New Font([Ô]arial[Ô], 6, FontStyle.Regular), Brushes.Black, Linha + 40, Coluna + ComplementoLinha2)
e.Graphics.DrawString([Ô]RG: [Ô], New Font([Ô]arial[Ô], 6, FontStyle.Regular), Brushes.Black, Linha + 80, Coluna + ComplementoLinha2)
e.Graphics.DrawString(IIf(Dt.Rows(I).IsNull(4), [Ô][Ô], Dt.Rows(I).ItemArray(4)), New Font([Ô]arial[Ô], 6, FontStyle.Regular), Brushes.Black, Linha + 120, Coluna + ComplementoLinha2)
e.Graphics.DrawString([Ô]Presidente[Ô], New Font([Ô]arial[Ô], 6, FontStyle.Regular), Brushes.Black, Linha + 60, Coluna + ComplementoLinha3)
e.Graphics.DrawImage(Form3.PictureBox1.Image, Linha, Coluna + 40)
Carteirinha = 1
TotalCarteirinha += 1
Else
e.Graphics.DrawString(Dt.Rows(I).ItemArray(0), New Font([Ô]arial[Ô], 8, FontStyle.Regular), Brushes.Black, Linha + 400, Coluna)
e.Graphics.DrawString([Ô]Matricula: [Ô], New Font([Ô]arial[Ô], 6, FontStyle.Regular), Brushes.Black, Linha + 400, Coluna + ComplementoLinha1)
e.Graphics.DrawString(Dt.Rows(I).ItemArray(1), New Font([Ô]arial[Ô], 6, FontStyle.Regular), Brushes.Black, Linha + 440, Coluna + ComplementoLinha1)
e.Graphics.DrawString([Ô]Admissão: [Ô], New Font([Ô]arial[Ô], 6, FontStyle.Regular), Brushes.Black, Linha + 480, Coluna + ComplementoLinha1)
e.Graphics.DrawString(FormatDateTime(Dt.Rows(I).ItemArray(2), DateFormat.ShortDate), New Font([Ô]arial[Ô], 6, FontStyle.Regular), Brushes.Black, Linha + 520, Coluna + ComplementoLinha1)
e.Graphics.DrawString([Ô]CTPS: [Ô], New Font([Ô]arial[Ô], 6, FontStyle.Regular), Brushes.Black, Linha + 400, Coluna + ComplementoLinha2)
e.Graphics.DrawString(IIf(Dt.Rows(I).IsNull(3), [Ô][Ô], Dt.Rows(I).ItemArray(3)), New Font([Ô]arial[Ô], 6, FontStyle.Regular), Brushes.Black, Linha + 480, Coluna + ComplementoLinha2)
e.Graphics.DrawString([Ô]RG: [Ô], New Font([Ô]arial[Ô], 6, FontStyle.Regular), Brushes.Black, Linha + 520, Coluna + ComplementoLinha2)
e.Graphics.DrawString(IIf(Dt.Rows(I).IsNull(4), [Ô][Ô], Dt.Rows(I).ItemArray(4)), New Font([Ô]arial[Ô], 6, FontStyle.Regular), Brushes.Black, Linha + 450, Coluna + ComplementoLinha2)
e.Graphics.DrawString([Ô]Presidente[Ô], New Font([Ô]arial[Ô], 6, FontStyle.Regular), Brushes.Black, Linha + 460, Coluna + ComplementoLinha3)
e.Graphics.DrawImage(Form3.PictureBox1.Image, Linha + 400, Coluna + 40)
Carteirinha = 0
Coluna += 270
TotalCarteirinha += 1
End If
Next

Desde já agradeço a todos
PERCIFILHO 28/09/2016 15:11:14
#467645
Resposta escolhida
Veja se este tópico te ajuda.
OCELOT 28/09/2016 15:31:39
#467648
O que vejo que as pessoas tem mais dificuldade com isso é que não entendem como o evento PrintPage e o HasMorePages funciona.

No PrintPage você deve imprimir apenas uma página, terminou de imprimir tudo que tinha pra página então você deve ver se ainda tem mais coisas que queria imprimir, se sim então você seta o HasMorePages como true e sai da função.

Saiu da função o próprio PrintDocument (não lembro ao certo, acho que era ele) vai detectar que você setou o HasMorePages e vai chamar novamente o PrintPage, então de alguma forma você precisa saber continuar imprimindo essa nova página de onde parou na página anterior.

Então o que você não deve fazer é acessar o banco de dados dentro do PrintPage, você já deve ter feito isso antes de mandar imprimir e deve ter guardado o resultado em algum lugar, que pode ser um variável na classe em si, deve de alguma forma também guardar a linha atual fora do PrintPage, para da segunda vez em diante poder saber onde parou.

Um pseudo código seria mais ou menos assim
Private DT As DataTable
Private ProximoRegistro As Integer

Private Sub IniciarImpressao()
[ô]reseta o proximo registro
ProximoRegistro = 0
[ô]carrega os dados
DT = MinhaFuncaoQueCarregaDadosERetornaUmDataTable()
[ô]aqui iniciaria a impressão, se não me engano criaria o PrintDocument
[ô]e colocaria ele no PrintPreviewControl, mas não me lembro de cabeça
[ô]e não tenho como testar agora
End Sub

Private Sub Document_PrintPage (ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs)

[ô]eu preciso imprimir 8 por página, então também preciso saber nessa página quantos foram, iniciando pelo 1
dim ItemAtualDaPagina As Integer = 1

[ô]muito importante, nunca fique criando objetos Font sem usar o Using ou chamar o Dispose depois
Using fonteArial8 as New Font([Ô]arial[Ô], 8, FontStyle.Regular)

[ô]poderia usar um for mas acho mais fácil fazer um do while
Do While ProximoRegistro < DT.Rows.Count

[ô]Aqui eu imprimo o registro atual normalmente
e.Graphics.DrawString(UCase(Dt.Rows(ProximoRegistro).ItemArray(0)), fonteArial8, Brushes.Black, Linha, Coluna, New StringFormat())
[ô].... resto do código de imprimir

[ô]Teminei de imprimir então incremento tanto o atual da página como o proximo registro
ItemAtualDaPagina += 1
ProximoRegistro += 1

[ô]agora verifico se já imprimi os 8 itens que cabem na página
If ItemAtualDaPagina > 8 Then
[ô]se já imprimi 8 então tenho que ver se ainda existem mais itens, se sim preciso setar o HasMorePages
[ô]poderia ser um if, mas é mais prático colocar direto a comparação na atribuição do valor
e.HasMorePages = ProximoRegistro < DT.Rows.Count
[ô]e o mais importante, tenho que sair da função
Return
End If
Loop

End Using

End Sub

Pode ter um errinho ou outro na lógica pois fiz de cabeça sem poder testar nada no momento, mas é algo assim que você precisa
ALVAROVB2009 28/09/2016 15:45:46
#467650
Ocelot e Percifilho obrigado pelo retorno de vcs !!!!

Ocelot realmente não entendo muito do comando, porque voltei agora para o vb.net e a última vez que trabalhei com o vb.net foi quando o 2005 saiu e mudaram muitas coisas e eu não peguei a parte de impressão
E o motivo de eu pegar agora, foi por ter que gerar a carteirinha de associado usando uma assinatura em PNG, coisa que o vb6 não faz e como estou com o tempo corrido, peguei o que eu lembrava dos códigos e fui atrás da para de impressão, então não tive e nem tenho muito tempo agora para ver direitinho o comando, más agradeço a sua explicação e demonstração

Percifilho peguei o seu projeto demonstração e ele é o que eu preciso , acredito que nem terei que fazer muitos ajustes

Mais uma vez agradeço aos dois
Tópico encerrado , respostas não são mais permitidas