Как я могу обновить только видимые строки данных DataGridView? - PullRequest
5 голосов
/ 10 августа 2009

У меня есть DataGridView, связанный со списком пользовательских объектов, созданных на лету. Этот список не очень большой, максимум 5000 наименований. Однако значения пользовательских объектов меняются каждые 50 мс, и сетка зависает в приложении при обновлении значений, и в конечном итоге происходит сбой.

У меня вопрос: есть ли способ «виртуализировать» привязку данных DataGridView, чтобы обновлять только те строки, которые фактически видны на экране?

РЕДАКТИРОВАТЬ: Я выяснил, почему мой DataGridView был таким медленным и не имел ничего общего с привязкой данных. Так что этот вопрос больше не актуален. В качестве примечания, я думаю, что DataGridView уже обновляет только видимые строки, когда происходит событие ListChanged.

Ответы [ 5 ]

2 голосов
/ 10 августа 2009

Хорошая статья о Виртуальном режиме (DataGridView). - http://www.codeproject.com/KB/books/PresentDataDataGridView.aspx#7

1 голос
/ 19 июля 2012

Потратил довольно много времени на поиск этой проблемы, и этот вопрос продолжал появляться, поэтому я привожу здесь ответ, который решил мою проблему: https://stackoverflow.com/a/9348149/674884

У меня есть DataGridView, связанный с BindingSource, который также связан с ComboBoxes и TextBoxes, используемыми для редактирования данных. Каждое событие Leave в редакторах имело большую задержку, которая была вызвана перерисовкой DataGridView всех его строк при обновлении данных. Это произошло даже при использовании VirtualMode.

Проблема была вызвана настройкой автоматического изменения размера AllCells для столбцов DataGridView. Каждый раз, когда значение изменялось, DataGridView просматривал все строки, чтобы найти самую длинную строку для автоматического изменения размера столбца. После отключения автоматического изменения размера я понял, что даже DataGridView с привязкой к данным рисует только видимые строки, поэтому не нужно использовать VirtualMode.

0 голосов
/ 29 марта 2019

Я не знаю, обновляет ли ListChanged только видимые строки. Я не вижу никаких отступов в MSDN. Я рассмотрю реализацию DataGridView позже и обновлю.

В любом случае, у меня работает следующее:

int scrollPositionFirst = dataGridView1.FirstDisplayedScrollingRowIndex;

// displayedRowCount -> is our visible rows count
var displayedRowCount = dataGridView1.DisplayedRowCount(false);

// the loop will iterate in the amount of the displayed rows
for (int rowCount = 0; index < displayedRowCount; rowCount++)
{
    // scrollPositionFirst is our first visable row 
    // so scrollPositionFirst is our starting point
    var set = (Set)dataGridView1.Rows[scrollPositionFirst].DataBoundItem;

    // we update the grid from the first visable(displayed) index 
    UpdateMainGrid(scrollPositionFirst, set);

    // increment index -> this is done because we want to update the next visible row
    scrollPositionFirst++;  
}
0 голосов
/ 10 августа 2009

Что мешает вам просто потянуть видимый поднабор предметов вместо полных 5000?

0 голосов
/ 10 августа 2009

Я думаю, вы захотите посмотреть на , используя DataGridView в виртуальном режиме .

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