#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..