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