0

データバインドされたグリッドビューに行グループ化行を追加しようとしています。最初のレスポンスではうまく動作しますが、ポストバックで "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 

私はそれがデータソースにグループ化行を作成する方が簡単だということを知っているが、このコードから派生する、私は他のグリッドにいくつかのベースを作成したいです現場で。

答えて

1

お試しthis linkそれはあなたを助けるはずです。私も同じ問題を抱えていました。解決する唯一の方法は、ビューステートの適切な理解です。

+0

お時間をいただきありがとうございました。私はコントロールをdinamically作成するために使用されています。私は既にASP.NET Page Life Cycleを尊重しながら、ディナミカルにコントロールを作成するために使用されています。実際に何らかの問題が発生すると思いました。 問題は次のとおりです。私はInitフェーズでGridViewをバインドできず、何らかの回避策について考えているかもしれません。ポストバック時にInitで行を再作成する必要があるかもしれません。 ? 私は、データソース、または言及されたものを混乱させることを考えました。どれどれ。ありがとう! –

0

考えてみると、答えは簡単ではありませんでした。グリッドビューのviewstateを無効にしてください。

ページングまたはソートごとにデータソースを再バインドしていたので、手動で追跡するようになったPageSizeとPageIndexを除き、viewstateの必要性は最小でした。

これはかなりのトレードオフです。Pag​​eSizeや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 

が、別の方法で、そしてより多くのソート優しいです:

そうで、でも私が行うことに意味された正確に何をして、私はシンプルな代替ソリューションを採用することを決定しました。私は行スパンを使用してセルを目に見えないものにすることができますが、それを維持することは難しいでしょう。また、ユーザーがマウスを動かしたときに線をペイントする必要があり、行間が多大な妨げになります。

関連する問題