2009-07-27 2 views
0

Я получаю исключение (см. Ниже), когда я извлекаю список строк из datagrid виртуального режима, это происходит только тогда, когда у меня больше строк, чем я могу отображать на экране и это не происходит каждый раз. Есть ли что-то, что мне не хватает в отношении виртуального режима?C# Исключение при извлечении строк из datagrid в виртуальном режиме

Обновление> Нижеприведенное изображение показывает, что индекс находится за пределами диапазона списка. Причина этого заключается в том, что у меня есть 10 элементов, и я скрываю 5, поскольку они не нужны, и я хочу запустить код на 5, которые видны, теперь есть 5 элементов, но индекс может быть между 5-9, как можно переиндексировать? Когда я запускаю некоторый код на видимом 5, я показываю скрытые 5, поэтому я не хочу их игнорировать, мне нужно снова переиндексировать, когда они все будут видны. Большое спасибо.

alt text http://i28.tinypic.com/23iyp95.png

+0

я добавил 3-ий рис, показывающий значение как нулевая для неисправного подряда, это либо истинно, либо false для других строк. – 2009-07-27 14:42:47

+0

Я удалил старые фотографии, поскольку новый pic ясно показывает проблему, мне нужно переиндексировать (я думаю), как бы я это сделал? Спасибо – 2009-07-27 14:57:31

+0

Любая помощь с этим будет высоко оценена. Спасибо – 2009-07-28 09:26:04

ответ

0

Я только использовал виртуальный режим с DataGridView, но в виртуальном режиме вы должны хранить данные самостоятельно и предоставить ему, когда DataGrid необходимо для визуализации. Я полагаю, что datagrid создает минимальное количество элементов, необходимых для заполнения представления, а затем повторно использовать их по соображениям производительности.

0

Это похоже на проблему с нитями. Используете ли вы BackgroundWorker или что-то подобное для заполнения переменной _items? Похоже, что количество вещей в _items меняется, когда вы перебираете его.

Может быть, вы могли бы попытаться окружить любой код решения _items с этим:

lock (_items) 
{ 
    // your code 
} 

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

0

Как вы настроили привязку данных.

Возможно ли, что вы сможете работать с базовым набором данных вместо того, чтобы проходить через datagrid.

+0

Привет, Шираз, Его длинная история, но мне в идеале нужно использовать данные, которые у меня уже есть в datagrid. – 2009-07-27 14:41:38

0

Просто имейте в виду ограничения виртуального режима DataGridView. Несмотря на предполагаемую функцию потребления низкой памяти (только видимые строки загружаются из базы данных); каждая строка имеет свой собственный экземпляр (чтобы доказать, попробуйте изменить размер каждой строки DataGridView, размеры строк могут быть установлены независимо друг от друга, поэтому информация каждой строки (например, RowHeight) должна быть сохранена в их собственной памяти)

Когда вы установите RowCount, он будет создавать n количество строк из того, что вы указали в RowCount. Таким образом, победив одну из исходных целей виртуального режима DataGridView, потребление низкой памяти. Слишком большое потребление памяти может замедлить ваш DataGrid дисплей

Смотрите мою статью здесь http://www.codeproject.com/KB/grid/DataGridView_Billion_Rows.aspx и другую статью http://social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/thread/243a81e7-909b-4c8e-9d28-6114248cf66e