我正在开发一个WinForms应用程序(.Net 3.5,没有WPF),我希望能够在数据绑定DataGridView中显示外键查找.
这种关系的一个例子是我有一个OrderLines表.订单行与产品和产品具有外键关系,而产品和产品又与ProductTypes具有外键关系.
我想要一个数据绑定DataGridView,其中每一行代表一个订单行,显示该行的产品和产品类型.
用户可以直接向网格添加或编辑订单行,并从comboBoxColumn中为订单行选择产品 - 然后应该在同一行中更新producttype列,显示所选产品的产品类型.
到目前为止,我发现的最接近的一个很好的拟合是引入一个表示订单行的域对象,然后将DataGridView绑定到这些订单行的集合.然后,我将属性添加到公开产品和产品类型的订单行对象,并引发相关的notifypropertychanged事件以使所有内容保持最新.在我的订单行存储库中,我可以将此订单行对象与数据库中的三个表之间的映射连接起来.
这适用于数据绑定方面,但必须手动编写存储库中所有OR映射的代码似乎很糟糕.我认为nHibernate能够帮助完成这个连接但是我正在努力通过所有外键的映射 - 它们似乎工作正常(外键查找订单行的产品根据外键创建正确的产品对象)直到我尝试进行数据绑定,我无法获取数据绑定id列来更新我的产品或producttype对象.
我的一般方法是否在正确的球场?如果是,那么映射问题的解决方案是什么?
或者,是否有更好的数据绑定行解决方案,包括我甚至没有考虑过的外键查找?
我认为您遇到的问题是,当您绑定到网格时,仅支持 INotifyPropertyChanged 是不够的,但您必须在 IBindingList实现中触发 ListChanged 事件,并确保您覆盖并返回 SupportsChangeNotification true财产。如果您不为此返回 true,网格将不会查找它来了解数据是否已更改。
在 .NET 2.0+ 中,您可以使用BindingList类创建通用集合,这将解决大部分麻烦(只是不要忘记覆盖并返回 SupportsChangeNotification 属性 true )。
如果用于数据绑定的类具有集合属性(例如 IBindingList 或 BindingList),则可以将外键网格直接绑定到该属性。当您在表单设计器中配置绑定时,只需选择集合属性作为网格的数据源。它应该“正常工作”。唯一需要注意的部分是确保以正确的方式处理空或空集合。