如何使用Entity Framework作为DataGridView的通用DataSource?

时间:2017-02-06 14:58:34

标签: c# winforms entity-framework datagridview generic-programming

我正在尝试制作DataGridView表单,其中包含泛型 DataSource并显示数据。

我无法使数据绑定起作用:

  

EntityFramework.dll中出现未处理的“System.NotSupportedException”类型异常

     

其他信息:不支持直接绑定到商店查询(DbSet,DbQuery,DbSqlQuery,DbRawSqlQuery)的数据。而是使用数据填充DbSet,例如通过在DbSet上调用Load,然后绑定到本地数据。对于WPF绑定到DbSet.Local。对于WinForms绑定到DbSet.Local.ToBindingList()。对于ASP.NET WebForms,您可以绑定到查询上调用ToList()的结果或使用模型绑定,有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=389592

我尝试传递DataTableDataSetList - 但没有运气......我的问题是我想使用存储库模式并创建一个可以使用不同的通用存储库类我的数据库中的表。

这是我第一次尝试编写存储库模式代码,并使用泛型类型。

public DataGridForm(IEnumerable<???> source) // TEntity or T can't be recognized by VisualStudio as a type!
{
    InitializeComponent();
    // TODO: Complete member initialization

    this.bindingSource.DataSource = source;
}

我很难做到这一点。请告诉我们如何实现这一目标?

我称这种方法为:

public IEnumerable<TEntity> GetAll()
{
    return Context.Set<TEntity>().ToList();
}

我知道这是一个有问题的问题,但我需要以某种方式提供帮助

~ChenChi

更新:接受的答案没有问题,真正的问题是我的AutoGenerateColumns属性默认设置为 false

dataGridView.AutoGenerateColumns = true;

通过代码隐藏将其设置为true使一切正常......我在属性窗口中寻找此属性而我找不到它?!也许是某些我不知道的Visual Studio bug ...

1 个答案:

答案 0 :(得分:1)

DataSource

BindingSource属性接受object。因此,将object数据传递给表单的构造函数就足够了:

public DataGridForm(object source) 
{
    InitializeComponent();
    // TODO: Complete member initialization

    this.bindingSource.DataSource = source;
}

对于运行时数据绑定,您不需要该类型。但出于任何原因,如果您想将IEnumerable<T>传递给表单,表单应该是DataGridForm<T>,它在设计器中有副作用。