AJUDA COM P?GINA NO OBJETO PRINTDOCUMENT

CARINHENA 22/02/2016 23:16:25
#458062
Pessoal, boa noite, tudo bem?
Eu tenho uma rotina que [Ô]distribui[Ô] informações em um listbox, e preciso imprimir via printer... eu consigo imprimir, mas, não consigo gerar páginas.
Poderiam me ajudar?

Criei um código resumido, que mostra o que estou fazendo e no que posso estar errando:
  
Dim FonteMensagem As New Font([Ô]arial[Ô], 9, System.Drawing.GraphicsUnit.Point) [ô]fonte
Dim ListB As New ListBox

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Imprimir()
End Sub

Private Sub Imprimir()
ListB.Items.Add([Ô]Pagina 1[Ô])
ListB.Items.Add([Ô]Pagina 2[Ô])
PrintDialog.Document = PrintDocument1
If PrintDialog.ShowDialog() = DialogResult.OK Then
Me.PrintDocument1.Print()
End If
End Sub

Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
e.Graphics.PageUnit = GraphicsUnit.Millimeter
Dim i As Integer = 0
Dim total As Integer = ListB.Items.Count

For Each item In ListB.Items
i += 1
e.Graphics.DrawString(item.ToString(), FonteMensagem, Brushes.Gray, 160, 50)
If i <> total Then
e.HasMorePages = True
Else
e.HasMorePages = False
End If
Next
End Sub


Essa Rotina mostra a impressão, aparecendo o item [Ô]página 2[Ô], sinal que ele não separou as páginas e imprimiu a última, li bastante mas, não consegui chegar a uma conclusão por não ter muita experiencia com a ferramenta.
PERCIFILHO 23/02/2016 07:57:58
#458067
Resposta escolhida
Bom dia, camarada.
é o seguinte: eu fiz um exemplo bem simplesinho para um colega aqui do Fórum, não faz muito tempo, com esse mesmo problema.
Ele está todo comentado. Vou te passar, você analisa, mas vai ter que adaptar para a sua necessidade. Espero que te ajude.
Qualquer coisa, se não conseguir, dá um grito aí que se eu não puder te responder, tem muito mais gente boa aqui que vai te ajudar.
Abraços.
PLUGSOFTSM 23/02/2016 09:45:11
#458074
Cara... A impressão via print é uma das coisas que a Microsoft conseguiu piorar muito no .net
pra essa tua rotina tu tem que fazer o seguinte:

Dim FonteMensagem As New Font([Ô]arial[Ô], 9, System.Drawing.GraphicsUnit.Point) [ô]fonte
Dim ListB As New ListBox
dim Pag as integer = 0

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Imprimir()
End Sub

Private Sub Imprimir()
ListB.Items.Add([Ô]Pagina 1[Ô])
ListB.Items.Add([Ô]Pagina 2[Ô])
PrintDialog.Document = PrintDocument1
If PrintDialog.ShowDialog() = DialogResult.OK Then
Me.PrintDocument1.Print()
End If
End Sub

Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
e.Graphics.PageUnit = GraphicsUnit.Millimeter
Dim i As Integer = 0
Dim total As Integer = ListB.Items.Count

[ô] For Each item In ListB.Items
for K as integer = Pag to listb.items.count-1
[ô] i += 1
e.Graphics.DrawString(item.ToString(), FonteMensagem, Brushes.Gray, 160, 50)
If K < listb.itens.count -1 Then
pag = k + 1 [ô]O segredo está em declarar essa variável global para que quando a rotina retornar depois do exit sub, e impressão não reinicie na primeira página novamente

e.HasMorePages = True
exit sub
Else
e.HasMorePages = False
End If
Next
End Sub


Espero ter ajudado
CARINHENA 24/02/2016 16:30:08
#458171
Galera, agradeço pela atenção.
Eu consegui entender a lógica por cima do print (que eu acho bem ruim, diga-se de passagem).
Antes eu achava que o
e.HasMorePages = True
, dizia: [Ô]Seguinte, vai pra próxima folha e grava lá![Ô].

Só que não é bem assim.
Quando você coloca esse código, ele simplesmente passa novamente pelo PrintDocument1_PrintPage, então, ele vai gravando por cima.

Na lógica deles, eu tive que criar um indice, então, toda vez o
e.HasMorePages = True
aparece eu gravo em qual linha do listbox ele gravou, para que na p'roxima passada, ele só imprima o que eu quero... ate chegar o fim.

Obrigado pela ajuda!
Tópico encerrado , respostas não são mais permitidas