2016-06-10 3 views
1

Ich habe eine Liste erstellt von einer Linq-Abfrage, die 2 Datenspalten enthält.Ist es möglich, eine Diagrammdatenquelle aus einer generischen Liste zu setzen?

var result = root.Descendants().Elements("sensor") 
       .Where(el => (string)el.Attribute("name") == "Sensor1") 
       .Elements("evt") 
       .Select(el => new { t1 = el.Attribute("time").Value, 
            v1 = el.Attribute("val").Value }) 
       .ToList() 

Ich versuche, die Chart-Steuerelement Datenquelle zu verwenden, um diese Liste zu verwenden, aber wenn ich die bind-Methode aufrufen, erhalte ich diese Fehlermeldung:

System.ArgumentException was unhandled HResult=-2147024809
Message=Series data points do not support values of type <>f__AnonymousType0`2[System.Double,System.Decimal] only values of these types can be used: Double, Decimal, Single, int, long, uint, ulong, String, DateTime, short, ushort.

//result is a generic list defined as var result = root.Descendants() 
chart1.DataSource = result; 
chart1.DataBind(); // This is line that causes the exception. 

Grüße.

+0

Wir müssten die LINQ sehen. – TaW

+1

'var result = root.Descendants() .Elemente (" sensor ") .Where (el => (string) el.Attribute (" name ") ==" Sensor1 ") .Elemente (" evt ") .Select (el => new { t1 = el.Attribute ("Zeit"). Value, v1 = el.Attribute ("val"). Value }) .ToList() ' – Studley

+0

kann ich zeigen die Daten in einem Datagrid, können das Diagrammsteuerelement jedoch nicht verwenden. – Studley

Antwort

0

Ja ist es möglich, aber nicht durch das Binden der Liste an die Chart selbst.

Es gibt mehr ganz unterschiedliche Methoden Chart Databinding, alle mit unterschiedlichen Sätzen von Vor-und Nachteilen zu tun ..

Ich schlage vor, die Series.Points.DataBindXY oder Series.Points.DataBind Methoden. Hier

ein Beispiel:

// create a list with test data: 
List<PointF> points = new List<PointF>(); 
for (int i = 0; i < 100; i++) points.Add(new PointF(i, 1f * i/2f * R.Next(8))); 

nun eine generische Liste von ihm erstellen:

var al = points.Select(x => new { t1 = x.X, v1 = x.Y }).ToList(); 

Jetzt funktioniert das:

someSeries.Points.DataBindXY(al, "t1", al, "v1"); 

oder auch diese:

someSeries.DataBind(al, "t1", "v1", ""); 

In Ihrem Fall würde schreiben Sie vielleicht dies:

chart1.Series[0].Points.DataBind(result, "t1", "v1"); 

Beachten Sie, dass ein Chart typischerweise nur Paare von Werten, während ein DGV erstellen können angezeigt werden kann so viele Spalten als DataSource hat. So braucht Chart ein wenig Hilfe beim Finden der x- und y-Werte.