![]() |
No artigo de hoje vou mostrar como podemos imprimir o conteúdo de um controle ListBox usando a linguagem VB .NET e também C#. |
![]() |
Hoje vamos preencher um controle ListBox a partir de uma base de dados e imprimir o seu conteúdo usando o objeto PrintDocument.
Para simplificar vou usar o banco de dados Northwind.mdb e exibir o nome do produto encontrado na tabela Products.
A seguir usando os controles PrintDocument e PrintDialog irei imprimir os nomes dos produtos.
Já sabemos que a classe PrintDocument é o coração do processo de impressão no Visual Basic e ao usá-la em seu programa será criada uma instância desta classe com os eventos que serão usados para a impressão.
O objeto PrintDocument dispara quatro eventos chaves básicos:
Depois que você criou um objeto PrintDocument e definiu os manipuladores de eventos você pode fazer 3 coisas com ele:
Nota: O controle PrintPreviewControl exibe uma janela de visualização da impressão com a diferença que ele fica no seu formulário e não apresenta os mesmos botões do PrintPreviewDialog mas possui métodos que permitem simular o mesmo comportamento.
Recursos usados
Criando o projeto no VS Community
Abra o VS Community 2015 e clique em New Project;
A seguir selecione Other Project Types -> Blank Solutin
Informe o nome Imprimindo_ListBox e clique no botão OK;
![]() |
A seguir no menu File clique em Add -> New Project;
Selecione o template Visual Basic -> Windows -> Windows Forms Application;
Informe o nome Imprimindo_ListBox.VBNET e clique no botão OK;
Agora vamos definir no formulário form1.vb a declaração do namespace:
Imports
System.Data.OleDbDefina também no formulário as seguintes variáveis :
Dim conexao As New OleDbConnection()A primeira cria um objeto do tipo OledbConnection para realizar a conexão com o banco de dados Northwind.mdb
A segunda define um objeto do tipo StringReader que irá receber os dados do ListBox que desejamos imprimir.
A seguir a partir da ToolBox inclua no formulário form1.vb os seguintes controles:
Disponha os controles no formulário conforme o leiaute da figura abaixo:
1- Preenchendo o ListBox a partir de um banco de dados
No evento Click do botão de comando - Carregar Dados - inclua o código a seguir:
Private Sub btnCarregarDados_Click(sender As Object, e As EventArgs) Handles btnCarregarDados.Click conexao.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\dados\Northwind.mdb" carregaListBox(lbDados, "Select ProductName from products") End Sub |
private void btnCarregarDados_Click(object sender, EventArgs e)
{
conexao.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\dados\\Northwind.mdb";
carregaListBox(lbDados, "Select ProductName from products");
}
|
Neste código após definir a string de conexão, estamos chamando o método carregaListBox() que passa o controle e o comando SQL para retornar os dados da tabela Products.
A seguir temos o código do método carregaListBox() :
Private Sub carregaListBox(ByVal lst As ListBox, ByVal query As String) lst.Items.Clear() ' abre a conexao conexao.Open() ' cria um comando select. Dim cmd As New OleDb.OleDbCommand(query, conexao) ' executa a consulta Dim db_reader As OleDbDataReader = cmd.ExecuteReader(CommandBehavior.Default) ' exibe os resultados Dim texto As String Dim i As Integer Do While db_reader.Read texto = db_reader.Item(0).ToString For i = 1 To db_reader.FieldCount - 1 texto &= vbTab & db_reader.Item(i).ToString Next i lst.Items.Add(texto) Loop ' fecha a conexao conexao.Close() End Sub |
private void carregaListBox(ListBox lst, string query) { lst.Items.Clear(); // abre a conexao conexao.Open(); // cria um comando select. OleDb.OleDbCommand cmd = new OleDb.OleDbCommand(query, conexao); // executa a consulta OleDbDataReader db_reader = cmd.ExecuteReader(CommandBehavior.Default); // exibe os resultados string texto = null; int i = 0; while (db_reader.Read) { texto = db_reader.Item(0).ToString; for (i = 1; i <= db_reader.FieldCount - 1; i++) { texto += Constants.vbTab + db_reader.Item(i).ToString; } lst.Items.Add(texto); } // fecha a conexao conexao.Close(); } |
Nessa abordagem estamos usando um DataReader para acessar os dados da tabela Products; a seguir percorremos o datareader e obtemos a informação armazenando-a na variável texto que é incluída no ListBox.
Executando o projeto e acionando este botão de comando do formulário teremos o seguinte resultado:
2- Imprimindo o conteúdo do ListBox
A lógica para impressão é usar o evento PrintPage do objeto PrintDocument definindo nele o código para imprimir o conteúdo do ListBox.
No evento Click do botão de comando - Imprimir ListBox - temos o código abaixo:
Private Sub btnImprimirListbox_Click(sender As Object, e As EventArgs) Handles btnImprimirListbox.Click printDialog1.Document = PrintDocument1 Dim strTexto As String = "" For Each x In lbDados.Items strTexto = (strTexto & x.ToString()) + vbLf Next dadosListBox = New StringReader(strTexto) If printDialog1.ShowDialog() = DialogResult.OK Then Me.printDocument1.Print() End If End Sub |
private void btnImprimirListbox_Click(object sender, EventArgs e) { printDialog1.Document = PrintDocument1; string strTexto = ""; foreach (void x_loopVariable in lbDados.Items) { x = x_loopVariable; strTexto = (strTexto + x.ToString()) + Constants.vbLf; } dadosListBox = new StringReader(strTexto); if (printDialog1.ShowDialog() == DialogResult.OK) { this.printDocument1.Print(); } } |
Neste código percorremos o ListBox e obtemos os dados armazenando cada linha na variável strTexto; a seguir usando a classe StringReader, que Implementa um TextReader lido de uma cadeia de caracteres, armazenamos todas as informações do conteúdo do ListBox na variável dadosListBox.
A classe StringReader permite ler de forma síncrona ou assíncrona uma cadeia de caracteres. Você pode ler um caractere em vez com Read ou o método de ReadAsync , uma linha por vez usando ReadLine ou o método de ReadLineAsync e em uma cadeia de caracteres inteira usando ReadToEnd ou o método de ReadToEndAsync .
Após isso apresentamos a caixa de diálogo para impressão e se o usuário confirmar chamamos o método Print do objeto PrintDocument1.
Agora tudo que precisamos é definir o código no evento PrintPage conforme a seguir:
Private Sub PrintDocument1_PrintPage(sender As Object, e As PrintPageEventArgs) Handles PrintDocument1.PrintPage 'define objetos usados na impressão Dim LinhasPorPagina As Single = 0 Dim yPosicao As Single = 0 Dim contador As Integer = 0 Dim MargemEsquerda As Single = e.MarginBounds.Left Dim MargemTopo As Single = e.MarginBounds.Top Dim linha As String = Nothing Dim FonteImpressao As Font = lbDados.Font ' Calcula o numero de linhas por pagina LinhasPorPagina = e.MarginBounds.Height / FonteImpressao.GetHeight(e.Graphics) ' Itera sobre o arquivo imprimindo cada linha While contador < LinhasPorPagina linha = dadosListBox.ReadLine() If linha Is Nothing Then Exit While End If yPosicao = MargemTopo + contador * FonteImpressao.GetHeight(e.Graphics) e.Graphics.DrawString(linha, FonteImpressao, Brushes.Black, MargemEsquerda, yPosicao, New StringFormat()) contador += 1 End While ' Se existir mais linhas então imprime na outra pagina If (linha IsNot Nothing) Then e.HasMorePages = True Else e.HasMorePages = False End If End Sub |
Private void PrintDocument1_PrintPage(object sender, PrintPageEventArgs e) { //define objetos usados na impressão float LinhasPorPagina = 0; float yPosicao = 0; int contador = 0; float MargemEsquerda = e.MarginBounds.Left; float MargemTopo = e.MarginBounds.Top; string linha = null; Font FonteImpressao = lbDados.Font; // Calcula o numero de linhas por pagina LinhasPorPagina = e.MarginBounds.Height / FonteImpressao.GetHeight(e.Graphics); // Itera sobre o arquivo imprimindo cada linha while (contador < LinhasPorPagina) { linha = dadosListBox.ReadLine(); if (linha == null) { break; } yPosicao = MargemTopo + contador * FonteImpressao.GetHeight(e.Graphics); e.Graphics.DrawString(linha, FonteImpressao, Brushes.Black, MargemEsquerda, yPosicao, new StringFormat()); contador += 1; } // Se existir mais linhas então imprime na outra pagina if ((linha != null)) { e.HasMorePages = true; } else { e.HasMorePages = false; } } |
Neste código definimos os objetos usados na impressão, definimos o número de linha por página e fazemos a iteração na variável dadosListBox, enquanto o contador for menor que o número de linhas por página, onde lemos e imprimimos cada linha.
Ao final verificamos se ainda existem dados a serem impressos e em caso afirmativo o processo se repete até ao final da impressão.
Executando o projeto novamente temos o seguinte resultado para uma impressão para um arquivo PDF:
![]() |
Dessa forma fizemos uma abordagem bem simples usando os recursos dos objetos PrintDocument e PrintDialog para imprimir o conteúdo do controle ListBox.
Pegue o projeto completo aqui :
Imprimindo_ListBox.zip
(Disse Jesus) - Em verdade, em verdade vos digo que vem a hora, e agora é, em
que os mortos ouvirão a voz do Filho de Deus, e os que a ouvirem viverão.
João 5:25
Veja os
Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique
e confira !
Quer migrar para o VB .NET ?
Quer aprender C# ??
Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? |
Gostou ?
Compartilhe no Facebook
Compartilhe no Twitter
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Super DVD C# - Recursos de aprendizagens e vídeo aulas para C#
Curso Fundamentos da Programação
Orientada a Objetos com VB .NET