PRINTDIALOG EM PRINTDOCUMENT

W8.LISBOA 06/01/2016 20:34:00
#455811
Olá amigos,

Estou a um tempo trabalhando em um relatório com PrintDocument, estou usando um exemplo do site macoratti, mas não conseguir fazer com que a caixa de PrintDialog apareça, assim minha impressão vai direto para a impressora padrão.

Segue o cogido usado... em algum momento tenho que definir o (PrintDialog) mas não sei onde, uma luz?

   Private Sub Imprimir()
[ô]define o titulo do relatorio
RelatorioTitulo = [Ô]COMPROVANTE DE LANÇAMENTO Nº: [Ô] & ID_Lancamento

[ô]define os objetos printdocument e os eventos associados
Dim pd As Printing.PrintDocument = New Printing.PrintDocument()

[ô] definimos 3 eventos para tratar a impressao: printpage, beginprint e endprint.
AddHandler pd.PrintPage, New Printing.PrintPageEventHandler(AddressOf Me.pdRelatorios_Printpage)
AddHandler pd.BeginPrint, New Printing.PrintEventHandler(AddressOf Me.Begin_Print)
AddHandler pd.EndPrint, New Printing.PrintEventHandler(AddressOf Me.End_Print)

[ô]define o objeto para visualizar a impressao
Dim objprintpreview As New PrintPreviewDialog

[ô]define o formulario como maximizado e com zoom
Try
With objprintpreview
.Document = pd

.WindowState = FormWindowState.Maximized

[ô]define se quer paisagem ---comente para ficar normal
[ô] pd.DefaultPageSettings.Landscape = True

.PrintPreviewControl.Zoom = 1
.Text = [Ô]Teste[Ô]
.ShowDialog()
End With
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try
End Sub
DAMASCENO.CESAR 06/01/2016 23:45:59
#455815
Uso essa mesma função, mas sem o endprint, e funciona normal, comente essa linha pra ver
Citação:

AddHandler pd.EndPrint, New Printing.PrintEventHandler(AddressOf Me.End_Print)

W8.LISBOA 07/01/2016 19:57:07
#455865
Não funcionou!

Continua a não exibir as opções de impressoras disponíveis.
PERCIFILHO 08/01/2016 09:00:49
#455888
Resposta escolhida
Um exemplo bem simples, adaptado do site do Macoratti.
Faça mais algumas adaptações para a sua funcionalidade e pronto.
Espero que te ajude.
PERCIFILHO 11/01/2016 13:58:56
#455969
E então, colega, já solucionou o problema?
W8.LISBOA 11/01/2016 20:23:02
#455989
Citação:

:
E então, colega, já solucionou o problema?



Então meu caro amigo, solucionou sim!

Estou adaptando o relatório aqui para ser gerado a partir de um datagridview, mas entrei em um loop infinito (literalmente falando) rsrsr. Desculpe a falta de conhecimento, programo por curiosidade, não é minha profissão!

Alguém poderia dar um help, no evento Begin_Print quando passo os dados para o grid, estou em loop.


      Private Sub Imprimir()
RelatorioTitulo = [Ô]COMPROVANTE TESTEº: [Ô] & ID_Lancamento
Dim doc As PrintDocument = New PrintDocument
AddHandler doc.PrintPage, New Printing.PrintPageEventHandler(AddressOf Me.pdRelatorios_Printpage)
AddHandler doc.BeginPrint, New Printing.PrintEventHandler(AddressOf Me.Begin_Print)
AddHandler doc.EndPrint, New Printing.PrintEventHandler(AddressOf Me.End_Print)
Dim dialogo As PrintDialog = New PrintDialog
dialogo.Document = doc
If (dialogo.ShowDialog = DialogResult.OK) Then
Dim preview As PrintPreviewDialog = New PrintPreviewDialog()
preview.Document = doc
preview.WindowState = FormWindowState.Maximized
preview.PrintPreviewControl.Zoom = 1.0
preview.ShowDialog()
End If
End Sub
Private Sub Begin_Print(ByVal sender As Object, ByVal e As Printing.PrintEventArgs)

paginaAtual = 1

End Sub

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

