Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用IQueryable强制DataGridView重新填充其行<;张力>;_C#_Entity Framework_Gridview_Datagridview - Fatal编程技术网

C# 如何使用IQueryable强制DataGridView重新填充其行<;张力>;

C# 如何使用IQueryable强制DataGridView重新填充其行<;张力>;,c#,entity-framework,gridview,datagridview,C#,Entity Framework,Gridview,Datagridview,这足以在TestDataGridView中看到更改。我遇到的一个例外是,如果我使用TestContext.AddToTestEntity(…)向TestContext添加另一行,它不会显示在网格中(与删除它相反),但我使用BindingSource的add方法使它工作 TestEntity entity = Entities.First(); entity.Title = "What up!?"; 现在我唯一的障碍是: 如果我使用过滤-如TestContext.Where(t=>t.Activ

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

TestEntity entity = Entities.First();
entity.Title = "What up!?";
现在我唯一的障碍是: 如果我使用过滤-如
TestContext.Where(t=>t.Active)
-将其用作我的网格的数据源,然后将第一条记录的Active属性更改为false,我如何刷新/重新加载网格以反映这一点而不创建另一个实体实例

BindingSource source = new BindingSource{DataSource = Entities};
TestDataGridView.DataSource = source;
source.Add(CreateNewTestEntity());
IQueryable筛选器身份=
TestContext.TestEntity.Where(t=>t.Active);
TestDataGridView.DataSource=FilterIdentity;
TestEntity temp=FilteredEntities.First();
活动温度=假;
我看到它在网格中不再是活动的,但既然网格应该只显示活动记录,我如何在不将其从源中删除的情况下将其从网格中删除

  • 当我迭代
    FilteredEntities
    时,我可以看到
    temp
    不再存在,但我仍然可以在网格中查看和编辑它。所以我需要的是一些强制网格迭代其数据源(即FilterIdentity)并再次填充自身的东西
  • 我尝试调用
    TestContext
    Refresh
    方法和
    BindingSource
    的reset方法
  • 我尝试将
    TestDataGrid.DataSource
    更改为
    null
    ,然后将其更改回
    FilteredEntities
    ,希望重新填充行,但也没有成功
  • 如果我使用
    TestContext.SaveChanges()
    保存我的更改,并使用另一个
    BlaEntities
    实例,如
    TestDataGridView.DataSource=new BlaEntities().TestEntity.Where(t=>t.Active)
    ,则它可以工作,但我需要使用当前实例
所以问题是,如何让TestGridView使用FilterIdentity重新加载其内容。 如有任何建议,将不胜感激。谢谢。

既然您已经有了一个
BindingSource
请查看该方法

//编辑:
根据以下评论:


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

谢谢,但正如我在问题中提到的,我已经尝试过了。它不会从网格中删除行。让我问一个愚蠢的问题。。。处理一些事件以调用ResetBindings。。。您选择了哪一个?按钮的单击事件。我将所选记录的活动属性更改为false后单击它。无论我是通过编程还是使用网格来更改它,这都无关紧要。如果我检查BindingSource或基础IQueryable,我会发现行不存在,但它不会从网格中消失,除非我不调用ObjectContext的DeleteObject方法或BindingSource的Remove方法。如果从同一上下文创建新的IQueryable,会发生什么?它可以工作,谢谢。但是我将IQueryable(命名实体)和Action(命名OnClick)发送到我的通用网格表单。我使用实体作为网格的数据源,并在用户双击记录时调用OnClick。我将所选对象和用作参数的BindingSource发送到OnClick。因此,如果我发送一个过滤后的IQueryable,并且用户在OnClick中更改了行,导致记录不符合过滤器的要求,我需要将该记录从网格中删除。很抱歉之前没有详细说明,我认为我创建的测试项目的细节足以解释我的情况。
BindingSource source = new BindingSource{DataSource = Entities};
TestDataGridView.DataSource = source;
source.Add(CreateNewTestEntity());
IQueryable<TestEntity> FilteredEntities =
    TestContext.TestEntity.Where(t => t.Active);
TestDataGridView.DataSource = FilteredEntities;
TestEntity temp = FilteredEntities.First();
temp.Active = false;