Возможно ли установить источник данных диаграммы из общего списка?

#c# #visual-studio #winforms

#c# #linq #привязка к данным #Диаграммы

Вопрос:

У меня есть список, созданный из запроса linq, который содержит 2 столбца данных.

 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, я получаю эту ошибку:

Система.Исключение ArgumentException было необработанным HResult=-2147024809
Сообщение=Точки данных серии не поддерживают значения типа <>f__AnonymousType0`2[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 = resu<
chart1.DataBind(); // This is line that causes the exception.
  

С уважением.

Комментарии:

1. Нам нужно было бы увидеть linq.

2. 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()

3. Я могу отобразить данные в Datagrid, но не могу использовать элемент управления диаграммой.

4. Смотрите мой обновленный ответ!

Ответ №1:

Да, это возможно, но не путем привязки списка к Chart самому.

Существует несколько совершенно разных методов для выполнения привязки данных диаграммы, все с разными наборами плюсов и минусов..

Я предлагаю использовать методы Series.Points.DataBindXY или Series.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 обычно a может отображать только пары значений, тогда как a DGV может создать столько столбцов, сколько DataSource имеет. Итак, Chart нужна небольшая помощь в поиске значений x и y..