Question

Je suis en train d'ajouter une ligne de groupement ligne à mon gridview lié aux données. Il fonctionne très bien sur la première réponse, mais au postback j'ai eu l'erreur « Echec de la charge viewstate ».

Il y a le code pour l'événement RowDataBound du 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

Je sais qu'il est plus facile de créer les lignes de regroupement à la source de données, mais dérivant de ce code, je veux créer une base pour d'autres grilles sur le site.

Était-ce utile?

La solution

Essayez ce lien . Il devrait vous aider. Moi aussi eu le même problème. La seule façon de résoudre est une bonne compréhension de l'état d'affichage.

Autres conseils

Après une réflexion, la réponse ne peut pas être plus simple: désactiver l'état d'affichage du gridview.

je réappairant la source de données à chaque recherche de personnes ou de tri, de sorte que la nécessité de viewstate était au minimum, à l'exception du PageSize et PageIndex que je fus forcé de garder une trace manuellement.

Ceci est un compromis considérable. Choses comme PageSize et PageIndex doivent être gérés manuellement après, étant donné que leur état sont keeped par le ViewState

Alors, même faire exactement ce que je voulais faire, je l'ai décidé d'adopter une solution alternative 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

Il regroupe encore la colonne, mais d'une autre manière, et est plus convivial genre. Je pourrais utiliser rowspans et les cellules devenir invisible, mais il serait plus difficile à garder. D'ailleurs, je vais avoir besoin de peindre la ligne lorsque l'utilisateur déplace la souris dessus, et un rowspan entraveraient beaucoup.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top