如何强制DataGridView使用IQueryable <tentity> </tentity>重新填充其行

时间:2011-08-20 09:13:31

标签: c# entity-framework gridview datagridview

BlaEntities TestContext = new BlaEntities();
IQueryable<TestEntity> Entities = TestContext.TestEntity;
TestDataGridView.DataSource = Entities;

当我直接将实体分配给TestDataGridView的DataSource时;我没有做任何事情来反映我对网格的更改。

TestEntity entity = Entities.First();
entity.Title = "What up!?";

这足以看到TestDataGridView中的更改。我遇到的一个例外是,如果我使用TestContext.AddToTestEntity(...)向TestContext添加另一行,它不会显示在网格中(与删除它相反)但我使用BindingSource的Add方法工作。

BindingSource source = new BindingSource{DataSource = Entities};
TestDataGridView.DataSource = source;
source.Add(CreateNewTestEntity());

现在我唯一的障碍是: 如果我使用过滤 - 如TestContext.Where(t => t.Active) - 将其用作我的网格的DataSource,然后将第一个记录的Active属性更改为false,如何刷新/重新加载网格以反映这一点而不创建另一个BlaEntities实例?

IQueryable<TestEntity> FilteredEntities =
    TestContext.TestEntity.Where(t => t.Active);
TestDataGridView.DataSource = FilteredEntities;
TestEntity temp = FilteredEntities.First();
temp.Active = false;

我看到它在网格中不再有效但由于网格应该只显示活动记录,如何在不从源中删除它的情况下将其从网格中删除?

  • 当我遍历FilteredEntities时,我可以看到temp不再存在,但我仍然可以在网格中查看和编辑它。所以我需要的是强制网格迭代其DataSource(也就是FilteredEntities)并再次填充自己的东西
  • 我尝试调用TestContext的{​​{1}}方法和Refresh的重置方法。
  • 我尝试将BindingSource更改为TestDataGrid.DataSource,然后将其更改回null,希望重新填充行,但也无效。
  • 如果我使用FilteredEntities保存更改并使用另一个TestContext.SaveChanges()实例,例如BlaEntities,则可以使用,但我需要使用当前实例。

所以问题是,如何让TestGridView使用FilteredEntities重新加载其内容。 任何建议将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:0)

,因为您已经BindingSource看了ResetBindings方法

//编辑:
如下面的评论:

我会用“实体”的工厂来解决这个问题...如果该工厂将ref持有最后创建的IQueryable,它可以通过将所有接口方法转发到该创建的对象来实现接口IQueryable本身。因此,它可以作为数据源的包装器,通过基于谓词函数和所有对象的实际状态重新创建数据源来替换该数据源