Как заставить DataGridView повторно заполнить свои строки, используя IQueryable <TEntity> - PullRequest
0 голосов
/ 20 августа 2011
BlaEntities TestContext = new BlaEntities();
IQueryable<TestEntity> Entities = TestContext.TestEntity;
TestDataGridView.DataSource = Entities;

Когда я назначаю сущности непосредственно источнику данных TestDataGridView;Мне не нужно ничего делать, чтобы отразить мои изменения в сетке.

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

Этого более чем достаточно, чтобы увидеть изменения в TestDataGridView.Единственное исключение, с которым я столкнулся, заключалось в том, что, если я добавлю еще одну строку в TestContext, используя TestContext.AddToTestEntity(...), он не будет отображаться в сетке (в отличие от удаления), но я получу его с помощью метода Add BindingSource.

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

Теперь единственное препятствие, которое осталось на моем пути, заключается в следующем: если я использую фильтрацию - например, TestContext.Where(t => t.Active) - использую его в качестве источника данных для своей сетки, затем меняю свойство Active первой записи на false, как мне обновить / перезагрузитьсетка, чтобы отразить это, не создавая другой экземпляр BlaEntities?

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

Я вижу, что он больше не активен в сетке, но, поскольку сетка должна показывать только активные записи, как я могу удалить ее из сетки, не удаляяэто из источника?

  • Когда я перебираю FilteredEntities, я вижу, что temp больше нет, но я все еще могу видеть и редактировать его в сетке.Так что мне нужно, чтобы что-то заставило grid итерировать свой DataSource (который является FilteredEntities) и снова заполнить себя
  • Я пытался вызвать TestContext метод Refresh и методы сброса BindingSource.
  • Я попытался изменить TestDataGrid.DataSource на null, затем изменить его обратно на FilteredEntities в надежде на повторное заполнение строк, тоже не сработало.
  • Это работает, если я сохранюмои изменения с использованием TestContext.SaveChanges() и использование другого экземпляра BlaEntities, например TestDataGridView.DataSource = new BlaEntities().TestEntity.Where(t => t.Active), но мне нужно использовать мой текущий экземпляр.

Итак, вопрос в том, как я могу заставить TestGridView перезагрузить егосодержимое с использованием FilteredEntities.Любой совет будет принята с благодарностью.Спасибо.

1 Ответ

0 голосов
/ 20 августа 2011

, поскольку у вас уже есть BindingSource, посмотрите на метод ResetBindings

// редактирование:
как в комментариях ниже:

Я бы подошел к этой проблеме с фабрикой для «сущностей» ... если бы эта фабрика содержала ссылку на последний созданный IQueryable, она могла бы реализовать сам интерфейс IQueryable, перенаправляя все методы интерфейса этому созданному объекту. поэтому он может выступать в качестве оболочки для вашего источника данных, который может заменить этот источник данных, воссоздав его на основе функции предиката и фактического состояния всех объектов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...