none
cargar datos a un chartcontrol RRS feed

  • Pregunta

  • Hola a todos tengo la siguiente problematica guardo los valores de las series  de un chart en una base de datos el campo donde los guardo es de tipo vchar. Lo que pasa es que despues tengo k volver a cargar en un chart los datos que guarde en la base de dato pero cuando los carho tiene el siguiente formato la cadena string lista = {X=0, Y=0,0024175824},{X=0, Y=0,0024175824},{X=0, Y=0,0024175824} etc......

    como podria hacer para cargar esos mismos datos en un chart ??

    jueves, 7 de diciembre de 2017 14:24

Respuestas

  • using System;
    using System.Text.RegularExpressions;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication2
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                string datos = "{X=0, Y=0,0024175824},{X=0, Y=0,0024175824},{X=0, Y=0,0024175824}";
                MatchCollection mc = Regex.Matches(datos, @"(?:{)([^}]+)");
                foreach (Match item in mc)
                {
                    // fijate el bug en el ToString del DataPoint.
                    // No usa el separador de listas del locale, y acaba siendo el mismo que el separador decimal.
                    // La coma
                    string[] s = item.Groups[1].Value.Split(new string[] { ", " }, StringSplitOptions.None);
                    chart1.Series[0].Points.AddXY(double.Parse(s[0].Substring(2)), double.Parse(s[1].Substring(2)));
                }
            }
        }
    }
    

    • Marcado como respuesta jlpavon1987 viernes, 8 de diciembre de 2017 14:15
    viernes, 8 de diciembre de 2017 12:41
  • En el ejemplo, se pone a cada datapoint un tooltip con el valor de X.

    Si haces clic en dos pundos de la serie te muestra la diferencia.

    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Text.RegularExpressions;
    using System.Windows.Forms;
    using System.Windows.Forms.DataVisualization.Charting;
    
    namespace WindowsFormsApplication2
    {
        public partial class Form1 : Form
        {
    
            Queue<DataPoint> dp;
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                string datos = "{X=0, Y=3,2},{X=1, Y=6,9},{X=5, Y=5}";
                MatchCollection mc = Regex.Matches(datos, @"(?:{)([^}]+)");
                foreach (Match item in mc)
                {
                    string[] s = item.Groups[1].Value.Split(new string[] { ", " }, StringSplitOptions.None);
                    DataPoint dato = new DataPoint(double.Parse(s[0].Substring(2)), double.Parse(s[1].Substring(2)));
                    dato.ToolTip = "#VALX";
                    chart1.Series[0].Points.Add(dato);
                }
                
                dp = new Queue<DataPoint>();
                chart1.Series[0].MarkerStyle = MarkerStyle.Square;
                chart1.Series[0].MarkerSize = 10;
                chart1.Series[0].ChartType = SeriesChartType.Spline;
            }
    
            private void chart1_Click(object sender, EventArgs e)
            {
                Point p = chart1.PointToClient(MousePosition);
                HitTestResult ht = chart1.HitTest(p.X, p.Y, ChartElementType.DataPoint);
    
                if (ht.ChartElementType == ChartElementType.DataPoint)
                {
                    if (dp.Count == 1)
                    {
                        DataPoint p1 = dp.Dequeue();
                        DataPoint p2 = (DataPoint)ht.Object;
                        MessageBox.Show((p2.XValue - p1.XValue).ToString(), "X Diferencia");
                        //MessageBox.Show((p2.YValues[0] - p1.YValues[0]).ToString());
                    }
                    else
                    {
                        dp.Enqueue((DataPoint)ht.Object);
                    }
                }
            }
    
        }
    }
    

    • Marcado como respuesta jlpavon1987 viernes, 8 de diciembre de 2017 19:35
    viernes, 8 de diciembre de 2017 19:18

