我正在尝试向我的数据绑定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
我知道在数据源上创建分组行比较容易,但是从这段代码中得出,我想为站点上的其他网格创建一些基础。
答案 0 :(得分:1)
试试this link。它应该会帮助你。我也有同样的问题。解决问题的唯一方法是正确理解viewstate。
答案 1 :(得分:0)
经过一番思考后,答案就不那么简单了:禁用gridview的viewstate。
我在每次分页或排序时重新绑定数据源,因此除了PageSize和PageIndex之外,对viewstate的需求是最小的,我被迫手动跟踪。
这是一个相当大的权衡:之后必须手动管理像PageSize和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 = " "
e.Row.Cells(0).Style("border-top") = "none"
e.Row.Cells(0).Style("border-bottom") = "none"
End If
它仍然对列进行分组,但以另一种方式,并且更加友好。我可以使用rowpans并将单元格变为不可见,但它会更难保持。此外,当用户将鼠标移到它上面时,我需要绘制线条,并且会有很多行阻碍。