0

데이터 그룹화 행에 행 그룹화 행을 추가하려고합니다. 그것은 첫 번째 응답에서 잘 작동하지만 포스트 백에서 나는 "viewstate를로드하지 못했습니다"오류가 발생했습니다. 의 GridView의 RowDataBound 이벤트에 대한 코드가있다어떻게하면 viewstate 오류가 발생하지 않고 데이터 바인딩 된 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 

나는 그것이 데이터 소스에서 그룹화 행을 쉽게 만들 수 있다고 알고 있지만,이 코드에서 파생, 내가 다른 그리드에 일부 기반을 만들려면 사이트에서.

답변

1

시도 this link 그것은 당신을 도와야합니다. 저도 같은 문제가있었습니다. 해결할 수있는 유일한 방법은 viewstate에 대한 올바른 이해입니다.

+0

시간과 링크에 감사드립니다. 저는 디나모로 컨트롤을 만드는 데 익숙해졌습니다. 저는 이미 ASP.NET Page Life Cycle을 존중하며 디나모로 컨트롤을 만드는 데 익숙합니다. 그리고 저는 정말로 어떤 종류의 문제가 발생할 것이라고 생각했습니다. 문제는 : 초기화 단계에서 GridView를 바인딩 할 수없고 일종의 해결 방법을 생각할 수 없다는 것입니다. 아마도 포스트 백의 Init에서 행을 다시 만들어야 할 것입니다 ... 많은 작업이 있지만 그렇지 않습니다. ? 데이터 소스 또는 언급 된 것을 망칠 생각입니다. 보자. 감사! –

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 = "&nbsp;" 
    e.Row.Cells(0).Style("border-top") = "none" 
    e.Row.Cells(0).Style("border-bottom") = "none" 
End If 

그것은 여전히 ​​그룹 열하지만, ​​다른 방법으로 더 많은 종류의 친절 : 심지어는 할 의미, 내가 간단한 대체 솔루션을 채택하기로 결정했습니다 정확히 일을 그래서

, . rowspans를 사용하고 셀을 보이지 않게 할 수는 있지만 유지하는 것이 더 어려울 수 있습니다. 게다가 사용자가 마우스를 움직일 때 선을 그릴 필요가 있습니다. 행 막이 많은 방해가됩니다.

관련 문제