将一个类的复杂数据源绑定到Grid View中

在这里我有这些类:

public class CustomerDebt { public int ID { get; set; } public string Name { get; set; } public string Family { get; set; } public string Remain { get; set; } public List<Shops> details = new List<Shops>(); } public class Shops { public List<int> ints = new List<int>(); public List<string> strings = new List<string>(); } 

我正在做一个CustomerDebts对象的列表:

 List<CustomerDebt> debts = new List<CustomerDebt>(); 

在这里,我将添加一个项目:

 Shops shop = new Shops(); shop.ints.Add(1); shop.ints.Add(2); shop.strings.Add("M"); shop.strings.Add("S"); shop.strings.Add("F"); CustomerDebt d = new CustomerDebt(); d.ID = 12; d.Name = "Joe"; d.Family = "Steven"; d.Remain = "1000"; d.details.Add(shop); debts.Add(d); 

现在我将债务列表绑定到网格视图中:

 gridview.DataSource = debts; 

它将自动填充网格视图,只有CustomerDebt类的“ID,Name,Family,Remain”属性。 但我需要绑定列表属性是另一个类列表到网格视图。

我认为它需要像{get; 设置;}在网格中显示,但也不知道如果网格可以显示这样的嵌套类。

希望我清楚。 我应该怎么做才能得到一个干净的网格视图与类对象的列表?

Windows窗体中的DataGridView控件中没有对主细节的内置支持。 但是我们可以选择使用第三方库:

  • Telerik 。
  • Devexpress 。

至于绑定问题,是的,你需要有一个公共财产与公共getter:

 public List<Shops> details { set; get; } = new List<Shops>(); 

对于C#6之前,您可以使用:

 public class CustomerDebt { public CustomerDebt() { details = new List<Shops>(); } public List<Shops> details { set; get; } } 

除了被接受的答案之外,另一种做法可以如下所示。 可以手动添加列,然后可以相应地填充行。

  this.gridview.Columns.Add("ID", "ID"); this.gridview.Columns.Add("Name", "Name"); this.gridview.Columns.Add("Family", "Family"); this.gridview.Columns.Add("Remain", "Remain"); this.gridview.Columns.Add("Details", "Details"); foreach (var debt in debts) foreach (var detail in debt.details) this.dataGridView1.Rows.Add(debt.ID, debt.Name, debt.Family, debt.Remain, "Ints:" + string.Join(",", detail.ints) + " Strings:" + string.Join(",", detail.strings));