Обработка RowDataBound заставляет динамически связанный GridView показывать только первую запись
У меня есть элемент управления GridView, который я динамически привязываю к DataTable, который заполняется запросом, построенным на основе набора выбранных опций.
То, что я пытаюсь сделать, это просто обработать событие RowDataBound, чтобы отформатировать конкретные строки на основе значения поля базы данных. Код в этом обработчике событий работает нормально. Моя проблема в том, что при вызове этого события GridView отображает только первую запись в DataTable, почти как если бы Gridview останавливался после привязки к DataTable после привязки первой строки.
Я попытался добавить обработчик динамически, но получаю те же результаты.
Любые идеи относительно того, почему простая обработка этого события заставляет Gridview сделать это?
Я точно знаю, что возвращаемых данных достаточно (DataTable заполняется всеми записями, а GridView прекрасно отображает все записи, не касаясь события RowDataBound).
Я добавляю обработчик сразу после генерации запроса, заполнения DataTable и привязки GridView:
oDA.Fill(oDTbl)
figs_gv.DataSource = oDTbl
figs_gv.DataBind()
AddHandler figs_gv.RowDataBound, AddressOf gvRowDataBound
Сам обработчик:
Protected Sub gvRowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs)
If e.Row.RowType = DataControlRowType.DataRow Then
If (e.Row.DataItem("Have") = "Yes") Then
For i As Integer = 1 To e.Row.Cells.Count
e.Row.Cells(i).BackColor = Drawing.ColorTranslator.FromHtml("#d3f1c7")
Next
End If
End If
End Sub
Я также определил, что при обработке RowDataBound событие GATView DATABOUND никогда не запускается; Кажется, он прекращает связывание сразу после связывания первого ряда.
1 ответ
Я решил свою проблему.
Проходя по моему коду, я обнаружил, что получаю ошибку "Индекс вне диапазона" при циклическом просмотре ячеек каждой строки как таковой:
For i As Integer = 1 To e.Row.Cells.Count
e.Row.Cells(i).BackColor = Drawing.ColorTranslator.FromHtml("#d3f1c7")
Next
Исключение было брошено, прежде чем он получил возможность перейти к следующему ряду. Так как я хотел пропустить первую ячейку и применить цвет фона только ко всем последующим ячейкам, я должен был установить его на один цикл меньше, чем количество ячеек, как таковое:
For i As Integer = 1 To e.Row.Cells.Count - 1
e.Row.Cells(i).BackColor = Drawing.ColorTranslator.FromHtml("#d3f1c7")
Next