Как я могу добавить строку в сетку, связанный с данными, не вызывая ошибки ViewState?
-
27-10-2019 - |
Вопрос
Я пытаюсь добавить строку группы группировки в мою сетку, связанную с данными. Он отлично работает в первом ответе, но в отправке я получил ошибку «Не удалось загрузить ViewState».
Есть код для события Gridview Rowdatabound:
Private Sub AddGroupingRow(ByRef eRow As GridViewRow, ByVal Css As String, ByVal ColSpan As Integer, ByVal Txt As String)
Dim cell As New TableCell()
cell.ColumnSpan = ColSpan
cell.CssClass = "Spacing FieldCell"
cell.Text = Txt
Dim row As New GridViewRow(-1, -1, DataControlRowType.DataRow, DataControlRowState.Normal)
row.CssClass = Css
row.Cells.Add(cell)
Dim tbl As Table
tbl = eRow.Parent
tbl.Rows.AddAt(eRow.RowIndex + 1, row)
End Sub
Private Prev_Client_ID As Integer = -1
Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound
If e.Row.RowType = DataControlRowType.DataRow Then
Dim dr As Data.DataRowView = TryCast(e.Row.DataItem, Data.DataRowView)
If dr IsNot Nothing AndAlso dr.Row.RowState <> Data.DataRowState.Added Then
Dim Client_ID As Integer = dr.Item("Client_ID")
If Client_ID <> Prev_Client_ID Then AddGroupingRow(e.Row, "Group", 8, dr.Item("Client_Name"))
Prev_Client_ID = Client_ID
End If
End If
End Sub
Я знаю, что легче создать группы группировки на основе данных, но вытекая из этого кода, я хочу создать некоторые базы для других сетей на сайте.
Решение
Пытаться эта ссылка. Анкет Это должно помочь вам. У меня тоже была такая же проблема. Единственный способ разрешения - это правильное понимание ViewState.
Другие советы
После некоторого мышления ответ не может быть проще: отключить ViewState of the Gridview.
Я переосвязывал дат данных при каждой пейджинге или сортировке, поэтому потребность в ViewState была минимальной, за исключением страниц и PageIndex, что я стал вынужден отслеживать вручную.
Это значительный компромисс: такие вещи, как PageSize и PageIndex, должны управляться вручную после этого, поскольку их состояние сохраняется ViewState.
Итак, даже делая именно то, что я должен был сделать, я решил принять простое альтернативное решение:
If Cliente_ID <> Cliente_ID_Anterior Then
For i As Integer = 0 To e.Row.Cells.Count - 1
e.Row.Cells(i).Style("border-top") = "solid 1px #777777"
Next
e.Row.Cells(0).Style("border-bottom") = "none"
Else
e.Row.Cells(0).Text = " "
e.Row.Cells(0).Style("border-top") = "none"
e.Row.Cells(0).Style("border-bottom") = "none"
End If
Он все еще группирует колонку, но по -другому, и более дружелюбно. Я мог бы использовать Rowspans и повернуть клетки невидимыми, но это было бы сложнее сохранить. Кроме того, мне нужно будет покрасить линию, когда пользователь перемещает мышь над ней, и Rowspan сильно помешает.