将相关实体的属性加载到DatagridView(使用Winforms和EF 6 Code First进行数据绑定)

时间:2017-09-11 09:03:39

标签: c# winforms entity-framework datagridview

我有两个POCO EF课程:

public class Message
{
    public Guid Id { get; set; }
    public String Text { get; set; }
    public bool IsPrivate { get; set; }

    UPDATE2: public Giud UserId { get; set; }

    public virtual User User { get; set; }
}

public class User
{
    public Guid Id { get; set; }
    public String Name { get; set; }
    public int Age { get; set; }

    UPDATE2: public Giud UserRoleId { get; set; }

    public virtual UserRole UserRole { get; set; }
    public virtual ICollection<Message> Messages { get; set; }
}

public class UserRole
{
    public Guid Id { get; set; }
    public String Name { get; set; }
    public virtual ICollection<User> Users { get; set; }
}

Accoridng Entity Framework Databinding with WinForms MSDN tutrotial: 的更新:

  1. 我为Message类创建了一个DataSource。所有相关权利的属性都包含在其中: enter image description here
  2. 然后我将它拖放到我的DataGridView上,VS为所有Message的属性生成列。
  3. 但我希望有一个相关实体属性的列(例如 Message.User.Age ,甚至 Message.User.UserRole.Name )。当我尝试添加新列时,我没有选择: enter image description here
  4. 是否有一种“开箱即用”的方式将相关实体的属性显示到我的DataGridView中? 或者唯一的方法是创建从我需要的EF实体属性投影的自定义DTO对象?

    UPDATE2:我已阅读Show Properties of a Navigation Property in DataGridView (Second Level Properties)问题 Reza Aghaei 建议。并尝试实施选项1 - 使用DataGridViewComboBoxColumn ,但失败了。这就是我所做的:

    1. 将UserId字段添加到Messages类 - 请参阅上面的类说明。
    2. 我为Message类创建了一个DataSource(Data Sources-&gt; Add new data Source-&gt; Object-&gt; Selected Message class): enter image description here 看起来相关权利的属性存在于其中: enter image description here
    3. 然后我将它拖放到我的DataGridView上,VS为所有Message的属性生成列。
    4. 之后,我按照选项1 - 使用DataGridViewComboBoxColumn 指南和UserId的转换列到DataGridViewComboBoxColumn。但是我被困在了:
    5.   

      将它们的ValueMember设置为您为product设置的相同值成员   id列,它是产品表的关键列。(ProductId)

           

      将每个人的DisplayMember设置为您要显示的列   例如,将其中一个设置为Name。一个是Price,一个是Size,....   这样您就可以显示相关的实体字段。

      除了UserId,我没有看到任何用户属性: enter image description here

      我的错误是什么?

1 个答案:

答案 0 :(得分:0)

首先尝试从db加载数据,然后将其绑定到控件

var _messages = db.Messages.ToList(); this.messageBindingSource.DataSource = _messages;