PRINTDIALOG EM PRINTDOCUMENT
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?
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
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)
Não funcionou!
Continua a não exibir as opções de impressoras disponÃveis.
Continua a não exibir as opções de impressoras disponÃveis.
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.
Faça mais algumas adaptações para a sua funcionalidade e pronto.
Espero que te ajude.
E então, colega, já solucionou o problema?
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
Creio que o problema seu está no While:
Tente assim:
Se não der certo, posta aÃ.
Tente assim:
While (LinhaAtual <= DataGridView1.Rows.Count - 1)
Se não der certo, posta aÃ.
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:
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
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())
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())
Ops! cometi um erro (rsrs)
Você precisa criar uma variável (LinhaTabela) ou outro nome a seu gosto, como private, junto com a variavel PaginaAtual
no while onde está
mude para
While (LinhaAtual < LinhasPorPagina AndAlso LinhaTabela <= DataGridView1.Rows.Count - 1
e no BeginPrint, inicie a variável com valor Zero
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
mais um detalhe RSRS, incremente mais um na variavel LinhaTabela dentro do While, pode ser abaixo do LinhaAtual
Tópico encerrado , respostas não são mais permitidas