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

时间:2016-06-10 14:31:47

标签: c# linq data-binding charts

我有一个包含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
  消息=系列数据点不支持类型的值   <> f__AnonymousType0`2 [System.Double,System.Decimal]仅限值   可以使用这些类型: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.

问候。

1 个答案:

答案 0 :(得分:0)

是的,但可以通过将列表绑定到Chart本身来实现。

有几种完全不同的方法可以做Chart Databinding,所有方法都有不同的优点和缺点..

我建议使用Series.Points.DataBindXYSeries.Points.DataBind方法。

以下是一个例子:

// 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)));

现在从中创建一个通用列表:

var al = points.Select(x => new { t1 = x.X, v1 = x.Y }).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值。