WinForms 数据绑定和外键关系

     2023-03-31     80

关键词:

【中文标题】WinForms 数据绑定和外键关系【英文标题】:WinForms databinding and foreign key relationships 【发布时间】:2010-09-06 23:27:23 【问题描述】:

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

这种关系的一个例子是我有一个 OrderLines 表。 Orderlines 与 Products 具有外键关系,而 Products 又与 ProductTypes 具有外键关系。

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

用户可以直接向网格添加或编辑订单行,并从组合框列中为订单行选择产品 - 这应该会更新 producttype 列,在同一行中显示所选产品的 producttype。

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

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

我的一般方法是否正确?如果是,什么是映射问题的好解决方案?

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

【问题讨论】:

【参考方案1】:

我认为您遇到的问题是,当您绑定到网格时,仅支持 INotifyPropertyChanged 是不够的,但是您必须在 IBindingList 实现中触发 ListChanged 事件并确保您覆盖并为 SupportsChangeNotification 属性返回 true。如果您不为此返回 true,则网格不会查找它以了解数据是否已更改。

在 .NET 2.0+ 中,您可以使用 BindingList 类创建一个通用集合,这将解决大部分问题(只是不要忘记为 SupportsChangeNotification 属性覆盖并返回 true)。

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

【讨论】:

感谢 Garo - 这很好地涵盖了我自己的发现。唯一的区别是我有一个外键列,而不是一个网格。我也将更新我赢得的回复,明确导致我出现问题的原因 - 我认为我最初误诊问题的原因可能有用【参考方案2】:

欢迎来到 *** :)

通常你会做的是将下拉列表中的信息基于两个值ValueMember and DisplayMember。

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

没有什么特别的原因不能只返回所有需要的数据并设置这些属性吗?

【讨论】:

【参考方案3】:

这是一个很好的“我如何”视频,演示了数据绑定:

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

【讨论】:

【参考方案4】:

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

类似这样的:

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

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

【讨论】:

【参考方案5】:

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

问题一般不在于 DataGridView 的数据绑定,也不在于 DataGridViewComboBoxColumn 的实现——正如回答正确的人所说,这在网络上有很好的记录。

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

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

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

我认为让我重回正轨的另一件事是,当我提供一个以主窗体创建的模拟数据访问层时,一切正常。

此外,当我将 nHibernate 制作的 IList 复制到 IBindingList 时,一切都再次正常。

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

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

编辑

我现在已经开发了一个解决方案来解决这个问题,并且我认为我理解让我感到困惑的地方 - 似乎除了基本属性数据绑定之外的任何东西都不能很好地用于不是从 BindingList 派生的列表 - 只要我试图将数据绑定到触发链式 NotifyPropertyChanged 事件的属性,事情变得混乱,我的事件丢失了。

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

【讨论】:

Laravel 关系和外键约束

】Laravel关系和外键约束【英文标题】:LaravelRelationsandForeignKeyConstraints【发布时间】:2019-03-2707:35:37【问题描述】:我有两个模型和迁移表。<?phpnamespaceApp;useIlluminate\\Database\\Eloquent\\Model;classRoomextendsModelpublicfunctionguest()return$this 查看详情

如何在 Clickhouse 中使用主键和外键的功能?

...】:2021-02-2416:25:05【问题描述】:我最近创建了一个关系数据库模型,它有很多主键和外键关系。我想为我的数据库使用clickhouse,但事实证明clickhouse不支持外键和唯一主键。如果我在这里遗漏了什么,有人可以告诉我 查看详情

在复合键和外键之间创建关系

...但我得到一个错误,指出键的结构是不正确的。我检查了数据类型和字符长度,两者都是正确的。这个链接甚至可能吗?见下面的图片......复合键:外键:任何有关这方面的帮助将不胜感激。答案无法从组合键创建外键。应该是... 查看详情

一对一和外键关系之间的区别?

