当您设置List或甚至更好的BindingList作为DataGridView的源时,它将获取属性列表并使用它们来生成列。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获取属性的集合。
如果我在上面的代码示例中运行相同的代码,但用MyCustomClass代替ExpandoObject,如下所述,DataGridView将填充得很好。
public class MyCustomClass
{
public string key { get; set; }
public string name { get; set; }
public string number { get; set; }
}
但是,由于我正在从可能更改的源读取数据,因此需要使用动态类。我已经尝试了很多方法,包括一个BindingList BindigList>它们都不会将动态成员绑定到列。我甚至尝试创建一个继承DynamicObject的类,并重写TryGetMember和TrySetMember。
我觉得我正在旋转我的车轮,并忽略了一个简单的解决方案。也许有一些技巧使用我在这里失踪的Dictionary和Linq。
注意事项:我正在收集数据,总结并显示它。一旦显示数据,我不需要添加或删除数据。我会尽力筛选和排序。但是,一旦我弄清楚如何展示它,我会穿过那座桥。
我的例子示出了简单的已知值和类型,但我的实际的源数据将是较不可预测并且从JSON使用Newtonsoft JSON用结构解析如下:
[ { “match_number”:1 , “SET_NUMBER”:1, “键”: “2017onbar_f1m1”, “score_breakdown”:{ “蓝色”:{ “totalPoints”:236, “foulCount”:1, “adjustPoints”:0, “加班”:真 }, “红”:{ “totalPoints”:236, “foulCount”:1, “adjustPoints”:0, “加班”:真 } }, “teammembers”:{ “蓝色”:{ “团队”:[ “的member1”, “member2”, “member3” ] }, “红色”:{ “团队”:[ “member4”, “member5”, “member6” ] } } }]
但是,score_breakdown字段会有所不同。
为datagridview使用'dynamic'的目的是什么? 'DataGridView.DataSource'是所有其他强类型对象的集合。 – Fabio
看起来像XY问题,你可以显示你从那个来源得到什么样的数据(格式)? – Fabio
源数据有点大,但源代码是使用Newtonsoft.JSON转换的JSON。一些结构将保持不变,但有些会有所不同。 – Prdufresne