Todas las respuestas

  • Hola jlpavon1987

    Con base a tu consulta, te voy a compartir el siguiente enlace, en donde viene como cargar datos en un datagridview, que espero te sea de útil. Anexo ejemplo de código.

    https://docs.microsoft.com/es-es/dotnet/framework/data/adonet/loading-data-into-a-dataset

    try
    {
        // Create a new adapter and give it a query to fetch sales order, contact,
        // address, and product information for sales in the year 2002. Point connection
        // information to the configuration setting "AdventureWorks".
        string connectionString = "Data Source=localhost;Initial Catalog=AdventureWorks;"
            + "Integrated Security=true;";


        SqlDataAdapter da = new SqlDataAdapter(
            "SELECT SalesOrderID, ContactID, OrderDate, OnlineOrderFlag, " +
            "TotalDue, SalesOrderNumber, Status, ShipToAddressID, BillToAddressID " +
            "FROM Sales.SalesOrderHeader " +
            "WHERE DATEPART(YEAR, OrderDate) = @year; " +

            "SELECT d.SalesOrderID, d.SalesOrderDetailID, d.OrderQty, " +
            "d.ProductID, d.UnitPrice " +
            "FROM Sales.SalesOrderDetail d " +
            "INNER JOIN Sales.SalesOrderHeader h " +
            "ON d.SalesOrderID = h.SalesOrderID  " +
            "WHERE DATEPART(YEAR, OrderDate) = @year; " +

            "SELECT p.ProductID, p.Name, p.ProductNumber, p.MakeFlag, " +
            "p.Color, p.ListPrice, p.Size, p.Class, p.Style, p.Weight  " +
            "FROM Production.Product p; " +

            "SELECT DISTINCT a.AddressID, a.AddressLine1, a.AddressLine2, " +
            "a.City, a.StateProvinceID, a.PostalCode " +
            "FROM Person.Address a " +
            "INNER JOIN Sales.SalesOrderHeader h " +
            "ON  a.AddressID = h.ShipToAddressID OR a.AddressID = h.BillToAddressID " +
            "WHERE DATEPART(YEAR, OrderDate) = @year; " +

            "SELECT DISTINCT c.ContactID, c.Title, c.FirstName, " +
            "c.LastName, c.EmailAddress, c.Phone " +
            "FROM Person.Contact c " +
            "INNER JOIN Sales.SalesOrderHeader h " +
            "ON c.ContactID = h.ContactID " +
            "WHERE DATEPART(YEAR, OrderDate) = @year;",
        connectionString);

        // Add table mappings.
        da.SelectCommand.Parameters.AddWithValue("@year", 2002);
        da.TableMappings.Add("Table", "SalesOrderHeader");
        da.TableMappings.Add("Table1", "SalesOrderDetail");
        da.TableMappings.Add("Table2", "Product");
        da.TableMappings.Add("Table3", "Address");
        da.TableMappings.Add("Table4", "Contact");

        // Fill the DataSet.
        da.Fill(ds);

        // Add data relations.
        DataTable orderHeader = ds.Tables["SalesOrderHeader"];
        DataTable orderDetail = ds.Tables["SalesOrderDetail"];
        DataRelation order = new DataRelation("SalesOrderHeaderDetail",
                                 orderHeader.Columns["SalesOrderID"],
                                 orderDetail.Columns["SalesOrderID"], true);
        ds.Relations.Add(order);

        DataTable contact = ds.Tables["Contact"];
        DataTable orderHeader2 = ds.Tables["SalesOrderHeader"];
        DataRelation orderContact = new DataRelation("SalesOrderContact",
                                        contact.Columns["ContactID"],
                                        orderHeader2.Columns["ContactID"], true);
        ds.Relations.Add(orderContact);
    }
    catch (SqlException ex)
    {
        Console.WriteLine("SQL exception occurred: " + ex.Message);
    }

    Quedamos al pendiente de cualquier actualización de tu parte. 

    Gracias por usar los foros de MSDN.

    Pablo Rubio
     _____

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.


    jueves, 7 de diciembre de 2017 17:18
    Moderador
  • me parece que no me explike bien no hablo de cargar los datos en un datagridview sino en un chart controHaber el problema es que la manera que se me ocurrio de guardar los puntos en base de datos fue como string y ahora no se como hacer el proceso inverso es decir asignarle la cadena de puntos al chart control para graficarlos me entiendes ??

    jueves, 7 de diciembre de 2017 20:02
  • using System;
    using System.Text.RegularExpressions;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication2
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                string datos = "{X=0, Y=0,0024175824},{X=0, Y=0,0024175824},{X=0, Y=0,0024175824}";
                MatchCollection mc = Regex.Matches(datos, @"(?:{)([^}]+)");
                foreach (Match item in mc)
                {
                    // fijate el bug en el ToString del DataPoint.
                    // No usa el separador de listas del locale, y acaba siendo el mismo que el separador decimal.
                    // La coma
                    string[] s = item.Groups[1].Value.Split(new string[] { ", " }, StringSplitOptions.None);
                    chart1.Series[0].Points.AddXY(double.Parse(s[0].Substring(2)), double.Parse(s[1].Substring(2)));
                }
            }
        }
    }
    

    • Marcado como respuesta jlpavon1987 viernes, 8 de diciembre de 2017 14:15
    viernes, 8 de diciembre de 2017 12:41
  • muchas gracias voy a probar y te comento
    viernes, 8 de diciembre de 2017 14:14
  • muchas gracias me funcionó perfecto
    viernes, 8 de diciembre de 2017 15:29
  • Hola sabrias como hacer para cuando paso el mouse por arriba de la serie me valla diciendo las coordenadas y poder marcar un punto inical y despues uno final y sacar la diferencia en cuanto a la variable X ??
    viernes, 8 de diciembre de 2017 15:56
  • En el ejemplo, se pone a cada datapoint un tooltip con el valor de X.

    Si haces clic en dos pundos de la serie te muestra la diferencia.

    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Text.RegularExpressions;
    using System.Windows.Forms;
    using System.Windows.Forms.DataVisualization.Charting;
    
    namespace WindowsFormsApplication2
    {
        public partial class Form1 : Form
        {
    
            Queue<DataPoint> dp;
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                string datos = "{X=0, Y=3,2},{X=1, Y=6,9},{X=5, Y=5}";
                MatchCollection mc = Regex.Matches(datos, @"(?:{)([^}]+)");
                foreach (Match item in mc)
                {
                    string[] s = item.Groups[1].Value.Split(new string[] { ", " }, StringSplitOptions.None);
                    DataPoint dato = new DataPoint(double.Parse(s[0].Substring(2)), double.Parse(s[1].Substring(2)));
                    dato.ToolTip = "#VALX";
                    chart1.Series[0].Points.Add(dato);
                }
                
                dp = new Queue<DataPoint>();
                chart1.Series[0].MarkerStyle = MarkerStyle.Square;
                chart1.Series[0].MarkerSize = 10;
                chart1.Series[0].ChartType = SeriesChartType.Spline;
            }
    
            private void chart1_Click(object sender, EventArgs e)
            {
                Point p = chart1.PointToClient(MousePosition);
                HitTestResult ht = chart1.HitTest(p.X, p.Y, ChartElementType.DataPoint);
    
                if (ht.ChartElementType == ChartElementType.DataPoint)
                {
                    if (dp.Count == 1)
                    {
                        DataPoint p1 = dp.Dequeue();
                        DataPoint p2 = (DataPoint)ht.Object;
                        MessageBox.Show((p2.XValue - p1.XValue).ToString(), "X Diferencia");
                        //MessageBox.Show((p2.YValues[0] - p1.YValues[0]).ToString());
                    }
                    else
                    {
                        dp.Enqueue((DataPoint)ht.Object);
                    }
                }
            }
    
        }
    }
    

    • Marcado como respuesta jlpavon1987 viernes, 8 de diciembre de 2017 19:35
    viernes, 8 de diciembre de 2017 19:18
  • muchas gracias tas escapao en esto de los chart control jaja
    viernes, 8 de diciembre de 2017 19:36