C# создание диаграммы из datagridview из базы данных
Я пытаюсь создать столбчатую диаграмму из datagridview, которая загружает набор данных из базы данных. Это datagridview 2. Я написал в публичном классе void loaddata(). Как за уникальный концерт, который я писал по графикам() общественная недействительным класс. Я хочу, чтобы отобразить:
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(); } } }
Что я уже пробовал:
Я пробовал писать в публичной таблице классов():
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")); } }
Но после запуска этого приложения и попытки сгенерировать столбец у меня возникла ошибка:
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, но это не сработало. Может ли кто-нибудь объяснить, как изменить этот код? Спасибо за любую помощь.