[ô] variaveis das linhas
Dim LinhasporPagina As Single = 0
Dim PosicaoDaLinha As Single = 0
Dim LinhaAtual As Integer = 0

[ô] variaveis das margens (e.MarginBounds obtem a area retangular que representa a parte da pagina dentro das margens.)
Dim MargemEsquerda As Single = e.MarginBounds.Left
Dim MargemSuperior As Single = e.MarginBounds.Top + 145
Dim MargemDireita As Single = e.MarginBounds.Right
Dim MargemInferios As Single = e.MarginBounds.Bottom

[ô]classe Pen define um objeto usado para definir linhas e curvas
Dim CanetaDaImpressora As Pen = New Pen(Color.Black, 1)

[ô]variaveis das fontes usdas( a classe font define um formato especifico para texto, incluindo face da fonte, tamanho e atributos de estilo.
Dim FonteNegrito As Font
Dim FonteTitulo As Font
Dim FonteSubTitulo As Font
Dim FonteRodape As Font
Dim FonteNormal As Font

[ô]define efeitos em fontes usadas
FonteNegrito = New Font([Ô]Arial[Ô], 9, FontStyle.Bold)
FonteTitulo = New Font([Ô]Arial[Ô], 15, FontStyle.Bold)
FonteSubTitulo = New Font([Ô]Arial[Ô], 12, FontStyle.Bold)
FonteRodape = New Font([Ô]Arial[Ô], 8)
FonteNormal = New Font([Ô]Arial[Ô], 9)

[ô]define valores para linha atual e para linha da impressao
LinhaAtual = 0

[ô]cabecalho-------

[ô]imprimir o titulo do relatorio
e.Graphics.DrawString(RelatorioTitulo, FonteSubTitulo, Brushes.Black, MargemEsquerda + 160, 60, New StringFormat)


[ô]drawline - desenha uma linha que conecta os dois pontos especificados pelos pares coordenados
e.Graphics.DrawLine(CanetaDaImpressora, MargemEsquerda, 85, MargemDireita, 85)

[ô]campos a serem impressos :
e.Graphics.DrawString([Ô]TESTE[Ô], FonteNegrito, Brushes.Black, MargemEsquerda + 5, 90, New StringFormat)
e.Graphics.DrawString([Ô]TESTE2[Ô], FonteNegrito, Brushes.Black, MargemEsquerda + 200, 90, New StringFormat)
e.Graphics.DrawString([Ô]TESTE3[Ô], FonteNegrito, Brushes.Black, MargemEsquerda + 340, 90, New StringFormat)

[ô]drawline - desenha uma linha que conecta os dois pontos especificados pelos pares coordenados
e.Graphics.DrawLine(CanetaDaImpressora, MargemEsquerda, 110, MargemDireita, 110)

[ô]define o numero de linhas por pagina
LinhasporPagina = CInt(e.MarginBounds.Height / FonteNormal.GetHeight(e.Graphics) - 9)


[ô]obtem os valores
While (LinhaAtual < LinhasporPagina)

For i As Integer = 0 To DataGridView1.Rows.Count - 1
[ô] inicia a impressao - define a pocisao da linha e a posicao de impressora
PosicaoDaLinha = MargemSuperior + (LinhaAtual * FonteNormal.GetHeight(e.Graphics))
e.Graphics.DrawString(DataGridView1.Item(1, i).Value.ToString(), FonteNormal, Brushes.Black, MargemEsquerda + 5, PosicaoDaLinha, New StringFormat())
e.Graphics.DrawString(DataGridView1.Item(2, i).Value.ToString(), FonteNormal, Brushes.Black, MargemEsquerda + 200, PosicaoDaLinha, New StringFormat())
e.Graphics.DrawString(DataGridView1.Item(3, i).Value.ToString(), FonteNormal, Brushes.Black, MargemEsquerda + 340, PosicaoDaLinha, New StringFormat())

[ô]incremwnta linha
LinhaAtual += 1
Next i
End While

[ô]imprime o rodape
e.Graphics.DrawLine(CanetaDaImpressora, MargemEsquerda, MargemInferios, MargemDireita, MargemInferios)
e.Graphics.DrawString(System.DateTime.Now.ToString(), FonteRodape, Brushes.Black, MargemEsquerda, MargemInferios, New StringFormat())

LinhaAtual += CInt(FonteNormal.GetHeight(e.Graphics))
LinhaAtual += 1
e.Graphics.DrawString([Ô]Página : [Ô] & paginaAtual, FonteRodape, Brushes.Black, MargemDireita - 50, MargemInferios, New StringFormat)

[ô]incrementa o numero da pagina
paginaAtual += 1

[ô]verifica se continua imprimindo
If (LinhaAtual > LinhasporPagina) Then
e.HasMorePages = True
Else
e.HasMorePages = False
End If
End Sub

Private Sub End_Print(ByVal sender As Object, ByVal byvale As Printing.PrintEventArgs)

End Sub
PERCIFILHO 12/01/2016 08:33:18
#455999
Creio que o problema seu está no While:
Tente assim:

While (LinhaAtual <= DataGridView1.Rows.Count - 1)


Se não der certo, posta aí.
W8.LISBOA 12/01/2016 19:32:08
#456045
Funcionou em partes, quando a quantidade de linhas do datagrid não ultrapassa uma pagina, a impressão funciona, caso ultrapasse para a segunda pagina entra em loop repetindo sempre a primeira pagina.

Ficou dessa forma:
         [ô]obtem os valores 
While (LinhaAtual <= DataGridView1.Rows.Count - 1)
For i As Integer = 0 To DataGridView1.Rows.Count - 1
[ô] inicia a impressao - define a pocisao da linha e a posicao de impressora
PosicaoDaLinha = MargemSuperior + (LinhaAtual * FonteNormal.GetHeight(e.Graphics))
e.Graphics.DrawString(DataGridView1.Item(1, i).Value.ToString(), FonteNormal, Brushes.Black, MargemEsquerda + 5, PosicaoDaLinha, New StringFormat())
e.Graphics.DrawString(DataGridView1.Item(2, i).Value.ToString(), FonteNormal, Brushes.Black, MargemEsquerda + 200, PosicaoDaLinha, New StringFormat())
e.Graphics.DrawString(DataGridView1.Item(3, i).Value.ToString(), FonteNormal, Brushes.Black, MargemEsquerda + 340, PosicaoDaLinha, New StringFormat())

[ô]incrementa linha
LinhaAtual += 1
Next i
End While

DAMASCENO.CESAR 12/01/2016 22:29:32
#456052
voce precisa de um contador para as linhas da página e para as linhas do grid
While (LinhaAtual < LinhasPorPagina AndAlso LinhaAtual <= DataGridView1.Rows.Count - 1

esse [txt-color=#e80000]FOR [/txt-color]dentro do while tá errado!
elimina o FOR e faça assim:

e.Graphics.DrawString(DataGridView1.Item(1, LinhaAtual).Value.ToString(), FonteNormal, Brushes.Black, MargemEsquerda + 5, PosicaoDaLinha, New StringFormat())
DAMASCENO.CESAR 12/01/2016 22:43:56
#456055
Ops! cometi um erro (rsrs)

Citação:

voce precisa de um contador para as linhas da página e para as linhas do grid
While (LinhaAtual < LinhasPorPagina AndAlso LinhaAtual <= DataGridView1.Rows.Count - 1

esse FOR dentro do while tá errado!
elimina o FOR e faça assim:

e.Graphics.DrawString(DataGridView1.Item(1, LinhaAtual).Value.ToString(), FonteNormal, Brushes.Black, MargemEsquerda + 5, PosicaoDaLinha, New StringFormat())



Você precisa criar uma variável (LinhaTabela) ou outro nome a seu gosto, como private, junto com a variavel PaginaAtual

no while onde está
Citação:

While (LinhaAtual < LinhasPorPagina AndAlso LinhaAtual <= DataGridView1.Rows.Count - 1



mude para
While (LinhaAtual < LinhasPorPagina AndAlso LinhaTabela <= DataGridView1.Rows.Count - 1

e no BeginPrint, inicie a variável com valor Zero
DAMASCENO.CESAR 12/01/2016 22:45:06
#456057
mais um detalhe RSRS, incremente mais um na variavel LinhaTabela dentro do While, pode ser abaixo do LinhaAtual
Página 1 de 2 [12 registro(s)]
Tópico encerrado , respostas não são mais permitidas