Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

SérgioLSilva

PrintDocument

Recommended Posts

Estou com dificuldades com printdocument , onde ele mostra perfeito na tela , navego entre as paginas impressas , mas quando clico na impressão so sai a primeira pagina e o cabecalho , os dados impressos não sai. será que algem sabe o que fazer ???? estou usando Vs 2008 (Vb)

 

segue o codigo abaixo .....

 

obrigado

 

Imports System.Drawing.Printing

Public Class Form1
	Inherits System.Windows.Forms.Form

	'Variável para armazenar o PATH do arquivo executável
	Private strAppPath As String
	'Variável para armazenar o número da página atual
	Private PaginaAtual As Integer = 1
	Private DataReaderClientes As OleDb.OleDbDataReader
	'****************************************************************************
***************
	'Este é o procedimento que efetivamente gera o documento de impressão
	'****************************************************************************
***************
	Private Sub rptClientesAtivos(ByVal sender As Object, ByVal Relatorio As System.Drawing.Printing.PrintPageEventArgs)

		'estas variáveis armazenarão as informações do registro para impressão
		Dim strCódigoDoCliente As String
		'Dim strNomeDaEmpresa As String
		'Dim strNomeDoContato As String
		'Dim strCargoDoContato As String

		'variáveis para definição das configurações da impressora (margens, número de linhas, espessura da caneta) 
		Dim LinhasPorPagina As Single = 0
		Dim PosicaoDaLinha As Single = 0
		Dim LinhaAtual As Integer = 0
		Dim MargemEsquerda As Single = Relatorio.MarginBounds.Left
		Dim MargemSuperior As Single = Relatorio.MarginBounds.Top + 100
		Dim MargemDireita As Single = Relatorio.MarginBounds.Right
		Dim MargemInferior As Single = Relatorio.MarginBounds.Bottom
		Dim CanetaDaImpressora As Pen = New Pen(Color.Black, 1)

		'variáveis para armazenar as fontes que serão utilizadas durante a impressão
		Dim FonteNegrito As Font
		Dim FonteTitulo As Font
		Dim FonteSubTitulo As Font
		Dim FonteRodape As Font
		Dim FonteNormal As Font

		'definição das fontes (tamanho e estilo)
		FonteNegrito = New Font("Arial", 9, FontStyle.Bold)
		FonteTitulo = New Font("Arial", 20, FontStyle.Bold)
		FonteSubTitulo = New Font("Arial", 12, FontStyle.Bold)
		FonteRodape = New Font("Arial", 8)
		FonteNormal = New Font("Arial", 9)

		'********************************
		'imprime o cabeçalho do relatório
		'********************************
		Relatorio.Graphics.DrawLine(CanetaDaImpressora, MargemEsquerda, 60, MargemDireita, 60)
		Relatorio.Graphics.DrawImage(Image.FromFile("C:\Sistemas\Cimi\Fotos\lgcabec.jpg"), 100, 68)
		Relatorio.Graphics.DrawLine(CanetaDaImpressora, MargemEsquerda, 160, MargemDireita, 160)
		Relatorio.Graphics.DrawString("Northwind Traders", FonteTitulo, Brushes.Black, MargemEsquerda + 95, 75, New StringFormat())
		Relatorio.Graphics.DrawString("Cadastro de Clientes Ativos - Atualizado em " & System.DateTime.Today, FonteSubTitulo, Brushes.Black, MargemEsquerda + 95, 120, New StringFormat())
		'*******************************************
		'imprime os títulos das colunas do relatório
		'*******************************************
		Relatorio.Graphics.DrawString("Código", FonteNegrito, Brushes.Black, MargemEsquerda, 170, New StringFormat())
		Relatorio.Graphics.DrawString("Nome da Empresa", FonteNegrito, Brushes.Black, MargemEsquerda + 70, 170, New StringFormat())
		Relatorio.Graphics.DrawString("Nome do Contato", FonteNegrito, Brushes.Black, MargemEsquerda + 290, 170, New StringFormat())
		Relatorio.Graphics.DrawString("Cargo do Contato", FonteNegrito, Brushes.Black, MargemEsquerda + 420, 170, New StringFormat())
		Relatorio.Graphics.DrawLine(CanetaDaImpressora, MargemEsquerda, 190, MargemDireita, 190)

		'define o número de linhas por página de acordo com a área de impressão e o tamanho da fonte
		'subtraimos o valor 10 do resultado para acomodar o rodapé do relatório
		LinhasPorPagina = Relatorio.MarginBounds.Height / FonteNormal.GetHeight(Relatorio.Graphics) - 10

		'ativamos o tratamento de erro
		Try
			'alimentamos as variáveis com as informações do primeiro registro 
			'extraído do banco de dados através do objeto OleDbDataReader
			strCódigoDoCliente = DataReaderClientes("JA2_CHAMADA")
			'strNomeDaEmpresa = DataReaderClientes("NomeDaEmpresa")
			'strNomeDoContato = DataReaderClientes("NomeDoContato")
			'strCargoDoContato = DataReaderClientes("CargoDoContato")

			'iniciamos o loop através dos registros do DataReader 
			'respeitando o número de linhas por página
			While (LinhaAtual < LinhasPorPagina And DataReaderClientes.Read())
				PosicaoDaLinha = MargemSuperior + (LinhaAtual * FonteNormal.GetHeight(Relatorio.Graphics))
				Relatorio.Graphics.DrawString(strCódigoDoCliente, FonteNormal, Brushes.Black, MargemEsquerda, PosicaoDaLinha, New StringFormat())
				'Relatorio.Graphics.DrawString(strNomeDaEmpresa, FonteNormal, Brushes.Black, MargemEsquerda + 70, PosicaoDaLinha, New StringFormat())
				'Relatorio.Graphics.DrawString(strNomeDoContato, FonteNormal, Brushes.Black, MargemEsquerda + 290, PosicaoDaLinha, New StringFormat())
				'Relatorio.Graphics.DrawString(strCargoDoContato, FonteNormal, Brushes.Black, MargemEsquerda + 420, PosicaoDaLinha, New StringFormat())

				LinhaAtual += 1
				'verifica o número da linha atual para não ultrapassar o número de linhas por página
				If (LinhaAtual < LinhasPorPagina) Then
					strCódigoDoCliente = DataReaderClientes("JA2_CHAMADA")
					'strNomeDaEmpresa = DataReaderClientes("NomeDaEmpresa")
					'strNomeDoContato = DataReaderClientes("NomeDoContato")
					'strCargoDoContato = DataReaderClientes("CargoDoContato")
				End If

			End While

			'*****************************
			'imprime o rodapé do relatório
			'*****************************
			Relatorio.Graphics.DrawLine(CanetaDaImpressora, MargemEsquerda, MargemInferior, MargemDireita, MargemInferior)
			Relatorio.Graphics.DrawString(System.DateTime.Now, FonteRodape, Brushes.Black, MargemEsquerda, MargemInferior, New StringFormat())
			Relatorio.Graphics.DrawString("Página: " & PaginaAtual, FonteRodape, Brushes.Black, MargemDireita - 50, MargemInferior, New StringFormat())
			Relatorio.Graphics.DrawString("Revista Fórum Access, Visual Basic & Office", FonteRodape, Brushes.Black, MargemEsquerda + 200, MargemInferior, New StringFormat())

			'incrementa o número da página
			PaginaAtual += 1

			'utiliza um dos campos do DataReader para verificar se ainda 
			'restam registros para impressão. Se houver, a propriedade 
			'HasMorePages é definida como True indicando uma nova página
			If (DataReaderClientes("JA2_CHAMADA") <> Nothing) Then
				Relatorio.HasMorePages = True
			Else
				Relatorio.HasMorePages = False
			End If
			'captura qualquer Exception gerada durante o processamento
		Catch exRelatorio As System.Exception
			'se desejar, inclua código para tratamento das exceptions neste ponto
		End Try

	End Sub
	Private Sub cmdVisualizarRelatório_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdVisualizarRelatório.Click

		'variável para a string de conexão com o BD
		Dim strCnString As String
		'variável para o PATH do banco de dados
		Dim strDatabasePath As String
		'objeto OleDbConnection
		Dim cnNorthwind As OleDb.OleDbConnection
		'objeto PrintPreviewDialog (será utilizado para implementar a visualização da impressao)
		Dim objPrintPreview As PrintPreviewDialog
		'objeto OpenFileDialog (caso o banco de dados não seja encontrado exibe a janela de diálogo OpenFile)
		Dim objOpenFileDialog As OpenFileDialog

		'ativa a ampulheta para indicar que há processamento em andamento.
		Cursor.Current = System.Windows.Forms.Cursors.WaitCursor

		'alimentamos a variável com o caminho completo do nosso arquivo executável
		'a função MID é utilizada para remover o nome do arquivo *.exe, assim podemos
		'utilizar o PATH para outras finalidades.
		strAppPath = "C:\Sistemas\Cimi\BD\"

		'o PATH do banco de dados é igual ao strAppPath adicionando apenas o nome do arquivo *.mdb
		strDatabasePath = strAppPath & "cimi.mdb"

		'verifica se o Path está correto
		If Dir(strDatabasePath) = "" Then
			'se não estiver exibe janela de diálogo para o usuário informar a localização correta
			objOpenFileDialog = New OpenFileDialog()
			'define algumas propriedades do objeto OpenFileDialog
			With objOpenFileDialog
				.DefaultExt = "*.mdb"
				.FileName = "cimi.mdb"
				.Filter = "Microsoft Access Databases (*.mdb)|*.mdb|Todos arquivos (*.*)|*.*"
				.Title = "Informe a localização do Arquivo Northwind.mdb (em português)"
				.ShowDialog()
			End With
			'Se o usuário não informar a localização correta notificaremos ele com uma 
			'caixa de mensagem.
			If Dir(objOpenFileDialog.FileName) = "" Then
				MessageBox.Show("Você precisa informar a localização do arquivo Northwind.mdb.", _
								"Banco de Dados não Localizado", _
								MessageBoxButtons.OK, _
								MessageBoxIcon.Exclamation)
			Else 'caso contrário, armazenamos o valor retornado pela janela de diálogo na variável strDatabasePath
				strDatabasePath = objOpenFileDialog.FileName
			End If
		End If

		'construimos a string de conexão utilizando a variável strCnString
		strCnString = "Provider=Microsoft.Jet.OLEDB.4.0;"
		strCnString = strCnString & "User ID=Admin;"
		strCnString = strCnString & "Password=;"
		strCnString = strCnString & "Data Source=" & strDatabasePath

		'criamos uma nova instância do objeto OleDbConnection passando a string de conexão criada
		cnNorthwind = New OleDb.OleDbConnection(strCnString)

		'ativamos o tratamento de erros para estabelecer a conexão com o BD
		Try
			cnNorthwind.Open() 'invocamos o método Open
			StatusBar1.Text = "Banco de dados conectado com sucesso." 'Notificamos o usuário sobre o andamento
		Catch exConnection As System.Exception 'capturamos qualquer exception gerada durante o processamento
			'Nofificamos o usuário caso ocorra uma exception
			MessageBox.Show(exConnection.GetBaseException.ToString, "Erro ao Conectar com o Banco de Dados", MessageBoxButtons.OK, MessageBoxIcon.Error)
		End Try

		'Esta variável armazenará a instrução SQL que será utizada pelo objeto OleDbCommand
		Dim sqlClientes As String

		'Alimentamos a variável com nossa instrução SQL
		sqlClientes = "SELECT JA2_CHAMADA from JA2 ORDER BY JA2_CHAMADA"

		'Numa única linha, declaramos e instanciamos o objeto OleDbCommand
		'passando a instrução SQL e a conexão ativa 
		Dim cmdClientes As New OleDb.OleDbCommand(sqlClientes, cnNorthwind)

		'notificamos o usuário do andamento
		StatusBar1.Text = "Lendo a tabela de Clientes ... "

		'O objeto DataReader será carregado através da execução do método ExecuteReader() do OleDbCommand
		DataReaderClientes = cmdClientes.ExecuteReader()

		'Inicia o Loop através do DataReader para passar as informações para a rotina de impressão
		While DataReaderClientes.Read()
			'criamos um novo Documento de Impressão
			Dim pd As PrintDocument = New PrintDocument()
			'estabelecemos a relação entre o novo objeto PrintDocument e o procedimento rptClientesAtivos
			AddHandler pd.PrintPage, AddressOf Me.rptClientesAtivos
			'****************************************************************************
