我在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)?
答案 0 :(得分:0)
我找到了问题的解决方案。
问题是DataGridView
无法绑定到ICollection<Receipt>
,因此解决方案是将导航属性更改为BindingList<Receipt>
。然后设计师正确地展示了这个属性。