如何绑定WinForms'主详细信息场景中的DataGridView到EF导航属性(集合)?

时间:2015-04-16 10:50:36

标签: winforms data-binding datagridview entity-framework-6 bindingsource

我在Windows窗体中遇到了数据绑定问题。

以下是EF模型中与故事相关的部分:

namespace Model
{
    class Person 
    {
        [Key]
        public int Id { get; set; }

        public String Name { get; set; }

        public virtual ICollection<Receipt> Receipts { get; set; }
    }

    class Receipt 
    {
        [Key]
        public int Id { get; set; }

        public DateTime Timestamp { get; set; }
        public double Value { get; set; }

        public int PersonId { get; set; }
        public virtual Person Person { get; set; }
    }
}

有一个名为peopleBindingSource的BindingSource设置为类Model.Person。在代码背后,我这样做:

db.People.Include(p => p.Receipts).Load();
peopleBindingSource.DataSource = db.People.Local.ToBindingList();

Textbox将其DataBindings设置为peopleBindingSource作为DataSource,将Name设置为属性。

当我运行应用程序时,绑定导航器正常工作,在我单击上一个和下一个按钮时显示不同的人。带有人名的文本框也会正确填充。

现在,出现了问题:

在同一表单上,有一个DataGridView。我想为当前选定的人员的每一个收据显示一行

我尝试将dataGridView's DataSource绑定到Receipts的{​​{1}}导航属性。

我预计gridview会将其DataSource更新为适当的收据集合,就像文本框在导航更改时更新其Text属性一样。设置基本相同。

问题是,没有抛出任何错误,并且网格仍为空(它甚至不创建列标题)。

为什么这种绑定不起作用,可以在设计师中完成吗?如何正确设置绑定(无需编程处理peopleBindingSource上的更改事件并从peopleBindingSource.Current手动设置网格的DataSource)?

1 个答案:

答案 0 :(得分:0)

我找到了问题的解决方案。

问题是DataGridView无法绑定到ICollection<Receipt>,因此解决方案是将导航属性更改为BindingList<Receipt>。然后设计师正确地展示了这个属性。