當您設置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