我正在使用Entity Framework 4,我需要让WinForms将Customers和Quotes绑定为Master - Detail关系。
我有一个引用表,我在Windows窗体上列出了详细信息视图。
报价表有3个客户表的外键。 (字段CustomerId,SiteCustomerId,InvoiceCustomerId,它们都链接到Customer表中的Id字段)。
在表单上有3个Customer面板,ComboBox中有Customer Name字段,textBoxes中有其他Customer详细信息字段。
如何连接组合框以便它们在Customer表的下拉列表中显示所有可能的Customers并具有正确的Selected Value,并保存到Quote表中的正确CustomerId字段。
我的(不好)尝试:
Context = new Entities();
quoteBindingSource.DataSource = Context.Quote;
customersBindingSource.DataSource = Context.Customers;
comboBox1.DataSource = customersBindingSource;
comboBox1.DisplayMember = "Customer";
comboBox1.ValueMember = "Id";
comboBox1.DataBindings.Clear();
comboBox1.DataBindings.Add("SelectedValue", quoteBindingSource, "CustomerId");
comboBox9.DataSource = customersBindingSource;
comboBox9.DisplayMember = "Customer";
comboBox9.ValueMember = "Id";
comboBox9.DataBindings.Clear();
comboBox9.DataBindings.Add("SelectedValue", quoteBindingSource, "InvoiceCustomerId");
comboBox6.DataSource = customersBindingSource;
comboBox6.DisplayMember = "Customer";
comboBox6.ValueMember = "Id";
comboBox6.DataBindings.Clear();
comboBox6.DataBindings.Add("SelectedValue", quoteBindingSource, "SiteCustomerId");
答案 0 :(得分:2)
你说的方法并不像你说的那么糟糕。第一件事:你需要这个Clear()语句吗?在这里使用它的目的是什么?第二件事是您可以尝试按如下方式更改代码,看看它是否有帮助:
quoteBindingSource.DataSource = Context.Quote;
customersBindingSource.DataSource = Context.Customers;
到
.......
List<Quote> quotes;
List<Customer> customers;
.....
quotes = Context.Quote.ToList();
customers = Context.Customers.ToList();
.....
quoteBindingSource.DataSource = quotes;
customersBindingSource.DataSource = customers;
然后在每个ComboBox中而不是:
comboBox6.DataSource = customersBindingSource;
你这样做:
comboBox6.DataSource = customers;
还要确保为表格确实正确定义了外键,否则在将DataBinding添加到ComboBoxes时必须使用导航属性而不是引用键。在保存时,上下文有一个SaveChanges()方法,查找它。希望它有所帮助。
我推荐Julie Lerman关于EF4(第二版)的书Programming Entity Framework
答案 1 :(得分:2)
感谢您的WinForms项目版本:)它发生了,或者出了问题,或者我们可能发现了一种错误。在这样的情况下,假设我们缺乏某种知识通常更安全。解决方案很简单但很奇怪:在每个Combobox中你都可以:
comboBox9.DataBindings.Add("SelectedValue", quoteBindingSource, "InvoiceCustomerId");
你应该采取哪些措施来改善现有的价值观:
comboBox9.DataBindings.Add(new Binding("SelectedValue", quoteBindingSource, "InvoiceCustomerId",true));
现在有一个问题。为什么?当您查看DataBindings集合的Add方法的IntelliSense提示时,您会看到某事。像这样:
使用指定的控件属性名称,数据源和数据成员创建System.Windows.Forms.Binding,并将其添加到集合
嗯,在我看来这个描述之后,上面引用的两行代码的结果应该是完全一样的。为什么不呢?好吧,我们希望这只是我们缺乏知识,否则就是一个错误:)