C# 使用外键在WinForms组合框上进行实体框架4数据绑定

C# 使用外键在WinForms组合框上进行实体框架4数据绑定,c#,entity-framework,combobox,foreign-keys,C#,Entity Framework,Combobox,Foreign Keys,我使用的是EntityFramework4,我需要使用WinForms将客户和报价绑定为一个主-细节关系 我有一个报价表,我将其作为Windows窗体上的详细信息视图进行布局 quote表有3个指向customer表的外键。(CustomerId、SiteCustomerId、InvoiceCustomerId字段都链接到Customer表中的Id字段) 表单上有3个客户面板,组合框中有客户名称字段,文本框中有其他客户详细信息字段 如何连接组合框,使其在Customer表的下拉列表中显示所有可能

我使用的是EntityFramework4,我需要使用WinForms将客户和报价绑定为一个主-细节关系

我有一个报价表,我将其作为Windows窗体上的详细信息视图进行布局

quote表有3个指向customer表的外键。(CustomerId、SiteCustomerId、InvoiceCustomerId字段都链接到Customer表中的Id字段)

表单上有3个客户面板,组合框中有客户名称字段,文本框中有其他客户详细信息字段

如何连接组合框,使其在Customer表的下拉列表中显示所有可能的客户,并具有正确的选定值,并保存到Quote表中正确的CustomerId字段中

我的(坏)尝试:


你的方法并不像你说的那么糟糕。第一件事:您需要这个Clear()语句吗?在这里使用它的目的是什么?第二件事是,您可以尝试按如下方式更改代码,看看是否有帮助:

quoteBindingSource.DataSource = Context.Quote;
customersBindingSource.DataSource = Context.Customers; 

你可以:

comboBox6.DataSource = customers;
还要确保为表正确定义了外键,否则在向组合框添加数据绑定时,必须使用导航属性,而不是引用键。当涉及到保存时,上下文有一个SaveChanges()方法,请查找它。希望能有帮助


我推荐朱莉·勒曼(Julie Lerman)关于EF4的书(第二版),书名为

谢谢你提供的WinForms项目版本:)嗯,可能是出了问题,或者我们发现了一种bug。在这种情况下,假设我们缺乏某种知识通常更安全。解决方案很简单但很奇怪:在每个组合框中:

comboBox9.DataBindings.Add("SelectedValue", quoteBindingSource, "InvoiceCustomerId");
你应该做些什么来改善这种情况,让价值回归到旧的价值观:

comboBox9.DataBindings.Add(new Binding("SelectedValue", quoteBindingSource, "InvoiceCustomerId",true));
现在有一个问题。为什么?当您查看数据绑定集合的Add方法的IntelliSense提示时,您会看到如下内容:

使用指定的控件属性名称、数据源和数据成员创建System.Windows.Forms.Binding,并将其添加到集合中


在我看来,在阅读了这个描述之后,上面引用的两行代码的结果应该是差不多的。为什么不是呢?好吧,我们希望这只是我们缺乏知识,否则这就是一个bug:)

谢谢Tobias。很高兴我在正确的轨道上。如果单击1个组合框,则所有3个组合框中的显示值都相同。如果单击第二个组合,则所有显示值都将更改为第二个组合值。在Customer表中有3个外键都指向Id是非法的吗?当然不是非法的。是我的错。尝试为其他两个组合框添加单独的BindingSource,并将其数据源设置为其他两个新列表,它们从上下文中具有与第一个列表相同的内容,修改组合框数据源应该可以。组合框现在是独立的。但是,当我更改一个值,然后将焦点放在另一个控件上时,显示的值会恢复到以前的值。很难说您是否没有提供负责移动引号的代码。我使用了一个示例数据库,其中一个表有两个外键,一个表有两个外键,另一个表有两个外键,我将这个主表的绑定源连接到绑定导航器,一切正常(在您的情况下,当我移动到主表中的另一行时,适当的值会更改,并且我可以在组合中更改值,并且在选择另一行后不会再更改)代码和数据库是在它是一个200KB的文件。这确实有帮助。谢谢Tobias。嘿,那么很抱歉您在将它迁移到WinForms时遇到了麻烦…但是请记住…培训永远不够:)您好。谢谢你的帮助。我能再打扰你一次吗?嗨,我将在一天内看到它,明天有很多工作,我刚刚读了你的留言。你好,安德鲁。我非常抱歉,但最近工作中的事情相当棘手。也许你已经解决了这个问题,但我还是会解释的。第一件事是:查看您的数据模型,您可以看到客户和邮政编码之间没有连接(NavigationProperty),这就是为什么州、郊区和邮政编码没有正确绑定到表单控件的原因。快速操作:
if(!(quoteBindingSource.Current作为Quote.CustomerId.HasValue)e.Binding.Control.Text=“”在绑定到地址、电话等文本框的BindingComplete事件的方法中。
comboBox6.DataSource = customers;
comboBox9.DataBindings.Add("SelectedValue", quoteBindingSource, "InvoiceCustomerId");
comboBox9.DataBindings.Add(new Binding("SelectedValue", quoteBindingSource, "InvoiceCustomerId",true));