我正在开发一个 WinForms 应用程序(.Net 3.5,无 WPF),我希望能够在数据绑定 DataGridView 中显示外键查找。

这种关系的一个例子是我有一个 OrderLines 表。订单行与产品具有外键关系,而产品又与产品类型具有外键关系。

我想要一个数据绑定 DataGridView,其中每一行代表一个订单行,显示该行的产品和产品类型。

用户可以直接在网格中添加或编辑订单行,并从comboBoxColumn 中为订单行选择产品 - 然后这应该更新产品类型列,在同一行中显示所选产品的产品类型。

到目前为止,我发现的最接近的方法是引入一个表示订单行的域对象,然后将 DataGridView 绑定到这些订单行的集合。然后,我将属性添加到公开产品和产品类型的订单行对象,并引发相关的notifypropertychanged 事件以使所有内容保持最新。然后,在我的订单行存储库中,我可以连接该订单行对象与数据库中的三个表之间的映射。

这适用于数据绑定方面,但必须在存储库中手动编写所有 OR 映射的代码似乎很糟糕。我认为 nHibernate 能够帮助完成此连接,但正在努力处理所有外键的映射 - 它们似乎工作正常(订单行产品的外键查找根据外键创建正确的产品对象),直到我尝试进行数据绑定,我无法获取数据绑定 id 列来更新我的产品或产品类型对象。

我的总体方法是否正确?如果是的话,什么是解决映射问题的好方法?

或者,是否有更好的数据绑定行解决方案,包括我什至没有考虑过的外键查找?

有帮助吗?

解决方案

我认为您遇到的问题是,当您绑定到网格时,它不足以支持 INotifyPropertyChanged,但您必须在您的 I绑定列表 实现并确保您覆盖并返回 true 支持更改通知 财产。如果您不为此返回 true,网格将不会查找它来了解数据是否已更改。

在 .NET 2.0+ 中,您可以使用以下命令创建通用集合 绑定列表 类,这将解决大部分麻烦(只是不要忘记覆盖并返回 SupportsChangeNotification 属性 true )。

如果用于数据绑定的类具有集合属性(例如 IBindingList 或 BindingList),则可以将外键网格直接绑定到该属性。当您在表单设计器中配置绑定时,只需选择集合属性作为网格的数据源。它应该“正常工作”。唯一需要注意的部分是确保以正确的方式处理空或空集合。

其他提示

欢迎来到 StackOverflow :)

通常您要做的是将下拉列表中的信息基于两个值 ValueMember 和 DisplayMember.

ValueMember 是实际控件值的来源(这将是订单行中的键值),显示成员是向用户显示的值而不是值(这将是 FK 值)。

是否有任何特殊原因不能只返回所需的所有数据并设置这些属性?

这是一个很好的“我该怎么做”视频,演示了数据绑定:

http://windowsclient.net/learn/video.aspx?v=52579

好吧,我不知道 DataGridView 是否支持它,但是当您进行常规 WinForms 数据绑定(例如,常规 TextBox)时,您可以使用 属性路径 浏览对象关系。

像这样的东西:

myTextBox.DataBindings.Add("Text", anOrderLine, "OrderedPart.PartNumber");

如果这也适用于您的情况,那么值得一看。

我原来的问题显然不清楚,对此感到抱歉。

一般来说,问题不在于将数据绑定到 DataGridView,也不在于 DataGridViewComboBoxColumn 的实现 - 正如已经正确回答的人所说,这在网络上有详细记录。

我一直试图解决的问题是刷新通过关系向下钻取的属性。

在我的订单示例中,当我更改“产品”列的值时,“产品类型”列不会更新 - 即使在代码中我设置属性并触发 NotifyPropertyChanged 事件。(在调试中我去了所有正确的地方)

经过大量研究后,我意识到当我直接设置数据源的“产品类型”属性,而不是在“产品”设置器中设置它时,这甚至不起作用。

我相信让我回到正确轨道的另一件事是,当我提供在主窗体中创建的模拟数据访问层时,一切正常。

另外,当我将 nHibernate 制作的 IList 复制到 IBindingList 时 - 一切再次显示正常。

所以 问题是我认为线程和 NotifyPropertyChanged 事件在使用某些数据源时以某些方式丢失(希望我能比这更明确!)

我将继续研究解决此问题的更好方法,而不是将 IList 复制到 IBindingList - 也许我需要了解线程编组。

编辑

我现在已经开发了一个解决方案来解决这个问题,并且我认为我明白是什么让我感到困惑 - 基本上,除了基本属性数据绑定之外的任何东西都不能很好地适用于不是从 BindingList 派生的列表 - 一旦我尝试将数据绑定到触发链式 NotifyPropertyChanged 事件的属性时,事情变得一团糟,我的事件丢失了。

我现在拥有的数据访问解决方案使用的是 Rob Conery 的变体 信息库 模式,返回要绑定的集合作为我制作的自定义类,一个从 BindingList 派生的 SortableBindingLazyList,实现 Sort Core 方法并将其内部列表存储为查询,从而延迟列表实现。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top