Trabalhando com o MSChart no VB.NET
Colaboração de Alexandre Marques
Não sei quantos de você já tentaram trabalhar com o MsChart no VB.NET e provavelmente tiveram a dor de cabeça na hora de gerar o gráfico, principalmente se os dados forem provenientes de um banco de dados qualquer. Dei com a cara no teclado quando tive de fazer um trabalho em sala que gerasse o gráfico de notas de alguns alunos, todos fizeram o programa em VB6 mas eu continuei insistindo em fazer com VB.NET.
Más notícias: O objeto não suporta os tipos de dados provenientes do
BindingSource do .NET e eu acredito que também não deve suportar qualquer retorno de dados do
ADO.NET ou semelhantes.
A solução seria comprar um dos componentes para gráficos disponíveis na Internet, usar o Excel ou dar um jeito no MSchart via POG (Programação Orientada a Gambiarra).
Vejamos o programa:
Bom, temos aqui meu trabalho de sala :
- Na listbox teremos a lista de matérias e conforme mudamos a matéria, o número da matrícula do infeliz e a média dele na matéria é mostrado no Grid. (PS: Toda parte de dados do programa foi feita com os componentes visuais do VB.NET por extrema preguiça minha de fazer via código, fique a vontade pra fazer da forma que quiser).
Pegue o Código fonte + Banco de Dados em anexo e vamos discutir algumas coisas:
MschartVBNET.zip
A estrutura das tabelas usadas é a seguinte:
![]() |
ReDim Nota(Me.DBDataSet.Notas.Count - 1)
ReDim NumeroMatricula(Me.DBDataSet.Notas.Count - 1)
AxMSChart.ColumnCount = Me.DBDataSet.Notas.Count
AxMSChart.RowCount = 1
AxMSChart.RowLabel = "Alunos"
Basicamente Redimensionei os arrays conforme a quantidade de linhas que o Dataset retornava (caso você não lembre, no VB.NET os arrays começam em zero, este é o motivo do -1).
.ColumnCount - Tive de marcar previamente a quantidade de colunas que usaríamos, do contrario dava pau na legenda.
.RowCount e .RowLabel - Mesmo motivo.
For Each Row As DataRow In Me.DBDataSet.Notas
Nota(i) = Row(2)
NumeroMatricula(i) = Row(0)
i += 1
Next
Bom, basicamente estamos convertendo nosso DataRow para um array porque a porcaria do MSChart não suporta o DataRow do VB.NET. Um array contém o valor das notas e o outro o número da matrícula que será usado na legenda!
AxMSChart.ChartData = Nota
Indicamos que o gráfico devera ser plotado em cima do Array notas. Não consegui usar o DataSource do MSChart com meu BindingSource do .NET, muito provavelmente por incompatibilidade, então o workaround foi usar o ChartData como um array!
For i As Integer = 1 To AxMSChart.ColumnCount
AxMSChart.Column = i
AxMSChart.ColumnLabel = NumeroMatricula(i - 1)
Next
Bom, tivemos de fazer outro laço para preencher as legendas porque simplesmente o controle não aceitou quando tentei fazê-las no mesmo laço (pode ser mais um bug ou apenas ignorância minha).
Por enquanto é só, se você estava esquentando a cabeça com o VB.NET e o MSChart acho que isto pode ajudar um pouco.
Divirtam-se!
Alexandre Marques
Veja também os seguintes artigos relacionados:
www.macoratti.net