Почему гистограмма не обновляется по таймеру?
От: dims12 http://www.relativity.ru
Дата: 18.09.10 22:04
Оценка:
Что-то у меня заскок какой-то! Создал простейшую форму, на неё поместил гистограмму и кнопку. По нажатию кнопки гистограмма заполняется сперва нулевыми точками, затем в эти точки выставляются значния.

Это отображается на гистограмме.

Последним действием кнопка запускает таймер, который раз в секунду перезаполняет гистограмму данными, случайными. Делает это он точно так же, как и кнопка, когда всыставляла значения.

Однако это, почему-то, на гистограмме не отображается.

Какой-бы таймер я не использовал, что бы ни делал -- гистограмма не обновляется. Хоть ты тресни.

Если нажать кнопку ещё раз (что приведёт к добавлению в гистограмму ещё нулевых точек), то гистограмма видоизменяется, сообразно и только тогда проявляются ранее туда попавшие случайные данные.

Такое впечатление, что гистограмму надо каким-то образом перерисовывать после обновления данных, либо, каким-то образом, провоцировать эту перерисовку.

Но, во-первых, каким именно образом это можно сделать (Update и Invalidate не помогли)?

А, во-вторых, я же этого никогда не делаю, почему же тогда гистограмма обновляется после нажатия кнопки?

Ниже код


private System.Windows.Forms.DataVisualization.Charting.Chart Stats_chr;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Timer timer1;

...

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace LetterStatistics
{
    public partial class Test : Form
    {
        private System.Threading.Timer tmr = null;
        Random rnd = new Random();
        int[] poses = new int[64];

        public Test()
        {
            InitializeComponent();

            Stats_chr.Series[0].Points.Clear();
        }

        private void UpdateHistogram()
        {

            //for (int i = 0; i < poses.Length; ++i)
            for (int i = 0; i < Stats_chr.Series[0].Points.Count; ++i)
            {
                Stats_chr.Series[0].Points[i].YValues[0] = rnd.Next(10000);
            }
            //Stats_chr.Update();
            //Application.DoEvents();

            

        }

        private void button1_Click(object sender, EventArgs e)
        {
            

            System.Windows.Forms.DataVisualization.Charting.DataPoint dp;
            for (int i = 0; i < poses.Length; ++i)
            {
                dp = new System.Windows.Forms.DataVisualization.Charting.DataPoint();
                dp.SetValueY(0);

                Stats_chr.Series[0].Points.Add(dp);
            }

            for (int i = 0; i < poses.Length; ++i)
            {
                Stats_chr.Series[0].Points[i].YValues[0] = i;
            }

            //tmr = new System.Threading.Timer(TimerCallback, this, 0, 1000);
            timer1.Start();
        }

        private void TimerCallback(object state)
        {
            //BeginInvoke(new Action(UpdateHistogram));
            Invoke(new Action(UpdateHistogram));
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            UpdateHistogram();
        }
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.