¿Cómo puedo agregar una fila a una vista de gridview de datos sin causar errores de ViewState?
-
27-10-2019 - |
Pregunta
Estoy tratando de agregar una fila de agrupación de fila a mi GridView de datos vinculados a los datos. Funciona bien en la primera respuesta, pero en la respuesta recibí el error de "no cargar ViewState".
Existe el código para el evento RowDatabound de GridView:
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
Sé que es más fácil crear las filas de agrupación en la fuente de datos, pero derivando de este código, quiero crear alguna base para otras cuadrículas en el sitio.
Solución
Probar este enlace. debería ayudarte. Yo también tuve el mismo problema. La única forma de resolver es una comprensión adecuada de ViewState.
Otros consejos
Después de pensar un poco, la respuesta no podría ser más simple: deshabilite el ViewState de la vista de gridView.
Estaba volviendo a unir el plato de datos en cada paginación o clasificación, por lo que la necesidad de ViewState era mínimo, excepto PageSize y PageIndex, que me vi obligado a realizar un seguimiento manualmente.
Esta es una compensación considerable: las cosas como PageSize y PageIndex deben administrarse manualmente después, ya que el Estado ViewState mantiene su estado.
Entonces, incluso haciendo exactamente lo que debía hacer, he decidido adoptar una solución alternativa simple:
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
Todavía agrupa la columna, pero de otra manera, y es más amigable. Podría usar shotspans y convertir las células invisibles, pero sería más difícil mantenerlo. Además, necesitaré pintar la línea cuando el usuario mueva el mouse sobre él, y una espiga de Rows obstaculizaría mucho.