2012-04-15 2 views
0

У меня есть DataTable, который будет содержать около нескольких тысяч строк, каждая строка содержит около 20 полей.DataGridView + DataTable, лучший способ обработки огромных списков?

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

Первая проблема я столкнулся в том, что, когда у меня есть приложение с открытым и вызвать DataGrid.DataSource = .. Для DataGrid не показывает данные на первый, я должен минимизировать приложение, а затем вернуть его обратно почему, чтобы данные отображались, почему это происходит?

Вторая проблема заключается в том, что каждая строка будет обновляться из отдельного потока. Я продолжал получать «Index Corrupted» Exception, и тогда я узнал, что не могу обновить dataTable из отдельных потоков, поэтому я создал класс со всеми ячейками, создал List и сделал потоки, чтобы обновить данные класса напрямую, а затем еще один поток обновит dataTable, который, казалось, работал нормально, но есть ли лучший способ сделать это?

В принципе мне нужен DataGrid, который поддерживает пару тысяч строк, которые будут обновляться/удаляться/добавляться в реальном времени (по потокам, а не по пользователю). Каков наилучший способ сделать это?

Спасибо!

ответ

0

Избавиться от таблицы данных будет моей первой мыслью, это единственный раз, когда вы действительно нуждаетесь в ней, если вы хотите применить все эти изменения, сделанные потоками (или кем-то еще, если на то пошло), на бэкэнд.

Этот класс списка, с которым вы столкнулись. Если вы получите его для реализации IList, вы можете привязать его к нему, как к DataTable

Как только вы контролируете использование своего класса, а не DataTable, вы можете посмотреть, когда и как BindingNotifications.

0

Первая проблема UI, которая не может быть обновлена, может быть решена путем обновления DataGridView с использованием myDataGridView.Update(), это обновит или обновит этот элемент управления и будет более эффективным, чем обновление всей формы (я предполагаю, что вы используете WinForms).

Решение второй проблемы зависит от того, какую резьбу вы используете (о которой вы не заявляете). Предполагая, что вы используете TPL, ввод данных в DataGridView может быть сделано с помощью TaskSheduler так внутри метода, что вы работаете в отдельном потоке вы бы

Task.Factory.StartNew(() => 
    { 
     source1.DataSource = dtAll; 
     dataGridView1.DataSource = source1; 
    }, CancellationToken.None, TaskCreationOptions.None, _uiScheduler); 

где TaskScheduler определяется из UI резьба через

TaskScheduler _uiScheduler = TaskScheduler.FromCurrentSynchronizationContext(); 

и передал вам асинхронный метод. Надеюсь, это поможет.

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