ComboBox数据源和Entity Framework

4

我在我的项目中添加了数据模型实体,命名为publishingCompanyEntities,并在我的窗体中添加了ComboBox。 但是,当我想将我的作者列表绑定到我的组合框时,数据源已填充数据,但cmoAuthors.Items.Count返回0,而cmoAuthors.DataSource.Count返回2个项目。

        publishContext = new publishingCompanyEntities();
        cmoAuthors.DataSource = publishContext.Authors;
        cmoAuthors.DisplayMember = "FirstName";

尝试调用 cmoAuthors.Invalidate(),然后检查 Items.Count 是否已更新。 - Jens Kloster
不,它仍然返回0,而winform中的comboBox也是空的! - Moslem .
如果您将源更改为以下内容:publishContext.Authors.ToList(),会发生什么? - Jens Kloster
是的,ToList() 解决了问题。但是为什么编译器没有告诉我我不能将 dbSet 作为数据源填充!:| - Moslem .
我已经将我的回答中的信息合并了。 - Jens Kloster
2个回答

15
你需要将.ToList()添加到作者的实体集(EntitySet)中。
publishContext = new publishingCompanyEntities();
        cmoAuthors.DataSource = publishContext.Authors.ToList();
        cmoAuthors.DisplayMember = "FirstName";
        cmoAuthors.Invalidate();

之所以如此,是因为EntitySet并不是一个实际的集合。它是一个查询(IQueryable),而且似乎ComboBox并不聪明到可以检测出这一点。

调用ToList()会将publishContext.Authors材料化为对象。

由于某种原因,ComboBox没有更新它的Items集合,那么就需要检测到一个新的数据源。 Invalidate()强制控件重绘自己,并在过程中更新其Items集合。


如果我不使用Invalidate(),可以吗? - r.hamd
@r.hamd 好的,我不会强迫你 :) 只有你知道在你的情况下什么是最好的。 - Jens Kloster

3

您需要提供valuemember属性。ValueMember

cmoAuthors.DisplayMember = "FirstName";
cmoAuthors.ValueMember = "yourValueProperty";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接