【问题标题】:How to use Entity Framework as generic DataSource for DataGridView?如何使用实体框架作为 DataGridView 的通用数据源?
【发布时间】:2017-02-06 14:58:34
【问题描述】:

我正在尝试制作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();
}

我知道这是一个很重要的问题,但我需要某种方式的帮助

~陈驰

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

dataGridView.AutoGenerateColumns = true;

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

【问题讨论】:

  • 这不是一个加载的问题。 “加载的问题”是包含有争议或不合理假设的问题。这不是这里的情况。
  • 哇仍然没有帮助... :C
  • @Amy 你说得对,我的意思是重复问题

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


【解决方案1】:

BindingSourceDataSource 属性接受object。所以将数据作为object 传递给表单的构造函数就足够了:

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

    this.bindingSource.DataSource = source;
}

对于运行时数据绑定,您不需要类型。但无论出于何种原因,如果您想将IEnumerable&lt;T&gt; 传递给表单,则表单应为DataGridForm&lt;T&gt;,这在设计器中有其副作用。

【讨论】:

  • 我无法以编程方式更改 DataGridVew 的 DataSource,无论我设置的不同 BindingSource 我在 Tasks 中选择的源列总是保持不变!有什么想法吗?
  • 根据问题描述,我看不到任务面板与此问题之间的关系。但我可以分享的是澄清你需要什么而不是 IEnumerable??>。您不需要使用 IEnumerable&lt;T&gt; 来进行数据绑定。我有许多使用绑定到BindingSourceDataGridView 的表单。您想将任何类型的数据设置为BindingSourceDataSource,幸运的是BindingSource 已为此目的而设计。将数据装箱到对象变量中就足够了。
  • 作为一个简单的测试,从工具箱中将DataGridViewBindingSource 放在Form 上。然后将BindingSourc 设置为DataGridViewDataSource。现在,如果您希望能够将任何类型的数据传递给表单,只需将构造函数更改为我在答案中使用的即可。现在,如果您创建表单的一个实例并将数据传递给它。无论数据的数据类型如何,它都会显示数据。例如,您可以使用var db = new MyDbContext(); var data = db.Products.ToList(); var f = new DataGridForm(data); f.ShowDialog();
  • 似乎 datagridview 确实加载了行(在 BindingNavigator 中)但没有显示列:prntscr.com/e6gvqt
  • 可能是因为你忘记将DataGridView绑定到BindingSource
猜你喜欢
  • 2012-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
相关资源
最近更新 更多