C # создать диаграмму из datagridview из базы данных

#c# #mysql #charts #column-chart

#c# #mysql #Диаграммы #диаграмма столбцов

Вопрос:

Я пытаюсь создать диаграмму столбцов из datagridview, которая загружает набор данных из базы данных. Является datagridview 2. Я написал в общедоступном классе void loaddata(). Что касается того, что диаграмма является концертом, я написал с помощью общедоступного класса void chart (). Я хочу отобразить:

 XvalueMember : ORDER_NUMBER
YvalueMember: TOTAL_TIME
  

Вот мой код:

GenerateCharts.cs

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using MySql.Data.MySqlClient;
using System.Configuration;
using System.Windows.Forms.DataVisualization.Charting;
using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;
using System.Text.RegularExpressions;

namespace ControlBase
{
    public partial class GenerateCharts : Form
    {
        public GenerateCharts()
        {
            InitializeComponent();
        }
        public void loaddata()
        {
            try
            {
                MySqlConnection connection = new MySqlConnection("datasource=localhost;port=3306;username=root;password=");
                MySqlDataAdapter adapter2 = new MySqlDataAdapter("SELECT w.FNAME, w.LNAME, z.ORDER_DESC AS 'ORDER DESCRIPTION', o.ORDER_NUMBER AS 'ORDER NUMBER', SEC_TO_TIME(SUM(TIME_TO_SEC(s.BEGIN_DATE) - TIME_TO_SEC(s.END_DATE))) AS 'TOTAL TIME OF ORDER' FROM projekt1.status_order s INNER JOIN projekt1.workers p ON s.ID_WORKER = w.ID_WORKER INNER JOIN projekt1.orders z ON s.ID_ORDER = o.ID_ORDER WHERE p.ID_WORKER ='"   int.Parse(textBox1.Text)  "' AND BEGIN_DATE >= '"   dateTimePicker1.Value.ToString("yyyy-MM-dd")   "' AND END_DATE <= '"   dateTimePicker2.Value.ToString("yyyy-MM-dd")   "' GROUP BY s.ID_ORDER;", connection);
                connection.Open();

                DataSet ds2 = new DataSet();
                adapter2.Fill(ds2, "status_order");
                dataGridView2.DataSource = ds2.Tables["status_order"];
                connection.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        public void chart()
        {

            MySqlConnection connection = new MySqlConnection();
            connection.ConnectionString = "datasource=localhost;port=3306;username=root;password=";
            connection.Open();

            MySqlCommand cmd = connection.CreateCommand();
            cmd.CommandText = "SELECT w.FNAME, w.LNAME, z.ORDER_DESC AS 'ORDER DESCRIPTION', o.ORDER_NUMBER AS 'ORDER NUMBER', SEC_TO_TIME(SUM(TIME_TO_SEC(s.BEGIN_DATE) - TIME_TO_SEC(s.END_DATE))) AS 'TOTAL_TIME' FROM projekt1.status_order s INNER JOIN projekt1.workers p ON s.ID_WORKER = w.ID_WORKER INNER JOIN projekt1.orders z ON s.ID_ORDER = o.ID_ORDER WHERE p.ID_WORKER ='"   int.Parse(textBox1.Text)  "' AND BEGIN_DATE >= '"   dateTimePicker1.Value.ToString("yyyy-MM-dd")   "' AND END_DATE <= '"   dateTimePicker2.Value.ToString("yyyy-MM-dd")   "' GROUP BY s.ID_ORDER;";

            MySqlDataReader reader;

            reader = cmd.ExecuteReader();
            while (reader.Read())
            {
                chart1.Series[0].Points.AddXY(reader.GetString("ORDER_NUMBER"), reader.GetDateTime("TOTAL_TIME"));
            }

        }
        private void button1_Click(object sender, EventArgs e)
        {
            chart1.Series.Clear();
            chart();
            loaddata();

        }
    }
}
  

После запуска этого приложения и попытки сгенерировать столбец у меня возникает ошибка:

 System.ArgumentOutOfRangeException: "The index was out of range. It must have a non-negative value and less than the size of the collection. Parameter name: index " 
  

Я также пытался получить данные из datagridview2, но это не сработало. Кто-нибудь может объяснить, как изменить этот код? Спасибо за любую помощь.

Ответ №1:

Вы вызываете chart1.Series.Clear(); , а затем в chart() методе пытаетесь выполнить индексацию в коллекцию: chart1.Series[0] . Вам нужно создать новую Series и добавить ее, прежде чем вы сможете ее проиндексировать.