График из данных JSON файла C# WindowsForm

Рейтинг: 0Ответов: 2Опубликовано: 13.06.2023

Пишу программу конвертер валют , беру данные из 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)
        {
            ...
        }

Ответы

▲ 0Принят

Нашел такой выход из ситуации:

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);
            }
        }
▲ 0

Можете попробовать использовать данный код. Дайте знать если он вам помог:


   ...
            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)
            {
               ...
            }
        }
    ```