График из данных JSON файла C# WindowsForm
Пишу программу конвертер валют , беру данные из JSON файла , сам процесс конвертирования работает , но пытаюсь создать график, чтобы он обновлялся при смене валюты в combobox1 или смене даты в dateTimePicker1, и выводил курс валют по Y и 7(может больше) дней (последняя дата это дата из dateTimePicker1) по Х. Поправьте пожалуйста код, заранее спасибо ! Вот код:
...
private async Task<string> DownloadJsonData(string url)
{
using (HttpClient client = new HttpClient())
{
HttpResponseMessage response = await client.GetAsync(url);
if (response.IsSuccessStatusCode)
{
return await response.Content.ReadAsStringAsync();
}
else
{
return string.Empty;
}
}
}
public async void GetData()
{
comboBox1.Items.Clear();
DateTime selectedDate = dateTimePicker1.Value;
string url = "https://";
string jsonData = await DownloadJsonData(url);
m = JsonConvert.DeserializeObject<List<Currencies>>(jsonData);
foreach (Currencies currency in m.OrderBy(c => c.txt))
{
comboBox1.Items.Add(currency.txt);
}
comboBox1.SelectedIndex = 12;
}
public void ShowChart()
{
this.chart1.Series[0].Points.Clear();
DateTime selectedDate = dateTimePicker1.Value;
DateTime startDate = selectedDate.AddDays(-7);
while (startDate < selectedDate)
{
GetData();
string selectedCurrency = comboBox1.SelectedItem.ToString();//здесь ошибка Ссылка на объект не указывает на экземпляр объекта.
Currencies selectedCurrencyObject = m.FirstOrDefault(c => c.txt == selectedCurrency);
DateTime exchangeDate = DateTime.ParseExact(selectedCurrencyObject.exchangedate, "dd.MM.yyyy", null);
double exchangeRate = selectedCurrencyObject.rate;
this.chart1.Series[0].Points.AddXY(exchangeDate, exchangeRate);
exchangeDate = exchangeDate.AddDays(1);
startDate = startDate.AddDays(1);
}
}
private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{
ShowChart();
}
private void Form1_Load(object sender, EventArgs e)
{
ShowChart();
}
private void button2_Click(object sender, EventArgs e)
{
...
}
private void button3_Click(object sender, EventArgs e)
{
...
}
Ответы (2 шт):
Автор решения: Александр Окостень
→ Ссылка
Можете попробовать использовать данный код. Дайте знать если он вам помог:
...
private async Task<string> DownloadJsonData(string url)
{
using (HttpClient client = new HttpClient())
{
HttpResponseMessage response = await client.GetAsync(url);
if (response.IsSuccessStatusCode)
{
return await response.Content.ReadAsStringAsync();
}
else
{
return string.Empty;
}
}
}
public async Task GetData()
{
comboBox1.Items.Clear();
DateTime selectedDate = dateTimePicker1.Value;
string url = "https://";
string jsonData = await DownloadJsonData(url);
m = JsonConvert.DeserializeObject<List<Currencies>>(jsonData);
foreach (Currencies currency in m.OrderBy(c => c.txt))
{
comboBox1.Items.Add(currency.txt);
}
comboBox1.SelectedIndex = 0;
}
public async Task ShowChart()
{
this.chart1.Series[0].Points.Clear();
DateTime selectedDate = dateTimePicker1.Value;
DateTime startDate = selectedDate.AddDays(-7);
while (startDate <= selectedDate)
{
await GetData();
string selectedCurrency = comboBox1.SelectedItem?.ToString();
if (selectedCurrency != null)
{
Currencies selectedCurrencyObject = m.FirstOrDefault(c => c.txt == selectedCurrency);
DateTime exchangeDate = DateTime.ParseExact(selectedCurrencyObject.exchangedate, "dd.MM.yyyy", null);
double exchangeRate = selectedCurrencyObject.rate;
this.chart1.Series[0].Points.AddXY(exchangeDate, exchangeRate);
}
startDate = startDate.AddDays(1);
}
}
private async void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{
await ShowChart();
}
private async void Form1_Load(object sender, EventArgs e)
{
await ShowChart();
}
private async void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
await ShowChart();
}
private void button2_Click(object sender, EventArgs e)
{
...
}
private void button3_Click(object sender, EventArgs e)
{
...
}
}
```
Автор решения: 2One House
→ Ссылка
Нашел такой выход из ситуации:
public async Task GetChartData()
{
this.chart1.Series[0].Points.Clear();
string selectedCurrency = comboBox1.SelectedItem.ToString();
DateTime selectedDate = dateTimePicker1.Value;
DateTime startDate = selectedDate.AddMonths(-6);
List<Currencies> monthlyData = new List<Currencies>();
while (startDate <= selectedDate)
{
string url = "https://";
string jsonData = await DownloadJsonData(url);
List<Currencies> dailyData = JsonConvert.DeserializeObject<List<Currencies>>(jsonData);
foreach (Currencies currency in dailyData)
{
if (currency.txt == selectedCurrency)
{
monthlyData.Add(currency);
this.chart1.Series[0].Points.AddXY(currency.exchangedate, currency.rate);
}
}
startDate = startDate.AddMonths(1);
}
}