Привязать словарь к DataGridView с частыми обновлениями

У меня Dictionary (Of long, Class). Класс имеет несколько свойств. И я хочу просмотреть данные этого словаря в DataGridView. Итак, просто я использовал:

DataGridView1.DataSource = Dictionary.Values.ToArray

Теперь свойства внутри объектов класса для записей внутри словаря постоянно обновляются (слишком часто). И я хочу напрямую отразить эти обновления в DataGridView.

Я считаю, что использование DataGridView1.DataSource = Dictionary.Values.ToArray каждый раз неэффективно и потребует большой вычислительной мощности. Как сделать словарь привязываемым (например, в DataTables)? Мне это нужно в VB.NET, я попытался использовать Linq для решения этой проблемы (здесь https://stackoverflow.com/a/855954/2546348) Но, тем не менее, я не видел новых обновлений для DataGridView.

Какие-либо предложения? Как лучше всего это реализовать?


person Ahmad Musa    schedule 11.11.2019    source источник
comment
Что вы используете, WPF или WinForms?   -  person Pavel Anikhouski    schedule 11.11.2019
comment
Извините, что не упомянул об этом в сообщении, WinForms.   -  person Ahmad Musa    schedule 11.11.2019
comment
Ваш объект класса должен реализовывать INotifyPropertyChanged. Когда закончите, вы можете привязать свой [Dictionary].Values к BindingSource, а затем привязать DGV к BindingSource (установив .DataSource = [TheBindingSource] DGV). Любое изменение значений словаря будет немедленно отражено в DGV.   -  person Jimi    schedule 11.11.2019
comment
Спасибо, @Jimi. Ваше решение отлично сработало. В голову пришел еще один вопрос. Теперь, как сделать то же самое, но когда новый элемент добавлен в Словарь или удален из него? Есть ли какое-либо подобное уведомление, которое может быть подано, чтобы позволить источнику данных обновляться на основе последних элементов (добавление и удаление в словаре) без повторного назначения DataSource для DGV ... Я ценю вашу помощь.   -  person Ahmad Musa    schedule 12.11.2019
comment
Не прямо. Несмотря на то, что ValueCollection, предоставляемый [Dictionary].Values, не является статическим (базовая ссылка ValueCollection будет обновлена ​​при добавлении / удалении в / из Словаря), он не вызывает уведомления об изменении списка (на самом деле есть средства, но я не буду предлагаю любое :). Вы можете: 1) Добавить новые элементы в BindingSource (объект TValue с BindingSource.Add([object])), при необходимости синхронизировать словарь. 2) Создайте свой собственный класс, который наследуется от Dictionary ‹TKey, TValue› и реализует интерфейс IBindingList. 3) Используйте DataTable вместо словаря   -  person Jimi    schedule 12.11.2019
comment
В пункте 2) настраиваемая реализация может предоставлять ответы по умолчанию в обычных случаях, используя методы по умолчанию реализации Dictionary<TKey, TValue>, но предоставлять свою собственную форму ValueCollection при привязке к данным через методы IBindingList и его общепринятые / интерпретируемые уведомления об изменении списка.   -  person Jimi    schedule 12.11.2019
comment
Еще раз спасибо @Jimi. Когда вы сказали (я не буду предлагать). Вы имеете в виду, что я могу использовать любой способ? Или вы не предпочитаете их использовать из-за известных проблем / недостатков при их использовании? Я думаю, что решение 1 может быть самым простым. Но вам будет интересно увидеть пример предложения (2), если вы не возражаете и не возражаете. Лучший :)   -  person Ahmad Musa    schedule 13.11.2019
comment
И, кстати, @Jimi. Я предлагаю вам поставить свой первый комментарий в качестве ответа, который будет признан правильным, поскольку он помог мне в моей первой проблеме в сообщении ...   -  person Ahmad Musa    schedule 13.11.2019


Ответы (1)


Благодаря комментарию @jimi я использовал свойство notify для этого ... Но мне нужно было ответить на этот вопрос:

Ваш объект класса должен реализовывать INotifyPropertyChanged. Когда закончите, вы можете привязать свой [Dictionary].Values к BindingSource, а затем привязать DGV к BindingSource (установив .DataSource = [TheBindingSource] DGV). Любое изменение значений словаря будет немедленно отражено в DGV.

person Ahmad Musa    schedule 04.04.2020