У меня есть следующий пользовательский интерфейс, в котором значения в радарной диаграмме рассчитываются по среднему арифметическому некоторых значений TrackBar. Объект Player принимает эти значения, вычисляет среднее значение и возвращает его обратно в серию данных Radar Chart.
Что я хочу сделать, так это когда я изменяю значение в TrackBar, Chart меняет свои значения в реальном времени. Когда я меняю значения, он пересчитывает среднее значение, а затем меняет форму диаграммы.
Вот мой код:
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]);
}
}
Я пытаюсь очистить старую диаграмму и перерисовать новую, но у меня это не получается.
В chart1.Series.Clear(); я очищаю точки и в конце метода AddPlayerForm_Load добавляю новый набор точек. Под «не работает» я подразумеваю, что диаграмма не обновляется. Я остаюсь прежним, но ошибок не показываю.
Это сработало! @TaW, если вы хотите ответить, я отмечу его как лучший ответ, поскольку он помог мне решить проблему. Спасибо.
Я действительно не могу, потому что все, что я сделал, это указал вам на несколько неэффективный метод. Настоящая ошибка должна быть где-то еще, вероятно, в неправильной настройке данных во второй раз. - В нынешнем виде я сомневаюсь, что этот пост будет полезен в будущем.





Я никогда не работал с Winforms-Charttool, но вы уже пробовали просто вызвать обновление на chart1-Object? https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.datavisualization.charting.chart.refresh?view=netframework-4.7.2
Вы в основном никогда не нужно вызывать обновление на графике, чтобы показать измененные значения.
При использовании этого метода диаграмма начинала мигать даже после того, как я увеличил интервал Time Tick. Поэтому я предпочел использовать Series.Points.Clear (). Но это тоже было полезно, спасибо!
Мне удалось обновить график двумя способами. Во-первых, благодаря @TaW я использовал chart.Series.Points.Clear() для перерисовки данных. Затем, чтобы обновить его автоматически, мне пришлось использовать счетчик времени, чтобы обновлять график каждые 100 миллисекунд благодаря @Tim в
Добавить таймер в приложение Windows Forms.
После успешного обновления диаграммы я попытался использовать функцию chart.Refresh(), упомянутую @ChrizzleWhizzle, но диаграмма иногда начинала мигать, поэтому я предпочел использовать первое решение, но оно также было полезно.
Спасибо всем за ответ. Если я узнаю лучший метод, я опубликую его.
Почему бы просто не очистить series.Points перед добавлением нового набора очков? Также: «Не работает» - бесполезное описание проблемы !!