• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

nokPT

Chart1.ChartAreas.Count retorna sempre 1 (UM)

1 mensagem neste tópico

Estou a fazer um pequeno gráfico histórico, a certa altura, como tenho valores muito diversos (tempo, unidades, %) achei que devia dividir o gráfico em 2 ChartAreas, para dar mais valor ao projecto, dou ao operador a possibilidade de escolher que séries quer ver e caso tenha uma ChartArea sem série não a apresento.

Como é um gráfico histórico, tenho que o actualizar periodicamente, então faço:

            Do While Chart1.Series.Count > 0
                Chart1.Series.RemoveAt(0)
            Loop
            Do While Chart1.ChartAreas.Count > 0
                Chart1.ChartAreas.RemoveAt(0)
            Loop
            Do While Chart1.Legends.Count > 0
                Chart1.Legends.RemoveAt(0)
            Loop

e no fim crio o gráfico de novo.

PROBLEMA:

Independentemente do nº de chartareas, Chart1.ChartAreas.Count retorna sempre 1, ou seja se só estiver a ver 1 chartarea elimino-a para depois a criar, se tiver a ver 2 só elimino 1 ou seja a seguir dá erro ao tentar criar um chartarea que já existe.

Já não sei o que fazer.

O código que tenho para construir o gráfico e as chartareas é o seguinte:

            ' Add Chart Area to the Chart
            If chkAlarmeActivo.Checked Or chkTempoFuncionamento.Checked Or chkTempoLigado.Checked Then Chart1.ChartAreas.Add(chartAreaTempos)
            If chkConcentração.Checked Or chkEmissão.Checked Or chkSetpointEmissão.Checked Then Chart1.ChartAreas.Add(chartAreaValores)

            ' Create a data series
            Dim TempoLigado As New Series()
            Dim TempoFuncionamento As New Series()
            Dim AlarmeActivo As New Series
            Dim Emissão As New Series()
            Dim Concentração As New Series()
            Dim SetpointEmissão As New Series

            ' Add data points to the series
            Dim Ponto As Integer
            Dim Dia As System.DateTime = Now
            Ponto = txbNúmeroPontos.Text
            Do While Ponto >= 0
                Dia = Now.AddMinutes(-1 * (Int(txbNúmeroPontos.Text) - Ponto))
                TempoLigado.Points.AddXY(Dia.ToOADate, frmMain.DadosMinuto(Dia.Month, Dia.Day, Dia.Hour, Dia.Minute).Ligado)
                TempoFuncionamento.Points.AddXY(Dia.ToOADate, frmMain.DadosMinuto(Dia.Month, Dia.Day, Dia.Hour, Dia.Minute).Funcionamento * 0.8)
                AlarmeActivo.Points.AddXY(Dia.ToOADate, frmMain.DadosMinuto(Dia.Month, Dia.Day, Dia.Hour, Dia.Minute).AlarmeActivo * 0.6)
                Emissão.Points.AddXY(Dia.ToOADate, frmMain.DadosMinuto(Dia.Month, Dia.Day, Dia.Hour, Dia.Minute).Emissão)
                Concentração.Points.AddXY(Dia.ToOADate, frmMain.DadosMinuto(Dia.Month, Dia.Day, Dia.Hour, Dia.Minute).Concentração)
                SetpointEmissão.Points.AddXY(Dia.ToOADate, frmMain.Setpoint.Emissão)
                Ponto -= 1
            Loop

            ' Add series to the chart
            If chkEmissão.Checked Then Chart1.Series.Add(Emissão)
            If chkConcentração.Checked Then Chart1.Series.Add(Concentração)
            If chkSetpointEmissão.Checked Then Chart1.Series.Add(SetpointEmissão)

            If chkTempoLigado.Checked Then Chart1.Series.Add(TempoLigado)
            If chkTempoFuncionamento.Checked Then Chart1.Series.Add(TempoFuncionamento)
            If chkAlarmeActivo.Checked Then Chart1.Series.Add(AlarmeActivo)

            ' Set chart control location
            Chart1.Location = New System.Drawing.Point(16, 16)

            ' Set Chart control size
            Chart1.Size = New System.Drawing.Size(Me.GroupBox1.Width - 32, Me.GroupBox1.Height - 32)

            ' Set series chart type
            Emissão.ChartArea = chartAreaValores.Name
            Concentração.ChartArea = chartAreaValores.Name
            SetpointEmissão.ChartArea = chartAreaValores.Name

            TempoLigado.ChartArea = chartAreaTempos.Name
            TempoFuncionamento.ChartArea = chartAreaTempos.Name
            AlarmeActivo.ChartArea = chartAreaTempos.Name

            ' Set primary x-axis properties
            Emissão.XValueType = ChartValueType.DateTime
            Concentração.XValueType = ChartValueType.DateTime
            Concentração.YAxisType = AxisType.Secondary
            SetpointEmissão.XValueType = ChartValueType.DateTime
            TempoFuncionamento.XValueType = ChartValueType.DateTime
            TempoLigado.XValueType = ChartValueType.DateTime
            AlarmeActivo.XValueType = ChartValueType.DateTime

            chartAreaValores.AxisX.IsMarginVisible = True
            chartAreaValores.AxisX.LabelStyle.IsEndLabelVisible = True
            chartAreaValores.AxisX.Maximum = Emissão.Points(0).XValue()
            chartAreaValores.AxisX.Minimum = Emissão.Points(Int(txbNúmeroPontos.Text) - 1).XValue()
            chartAreaValores.AxisX.LabelStyle.Format = "dd-MM-yyyy HH:mm"
            chartAreaValores.AxisX.LabelStyle.Enabled = True

            If (chkAlarmeActivo.Checked Or chkTempoFuncionamento.Checked Or chkTempoLigado.Checked) And (chkEmissão.Checked Or chkSetpointEmissão.Checked Or chkConcentração.Checked) Then
                chartAreaValores.AlignmentOrientation = AreaAlignmentOrientations.Vertical
                chartAreaTempos.AlignmentOrientation = chartAreaValores.AlignmentOrientation
                chartAreaTempos.AlignWithChartArea = chartAreaValores.Name
                chartAreaTempos.AlignmentStyle = AreaAlignmentStyles.All
                chartAreaTempos = chartAreaValores
                chartAreaTempos.AxisX.LabelStyle.Enabled = False
            End If

            ' Add chart control to the form
            Me.GroupBox1.Controls.AddRange(New System.Windows.Forms.Control() {Me.Chart1})

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora