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.

¿Fue útil?

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 = "&nbsp;"
    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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top