】一对一和外键关系之间的区别?【英文标题】:Differencesbetweenone-to-oneandforeignkeyrelationships?【发布时间】:2012-10-1809:19:24【问题描述】:有人能解释一下在Django模型中将关系指定为一对一而不是外键的重要性吗?具体来说,我... 查看详情

主键和外键的复合键不能建立关系

】主键和外键的复合键不能建立关系【英文标题】:Cannotmakerelationbetweencompositekeyofprimarykeyandforeignkey【发布时间】:2018-09-2301:31:42【问题描述】:我有两张桌子:“项目”,具有三(3)个字段。两(2)个字段的一个复合键:Donor_Source&... 查看详情

做java项目时的主键和外键是啥啊?

首先要知道一个概念:主键和外键,是针对数据库而言的,只有数据库中的表才有主键外键之说。主键就是一个表中的唯一索引,用于确定一个表中的一条记录,而外键是引用另外一个表中的主键,在当前表中不见得是唯一的,... 查看详情

什么是主键和外键?

...个人是同样的名字的话,就不能做到该属性下的各个元组数据的值不同,如果用***数字作主键就是一个很好的选择。再说说外键(foreignkey):一张表(关系)的列(属性)它同时存在表1和表2中,它不是表1的主键,而是表2的主... 查看详情

数据库中主键和外键是干嘛用的?

...用来建立两个表格之间关系的约束。建立外键后,在插入数据时候会检测数据在主键表中是否存在,如果不存在则无法插入,通过这可以提高维护数据库的完整性和一致性简单点儿说主键是对表的约束,保证数据的唯一性!外键... 查看详情

在自定义主键和外键中定义 Laravel 关系

】在自定义主键和外键中定义Laravel关系【英文标题】:DefiningLaravelRelationshipinCustomPrimaryKeyandForeignKey【发布时间】:2021-12-1218:45:36【问题描述】:我有2个表,它是一对一的关系模型类型。学生表=id|nik|name|address。帐户表=id|nik|用... 查看详情

关于主键和外键

...键就是起约束作用。 一、什么是主键、外键:关系型数据库中的一条记录中有若干个 查看详情

关于数据库主键和外键

 一、什么是主键、外键:关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如  学生表(学号,姓名,性别,班级) 其中每个学... 查看详情

关于数据库主键和外键

一、什么是主键、外键:关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如  学生表(学号,姓名,性别,班级) 其中每个学生的... 查看详情

数据库中主键和外键是干嘛用的?

为了保证两个表某些数据的一致性。作为外键,它里面的数据必须是在主建中所存在的。举个例子:有两个关系:student(s#,sname,d#),即学生这个关系有三个属性:学号,姓名,所在系别dep(d#,dname),即院系有两个属性:系号、系名... 查看详情

关于主键和外键

1什么是主键外键 学生表(学号,姓名,性别,班级)   学号是一个主键 课程表(课程号,课程名,学分)    课程号是一个主键 成绩表(学号,课程号,成绩)     学号和课程号的属性组构成一个主键 成绩表... 查看详情

sqlserver中的“键”是啥意思?主键和外键是啥?

...所在关系的唯一候选键,d#是student的外键。参考资料:数据库——原理、编程与性能参考技术A主键是这条数据在这张表中的唯一标示。外键就是关联其他表的数据的标示 参考技术B一个班的学生的学号可以看做一个主键 查看详情

Django 建模多对多和外键

...间】:2012-07-1015:07:42【问题描述】:试图更好地处理django数据库关系的处理方式。任何想法表示赞赏。考虑以下示例模型:classThings(models.Model):name=models.CharField(max_length=20)classStuff(models.Model):na 查看详情

数据库主键和外键(终于弄懂啦)

一、什么是主键、外键:关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如  学生表(学号,姓名,性别,班级) 其中每个学生的... 查看详情

数据库中主键和外键的作用?

主键是对表的约束,保证数据的唯一性!外键是建立表于表之间的联系,方便程序的编写!主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。主键和外键的设计对物理数据库的性能和可用性都有着决定性的影响。必... 查看详情