Обновить радарную диаграмму в WinForms

У меня есть следующий пользовательский интерфейс, в котором значения в радарной диаграмме рассчитываются по среднему арифметическому некоторых значений TrackBar. Объект Player принимает эти значения, вычисляет среднее значение и возвращает его обратно в серию данных Radar Chart.

Что я хочу сделать, так это когда я изменяю значение в TrackBar, Chart меняет свои значения в реальном времени. Когда я меняю значения, он пересчитывает среднее значение, а затем меняет форму диаграммы.

Обновить радарную диаграмму в WinForms

Вот мой код:

public AddPlayerForm()
    {
        InitializeComponent();
        Load += this.AddPlayerForm_Load;//reloads the chart component every continuously
        LoadComboBoxes();
        MetroFramework.Controls.MetroTrackBar[] trackBars = new MetroFramework.Controls.MetroTrackBar[20];
    }

    //loads the Chart Content
    private void AddPlayerForm_Load(object sender, EventArgs e)
    {
        /*I tried to clear the current chart to recalculate and redraw the chart in every cycle
        but its not working this way*/
        chart1.Series.Clear();//clear the current chart
        new_player.SetPlayerStats(  //get values from TrackBars
         mtTrackBarAttack.Value,
         mtTrackBarBallControl.Value,
         .
         .//all trackBar.Values
         .
         mtInjuryResistenceTB.Value,
         1,
         "Messi");

        //recalculate the arithimetic mean and returns as a tag to the chart
        //Ex: {"Agility",60.4}
        Dictionary<string, float> tags = new_player.MeanStats();//Player method that calculates the mean and returns a dictionary <String, float>
        //creates a new series of data
        chart1.Series.Add("s1");
        chart1.Series["s1"].ChartType = SeriesChartType.Radar;


        foreach (string tagname in tags.Keys)
        {
            //for each set of data, plots the name and its value in the Chart
            chart1.Series["s1"].Points.AddXY(tagname, tags[tagname]);

        }


    }

Я пытаюсь очистить старую диаграмму и перерисовать новую, но у меня это не получается.

Почему бы просто не очистить series.Points перед добавлением нового набора очков? Также: «Не работает» - бесполезное описание проблемы !!

TaW 16.12.2018 22:55

В chart1.Series.Clear(); я очищаю точки и в конце метода AddPlayerForm_Load добавляю новый набор точек. Под «не работает» я подразумеваю, что диаграмма не обновляется. Я остаюсь прежним, но ошибок не показываю.

Mateus Arruda 16.12.2018 23:05
chart1.Series.Clear (); На самом деле это не просто удаление точек, но удаление всех серий со всеми их настройками. Если никаких изменений не видно, скорее всего, ваши данные на самом деле не изменились (достаточно).
TaW 17.12.2018 00:01

Это сработало! @TaW, если вы хотите ответить, я отмечу его как лучший ответ, поскольку он помог мне решить проблему. Спасибо.

Mateus Arruda 17.12.2018 16:42

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

TaW 17.12.2018 16:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
5
446
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я никогда не работал с Winforms-Charttool, но вы уже пробовали просто вызвать обновление на chart1-Object? https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.datavisualization.charting.chart.refresh?view=netframework-4.7.2

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

TaW 17.12.2018 16:44

При использовании этого метода диаграмма начинала мигать даже после того, как я увеличил интервал Time Tick. Поэтому я предпочел использовать Series.Points.Clear (). Но это тоже было полезно, спасибо!

Mateus Arruda 17.12.2018 16:44
Ответ принят как подходящий

Мне удалось обновить график двумя способами. Во-первых, благодаря @TaW я использовал chart.Series.Points.Clear() для перерисовки данных. Затем, чтобы обновить его автоматически, мне пришлось использовать счетчик времени, чтобы обновлять график каждые 100 миллисекунд благодаря @Tim в Добавить таймер в приложение Windows Forms.

После успешного обновления диаграммы я попытался использовать функцию chart.Refresh(), упомянутую @ChrizzleWhizzle, но диаграмма иногда начинала мигать, поэтому я предпочел использовать первое решение, но оно также было полезно.

Спасибо всем за ответ. Если я узнаю лучший метод, я опубликую его.

Другие вопросы по теме