是否可以从通用列表中设置图表数据源?
我有一个从包含2列数据的linq查询创建的列表。
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()
我正在尝试使用图表控件数据源来使用该列表,但是当我调用bind方法时,我收到此错误:
System.ArgumentException未处理HResult = -2147024809
Message = Series数据点不支持类型 f__AnonymousType0`2 [System.Double,System.Decimal]的值,只能使用这些类型的值:Double,Decimal,Single,int,long,uint,ulong,String, DateTime,简称,ushort。
//result is a generic list defined as var result = root.Descendants() chart1.DataSource = result; chart1.DataBind(); // This is line that causes the exception.
问候。
是的,这是可能的,但不是通过将列表绑定到Chart
本身。
图表数据绑定有几种完全不同的方法,所有方法都有不同的优缺点。
我建议使用Series.Points.DataBindXY
或Series.Points.DataBind
方法。
这是一个例子:
// create a list with test data: List points = new List (); for (int i = 0; i < 100; i++) points.Add(new PointF(i, 1f * i / 2f * R.Next(8)));
现在从中创建一个通用列表:
var al = points.Select(x => new { t1 = xX, v1 = xY }).ToList();
现在这个工作:
someSeries.Points.DataBindXY(al, "t1", al, "v1");
或者这个:
someSeries.DataBind(al, "t1", "v1", "" );
在你的情况下你可能写这个:
chart1.Series[0].Points.DataBind(result, "t1", "v1");
请注意, Chart
通常只能显示值对 ,而DGV
可以创建与DataSource
一样多的列 。 因此, Chart
在寻找x值和y值时需要一些帮助。