是否可以从通用列表中设置图表数据源?

我有一个从包含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.DataBindXYSeries.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值时需要一些帮助。