ViewStateエラーを引き起こすことなく、データバインドグリッドビューに行を追加するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/4855716

質問

データに縛られたGridViewに行のグループをグループ化する行を追加しようとしています。最初の応答では正常に動作しますが、ポストバックでは「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

DataSourceでグループ化行を作成する方が簡単だと知っていますが、このコードに由来するため、サイトの他のグリッドへのベースを作成したいと思います。

役に立ちましたか?

解決

試す このリンク. 。それはあなたを助けるべきです。私も同じ問題を抱えていました。解決する唯一の方法は、ViewStateの適切な理解です。

他のヒント

いくつかの考えの後、答えはより単純ではありませんでした:グリッドビューのビューステートを無効にします。

私はすべてのページングまたはソートでデータソースを再結合していたので、ViewStateの必要性は、ページサイズとPageIndexを除き、手動で追跡することを余儀なくされるようになりました。

これはかなりのトレードオフです。Paysizeや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 = "&nbsp;"
    e.Row.Cells(0).Style("border-top") = "none"
    e.Row.Cells(0).Style("border-bottom") = "none"
End If

それはまだ列をグループ化しますが、別の方法で、よりフレンドリーです。 rowspansを使用して、細胞を見えないようにすることができましたが、保持するのは難しいでしょう。その上、ユーザーがマウスの上にマウスを移動するときにラインをペイントする必要があり、ロウスパンが大いに妨げられるでしょう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top