********************'
			'SE VOCÊ DESEJA ENVIAR O RELATÓRIO DIRETAMENTE PARA A IMPRESSORA BASTA REMOVER AS LINHAS ABAIXO  '
			'E INVOCAR O MÉTODO PRINT DO OBJETO PRINTDOCUMENT DESTA FORMA: pd.Print()						'								   '
			'****************************************************************************
********************'
			'criamos uma nova instância do objeto PrintPreviewDialog										 
			objPrintPreview = New PrintPreviewDialog()
			'atribuimos valores para algumas das propriedades do objeto									  
			With objPrintPreview
				.Document = pd 'informamos qual é o documento a ser visualizado							  
				.WindowState = FormWindowState.Maximized 'inicia com a janela maximizada					 
				.PrintPreviewControl.Zoom = 1 'inicia com o Zoom em 100%									  
				.Text = "Northwind Traders - Cadastro de Clientes" 'muda o título da janela de visualização  
				.TopMost = True
				.ShowDialog() 'exibe a janela para o usuário
			End With
			'****************************************************************************
********************'
			'PARA ENVIAR DIRETAMENTE PARA A IMPRESSORA: REMOVER ATÉ AQUI E INCLUIR pd.Print()				'
			'****************************************************************************
********************'
		End While

		StatusBar1.Text = "Relatório gerado com sucesso ... "

		'fecha o DataReader
		DataReaderClientes.Close()

		'fecha a conexão
		cnNorthwind.Close()

		'restaura o cursor
		Cursor.Current = System.Windows.Forms.Cursors.Default

	End Sub
End Class

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.