2013-09-10 2 views
0

У меня есть результат запроса LINQ с GroupBy, который я привязал к DataGridView. Что мне нужно реализовать, что изменения в базовом списке IEnumerable List заставят DataGridView обновиться?Обновить Связанный Linq Результат datagridview

Легкий способ, который я нашел, - это просто повторить запрос и повторно привязать его к datagridview всякий раз, когда что-то изменится. Это работает, хотя с некоторыми побочными эффектами (выбранные пользователем элементы не выбраны - свитки списка вверх). Думаю, это потому, что DataGridView фактически представляет собой полный новый список, связанный с ним, а не только одну обновленную запись. Есть ли способ повысить эффективность обновления?

Возможно, Linq - это неправильный способ сделать это эффективно. Я также открыт для других решений, если мне не нужно писать 10 классов для его выполнения.

private void BindObjectsToDataGridView() 
    { 
     IEnumerable<Telegram> myTelegrams = Source.GetTelegrams(); 
     myDataGridView.DataSource = myTelegrams.GroupBy(g => g.ID) 
               .Select(s => new { ID = s.ID, Count = s.Count() }) 
               .ToList(); 
    } 

    private void Source_TelegramsChanged(object sender, EventArgs e) 
    { 
     // Just rebinding the Linq updates just fine 
     // but it causes user-side issues in the datagrid view. 
     // And it feels wrong to completely rebuild the list when 
     // only one telegram has been changed/added/removed... 
     BindObjectsToDataGridView(); 
    } 
+0

Почему вы не помните выбранный индекс строки, обновляете сетку и задаете выбранную строку? Это будет работать только для обновления, но вместо этого вы можете получить идентификатор выбранной строки, а затем использовать LINQ для повторения строк, чтобы найти этот идентификатор и установить его для выбора? Используйте выбранное событие rowviews gridview и поймайте уникальное значение строки. –

+0

@Onam Это чистое поведение для реализации, если нет лучшего решения, чем просто пересоединение всего, но это не изменило бы тот факт, что мне пришлось бы каждый раз переписывать полный список. – Marwie

+0

Проблема заключается в том, что вам нужно переустановить, если у вас нет умного механизма для мониторинга того, что было удалено, изменено, добавлено, а затем обновлено только некоторые части сетки. Это приведет к таким осложнениям, как, например, если пользователь отфильтровал результаты или отсортировал сетку определенным образом. –

ответ

1

Короткий ответ: Есть отдельный класс ViewModel для вашей строки с ObservableCollection этих строк ViewModels в главной ViewModel.

Длинный ответ: Строка ViewModel поддерживает ссылку на объект модели Telegram. Основной ViewModel имеет ObservableCollection строки ViewModels. Основной ViewModel должен делать инкрементные обновления строк - достаточно легко, так как я уверен, что у вас есть уникальные идентификаторы для каждого объекта Telegram. Класс класса ViewModel показывает значения ячейки, привязанные к сетке, как свойства INotifyPropertyChanged. Таким образом, изменения могут быть обнаружены и вместо того, чтобы проходить дорогостоящий процесс «перерисовать все», одно свойство может быть обновлено с помощью вызова INotifyPropertyChanged.

Кроме того, чтобы избежать случайной привязки коллекции, перепишите проблемы позже, создайте сеттер вашего ObservableCollection строк, частный сеттер.

Смежные вопросы