Динамически добавлять диаграмму в Windows форм - отображается пустым - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь динамически добавить элемент управления Chart в форму (используя C#, все должно быть. NET 4.0), но он всегда пуст (отображается только цвет фона). Я попробовал тот же код в форме, в которой уже есть элемент управления, и он работает, поэтому я представляю, что мне нужно вызвать какую-то функцию инициализации (я попытался Invalidate() для элемента управления и Refresh() как для элемента управления, так и для панели, в которой он находится , без разницы). Я просмотрел несколько похожих постов, которые нашел, попытался добавить любые другие команды, которые они использовали (BeginInit() из одного такого поста), но пока не повезло. Любые идеи?

Кстати, я хочу отобразить 6-9 графиков (положение, скорость и ускорение в трехмерном пространстве), поэтому я бы предпочел добавить их динамически, чем иметь 9 наборов назначений. Вот код, который добавляет диаграммы на панель:

foreach (KeyValuePair<string, List<double>> p in b.storedValues)
{
    Control c = getChartForData(p);
    panel1.Controls.Add(c);
    c.Invalidate();
    c.Refresh();
    break;
}

И функция, которая создает каждый график:

private Chart getChartForData(KeyValuePair<string, List<double>> data)
        {
            Chart c = new Chart();
            ((System.ComponentModel.ISupportInitialize)c).BeginInit();
            c.Series.Clear();
            c.BackColor = Color.White;
            c.Height = 300;
            c.Width = 500;
            c.Palette = ChartColorPalette.Bright;
            Series s = new Series(data.Key);
            s.ChartType = SeriesChartType.Spline;
            double maxValue = 0;
            //NOTE: Going logarithmic on this, too big numbers
            for (int i = 0; i < data.Value.Count; i++)
            {
                maxValue = Math.Max(Math.Log10(data.Value[i]), maxValue);
            }
            for (int i = 0; i < data.Value.Count; i++)
            {
                s.Points.AddXY(i,Math.Log10(data.Value[i]) * c.Height / maxValue);
            }
            c.Series.Add(s);
            return c;
        }

Большое спасибо заранее.

1 Ответ

1 голос
/ 07 апреля 2020

Когда вы создаете Chart самостоятельно, в коде он не содержит ChartArea. Поэтому ничего не отображается.

Я предполагаю, что дизайнер генерирует некоторый код для инициализации области диаграммы по умолчанию при перетаскивании элемента управления диаграммы на форму.

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

Я бы go максимально просто получил что-то работающее, а затем Вы можете настроить диапазон оси впоследствии. Вы также можете установить ось логарифмическая c.

Начните с опробования этой минимальной версии и убедитесь, что она отображает что-то, прежде чем усложнять ситуацию. Это работает для меня.

private Chart getChartForData(string key, List<double> data)
{
    Chart c = new Chart();      

    Series s = new Series(key);
    s.ChartType = SeriesChartType.Spline;

    for (int i = 0; i < data.Count; i++)
    {       
        s.Points.AddXY(i, data[i]);
    }       
    c.Series.Add(s);

    var area = c.ChartAreas.Add(c.ChartAreas.NextUniqueName()); 
    s.ChartArea = area.Name;
    // Here you can tweak the axis of the chart area - min and max value,
    // where they display "ticks", and so on.
    return c;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...