Ошибка при отрисовке грида в виртуальном режиме

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Ошибка при отрисовке грида в виртуальном режиме

Сообщение sergey-911 » 26.06.2013 (Ср) 11:28

Ошибка при отрисовке грида в виртуальном режиме.
Доброго времени суток дорогие форумчане.
В топике Отрисовка грида в виртуальном режиме рассматривалось, как загрузить большое количество записей из БД. На тот момент все ОК.
Сейчас снова потребовалось врнуться к отображению в гриде записей в виртуальном режиме. При прокручивании колесика до конца записей грида, в коде
Код: Выделить всё
    Private Sub DataGridView1_CellValueNeeded(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellValueEventArgs) Handles DataGridView1.CellValueNeeded
        Select Case e.ColumnIndex
            Case 0
                e.Value = ListOfRows(e.RowIndex).C1
            Case 1
                e.Value = ListOfRows(e.RowIndex).C2
            Case 2
                e.Value = ListOfRows(e.RowIndex).C3
        End Select
    End Sub

возникает ошибка:
Код: Выделить всё
System.ArgumentOutOfRangeException не обработано пользовательским кодом
  Message=Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции.
Имя параметра: index
  ParamName=index
  Source=mscorlib
  StackTrace:
       в System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)
       в System.ThrowHelper.ThrowArgumentOutOfRangeException()
       в System.Collections.Generic.List`1.get_Item(Int32 index)
       в Динамический_грид.frmGrid.DataGridView1_CellValueNeeded(Object sender, DataGridViewCellValueEventArgs e) в C:\Users\Sergey\Documents\Visual Studio 2010\Projects\Динамический грид\Динамический грид\frmGrid.vb:строка 164
       в System.Windows.Forms.DataGridView.OnCellValueNeeded(DataGridViewCellValueEventArgs e)
       в System.Windows.Forms.DataGridView.OnCellValueNeeded(Int32 columnIndex, Int32 rowIndex)
       в System.Windows.Forms.DataGridViewCell.GetValue(Int32 rowIndex)
       в System.Windows.Forms.DataGridViewCell.PaintWork(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, Int32 rowIndex, DataGridViewElementStates cellState, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
       в System.Windows.Forms.DataGridViewRow.PaintCells(Graphics graphics, Rectangle clipBounds, Rectangle rowBounds, Int32 rowIndex, DataGridViewElementStates rowState, Boolean isFirstDisplayedRow, Boolean isLastVisibleRow, DataGridViewPaintParts paintParts)
       в System.Windows.Forms.DataGridViewRow.Paint(Graphics graphics, Rectangle clipBounds, Rectangle rowBounds, Int32 rowIndex, DataGridViewElementStates rowState, Boolean isFirstDisplayedRow, Boolean isLastVisibleRow)
       в System.Windows.Forms.DataGridView.PaintRows(Graphics g, Rectangle boundingRect, Rectangle clipRect, Boolean singleHorizontalBorderAdded)
       в System.Windows.Forms.DataGridView.PaintGrid(Graphics g, Rectangle gridBounds, Rectangle clipRect, Boolean singleVerticalBorderAdded, Boolean singleHorizontalBorderAdded)
       в System.Windows.Forms.DataGridView.OnPaint(PaintEventArgs e)
  InnerException:

Во вложенном файле – пример для удобства. В нем загружается грид обычным и виртуальным методами.
Подскажите, как избежать ошибки?
:(
Вложения
Динамический грид.rar
Динамический грид
(77.61 Кб) Скачиваний: 155
С уважением, Сергей.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Ошибка при отрисовке грида в виртуальном режиме

Сообщение FireFenix » 26.06.2013 (Ср) 16:01

Код: Выделить всё
DataGridView1.Rows.AddCopies(0, id - 1)
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Re: Ошибка при отрисовке грида в виртуальном режиме

Сообщение sergey-911 » 27.06.2013 (Чт) 13:01

Спасибо FireFenix. Заработало.
Теперь столкнулся с проблемой очистки грида:
1) Грид заполнился данными;
2) Добавляем в БД данные;
3) Нужно заново заполнить грид, включая изменения из БД.
В п. 3 у меня возникла проблема.
Вместо новых данных, в конце грида отображаются 100 первых строк.
Делаю так:
Код: Выделить всё
        'Очистка грида
        DataGridView1.Rows.Clear()
        DataGridView1.Columns.Clear()

При выполнении кода:
Код: Выделить всё
DataGridView1.Rows.AddCopies(0, id - 1)

Возникает ошибка:
Код: Выделить всё
System.ArgumentOutOfRangeException не обработано
  Message=Индекс строки, которую необходимо скопировать, находится вне допустимого диапазона.
Имя параметра: indexSource
  ParamName=indexSource
  Source=System.Windows.Forms
  StackTrace:
       в System.Windows.Forms.DataGridViewRowCollection.AddCopiesInternal(Int32 indexSource, Int32 count, DataGridViewElementStates dgvesAdd, DataGridViewElementStates dgvesRemove)
       в System.Windows.Forms.DataGridViewRowCollection.AddCopiesInternal(Int32 indexSource, Int32 count)
       в System.Windows.Forms.DataGridViewRowCollection.AddCopies(Int32 indexSource, Int32 count)
       в Динамический_грид.frmGrid.btnLoadDinamic_Click(Object sender, EventArgs e) в C:\Users\Sergey\Documents\Visual Studio 2010\Projects\Динамический грид\Динамический грид\frmGrid.vb:строка 143
       в System.Windows.Forms.Control.OnClick(EventArgs e)
       в System.Windows.Forms.Button.OnClick(EventArgs e)
       в System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
       в System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       в System.Windows.Forms.Control.WndProc(Message& m)
       в System.Windows.Forms.ButtonBase.WndProc(Message& m)
       в System.Windows.Forms.Button.WndProc(Message& m)
       в System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       в System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       в System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       в System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       в System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
       в System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       в System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       в System.Windows.Forms.Application.Run(ApplicationContext context)
       в Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
       в Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
       в Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
       в Динамический_грид.My.MyApplication.Main(String[] Args) в 17d14f5c-a337-4978-8281-53493378c1071.vb:строка 81
       в System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
       в System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       в System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       в System.Threading.ThreadHelper.ThreadStart()
  InnerException:


Пробую ее устранить:
Код: Выделить всё
        'Убираем ошибку копирования 0 строк
        DataGridView1.Rows.Add()
        'Добавляем строки в грид
        DataGridView1.Rows.AddCopies(0, id - 2)

Грид загружает данные после добавления в БД (100 строк), но не корректно. Вместо новых данных, в конце грида отображаются 100 первых строк (см. рис.1).

Подскажите дорогие форумчане, как правильно очистить грид от строк и столбцов, чтобы заново корректно отобразить данные из БД.
Доработанный пример прилагается.

:(
Вложения
Динамический грид.rar
(81.96 Кб) Скачиваний: 153
Рис1.jpg
Рис1.jpg (69.77 Кб) Просмотров: 1853
С уважением, Сергей.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Ошибка при отрисовке грида в виртуальном режиме

Сообщение FireFenix » 27.06.2013 (Чт) 18:30

Ну прально жеж!
Есть список ListOfRows. Жмёшь загрузить и ты заполняешь первые 800 с БД.
  • 0-800
Жмякаешь добавить 100 записей. И что? жмёшь естественно загрузить и куда денется новый запрос? он добавить в конец текущего массива! тем самым в массиве будет
  • 0-800
  • 0-100
  • 200-900
Понятное дело с новым размером захватывает 0-800 + первые 100 с нового запроса. Массив же никто не очищает ListOfRows.Clear()

Пользуйтесь отладчиком. При понимании ситуации и знании что и где должно быть сколько - очень быстро ищется проблема
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Re: Ошибка при отрисовке грида в виртуальном режиме

Сообщение sergey-911 » 28.06.2013 (Пт) 15:53

Спасибо FireFenix.
Прилагается работающий пример загрузки грида в виртуальном режиме, может кому пригодится.
:D
Вложения
Динамический грид.rar
(82.2 Кб) Скачиваний: 158
С уважением, Сергей.


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 32

    TopList