实体框架4 WinForms组合框中的数据绑定与外键

时间:2011-02-17 06:46:52

标签: c# entity-framework combobox foreign-keys

我正在使用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");

2 个答案:

答案 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,并将其添加到集合

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