Когда вы устанавливаете список или, что еще лучше, BindingList в качестве источника DataGridView, он получает список свойств и использует их для создания столбцов.
Если я сделаю следующее:
StatsList = new BindingList<ExpandoObject>();
// Add seed record to generate columns in DataGridView
dynamic ds = new ExpandoObject();
ds.key = "0000";
ds.Name = "Bob";
ds.Number = "2255442";
ds.key = "0001";
ds.Name = "Nathan";
ds.Number = "1217479";
StatsList.Add(ds);
dgvListView.DataSource = StatsList;
Ничего не произошло. В DataGridView никогда не добавляются столбцы или строки. Я предполагаю, что это связано с отсутствием метода, позволяющего DataGridView получить набор свойств.
Если я запущу тот же код, но заменю ExpandoObject на MyCustomClass в приведенном выше примере кода, как определено ниже, DataGridView заполнится нормально.
public class MyCustomClass
{
public string key { get; set; }
public string name { get; set; }
public string number { get; set; }
}
Однако, поскольку я читаю свои данные из источника, который может измениться, мне нужно использовать динамический класс. Я пробовал несколько методов, включая BindingList BindigList>, ни один из которых не привязывает динамические элементы к столбцу. Я даже пытался создать класс, который наследует DynamicObject с переопределением для TryGetMember и TrySetMember.
Я чувствую, что крутлю колеса и упускаю из виду простое решение. Может быть, есть какой-то трюк с использованием словаря и Linq, который мне здесь не хватает.
Предостережения: я собираю данные, обобщаю их и отображаю. Мне не нужно добавлять или удалять данные после их отображения. Но я постараюсь отфильтровать и отсортировать. Однако я перейду этот мост, как только придумаю, как его показать.
В моем примере показаны простые известные значения и типы, но мои фактические исходные данные будут менее предсказуемыми, и они анализируются из JSON с использованием Newtonsoft JSON со следующей структурой:
[ { "match_number": 1, "set_number": 1, "key": "2017onbar_f1m1", "score_breakdown": { "blue": { "totalPoints": 236, "foulCount": 1, "adjustPoints": 0, «сверхурочные»: true }, «red»: { «totalPoints»: 236, «foulCount»: 1, «adjustPoints»: 0, «сверхурочные»: true } }, «teammembers»: { «blue»: { «teams ": ["участник1", "участник2", "участник3" ] }, "красный": { "команды": [ "участник4", "участник5", "участник6" ] } } }]
Однако поля score_breakdown будут различаться.
dynamic
для представления данных?DataGridView.DataSource
будет коллекция любого другого строго типизированного объекта. - person Fabio   schedule 14.04.2017