Что-то у меня заскок какой-то! Создал простейшую форму, на неё поместил гистограмму и кнопку. По нажатию кнопки гистограмма заполняется сперва нулевыми точками, затем в эти точки выставляются значния.
Это отображается на гистограмме.
Последним действием кнопка запускает таймер, который раз в секунду перезаполняет гистограмму данными, случайными. Делает это он точно так же, как и кнопка, когда всыставляла значения.
Однако это, почему-то, на гистограмме не отображается.
Какой-бы таймер я не использовал, что бы ни делал -- гистограмма не обновляется. Хоть ты тресни.
Если нажать кнопку ещё раз (что приведёт к добавлению в гистограмму ещё нулевых точек), то гистограмма видоизменяется, сообразно и только тогда проявляются ранее туда попавшие случайные данные.
Такое впечатление, что гистограмму надо каким-то образом перерисовывать после обновления данных, либо, каким-то образом, провоцировать эту перерисовку.
Но, во-первых, каким именно образом это можно сделать (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();
}
}
}