2011-11-22 1 views
1

내 Gridview가 페이지를 정렬하거나 정렬하지 않습니다. 이것은 GridView의 데이터가 열별로 정렬하려고하거나 GridView를 통해 페이지하려고 할 때 변경되지 않는다는 것을 의미합니다.사용자 정의 컨트롤 내에서 GridView가 페이징하거나 정렬하지 않습니다.

사용자 정의 컨트롤 (.ascx)의 UpdatePanel 안에 있습니다. 아래 코드는 사용자 정의 컨트롤 외부에서 시도 할 때 잘 작동합니다.

<asp:GridView runat="server" ID="grdStats" AutoGenerateColumns="false" Width="100%" AllowSorting="true" 
     AllowPaging="true" PageSize="20" PagerSettings-Mode="NumericFirstLast" PagerSettings-Position="TopAndBottom"> 
     <Columns> 
      <asp:BoundField DataField="campaignname" HeaderText="Campaign Name" SortExpression="campaignname" /> 
      <asp:BoundField DataField="site_name" HeaderText="Outlet" SortExpression="site_name" /> 
      <asp:BoundField DataField="filename" HeaderText="Media" SortExpression="filename" /> 
      <asp:BoundField DataField="playinterval" HeaderText="Play Interval" SortExpression="playinterval" /> 
     </Columns> 
    </asp:GridView> 

여기 백엔드이다 : 어떤 도움을 크게 감상 할 수

Protected Sub grdStats_PageIndexChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewPageEventArgs) Handles grdStats.PageIndexChanging 
    grdStats.PageIndex = e.NewPageIndex 
    GetCampaignData() 
End Sub 

Protected Sub grdStats_Sorting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewSortEventArgs) Handles grdStats.Sorting 

    If e.SortExpression = ViewState("sortExpr") Then 
     ViewState("sortExpr") = e.SortExpression & " desc" 
    Else 
     ViewState("sortExpr") = e.SortExpression 
    End If 

    GetCampaignData() 

End Sub 

' ######## POPULATE DATA ######### 

Private Sub GetCampaignData(Optional ByVal CompanyID As Integer = 0) 
    Dim sql As String = Nothing 

    ' Check user access level. 
    If Session("userlevel") = 1 Then 
     ' Current user is admin. 

     ' If a company has been filtered, get it's data, else, get all campaign data. 
     If CompanyID <> 0 Then 
      sql = "SELECT" & vbCrLf & _ 
      " a.campaignid," & vbCrLf & _ 
      " a.companyid," & vbCrLf & _ 
      " a.campaignname," & vbCrLf & _ 
      " a.filename," & vbCrLf & _ 
      " startdate," & vbCrLf & _ 
      " enddate," & vbCrLf & _ 
      " a.playinterval," & vbCrLf & _ 
      " a.ActiveStatus," & vbCrLf & _ 
      " b.*," & vbCrLf & _ 
      " (SELECT COUNT(*)" & vbCrLf & _ 
      "  FROM campaignstats AS c" & vbCrLf & _ 
      "  WHERE DAY(date_played) = DAY(CURRENT_DATE)" & vbCrLf & _ 
      "  AND c.campaignid = a.campaignid" & vbCrLf & _ 
      " ) AS today," & vbCrLf & _ 
      " (SELECT COUNT(*)" & vbCrLf & _ 
      "  FROM campaignstats AS d" & vbCrLf & _ 
      "  WHERE date_played > CURRENT_DATE - INTERVAL 7 DAY" & vbCrLf & _ 
      "  AND d.campaignid = a.campaignid" & vbCrLf & _ 
      " ) AS past_week," & vbCrLf & _ 
      " (SELECT COUNT(*)" & vbCrLf & _ 
      "  FROM campaignstats AS e" & vbCrLf & _ 
      "  WHERE e.campaignid = a.campaignid" & vbCrLf & _ 
      " ) AS playcount" & vbCrLf & _ 
      "FROM campaigns AS a" & vbCrLf & _ 
      "INNER JOIN companies AS b ON a.companyid = b.companyid" & vbCrLf & _ 
      "WHERE a.ActiveStatus = 1" & vbCrLf & _ 
      "AND a.companyid = " & CompanyID 

     Else 
      sql = "SELECT" & vbCrLf & _ 
      " a.campaignid," & vbCrLf & _ 
      " a.companyid," & vbCrLf & _ 
      " a.campaignname," & vbCrLf & _ 
      " a.filename," & vbCrLf & _ 
      " startdate," & vbCrLf & _ 
      " enddate," & vbCrLf & _ 
      " a.playinterval," & vbCrLf & _ 
      " a.ActiveStatus," & vbCrLf & _ 
      " b.*," & vbCrLf & _ 
      " (SELECT COUNT(*)" & vbCrLf & _ 
      "  FROM campaignstats AS c" & vbCrLf & _ 
      "  WHERE DAY(date_played) = DAY(CURRENT_DATE)" & vbCrLf & _ 
      "  AND c.campaignid = a.campaignid" & vbCrLf & _ 
      " ) AS today," & vbCrLf & _ 
      " (SELECT COUNT(*)" & vbCrLf & _ 
      "  FROM campaignstats AS d" & vbCrLf & _ 
      "  WHERE date_played > CURRENT_DATE - INTERVAL 7 DAY" & vbCrLf & _ 
      "  AND d.campaignid = a.campaignid" & vbCrLf & _ 
      " ) AS past_week," & vbCrLf & _ 
      " (SELECT COUNT(*)" & vbCrLf & _ 
      "  FROM campaignstats AS e" & vbCrLf & _ 
      "  WHERE e.campaignid = a.campaignid" & vbCrLf & _ 
      " ) AS playcount" & vbCrLf & _ 
      "FROM campaigns AS a" & vbCrLf & _ 
      "INNER JOIN companies AS b ON a.companyid = b.companyid" & vbCrLf & _ 
      "WHERE a.ActiveStatus = 1" 


     End If 
    Else 
     ' User is not an admin. 
     sql = "SELECT" & vbCrLf & _ 
     " a.campaignid," & vbCrLf & _ 
     " a.companyid," & vbCrLf & _ 
     " a.campaignname," & vbCrLf & _ 
     " a.filename," & vbCrLf & _ 
     " startdate," & vbCrLf & _ 
     " enddate," & vbCrLf & _ 
     " a.playinterval," & vbCrLf & _ 
     " a.ActiveStatus," & vbCrLf & _ 
     " b.*," & vbCrLf & _ 
     " (SELECT COUNT(*)" & vbCrLf & _ 
     "  FROM campaignstats AS c" & vbCrLf & _ 
     "  WHERE DAY(date_played) = DAY(CURRENT_DATE)" & vbCrLf & _ 
     "  AND c.campaignid = a.campaignid" & vbCrLf & _ 
     " ) AS today," & vbCrLf & _ 
     " (SELECT COUNT(*)" & vbCrLf & _ 
     "  FROM campaignstats AS d" & vbCrLf & _ 
     "  WHERE date_played > CURRENT_DATE - INTERVAL 7 DAY" & vbCrLf & _ 
     "  AND d.campaignid = a.campaignid" & vbCrLf & _ 
     " ) AS past_week," & vbCrLf & _ 
     " (SELECT COUNT(*)" & vbCrLf & _ 
     "  FROM campaignstats AS e" & vbCrLf & _ 
     "  WHERE e.campaignid = a.campaignid" & vbCrLf & _ 
     " ) AS playcount" & vbCrLf & _ 
     "FROM campaigns AS a" & vbCrLf & _ 
     "INNER JOIN companies AS b ON a.companyid = b.companyid" & vbCrLf & _ 
     "WHERE a.ActiveStatus = 1" & vbCrLf & _ 
     "AND a.companyid = " & CInt(Session("companyid")) 
    End If 

    grdCampaigns.DataSource = get_data(sql) 
    grdCampaigns.DataBind() 

    For i As Integer = 0 To grdCampaigns.Rows.Count - 1 
     grdCampaigns.Rows(i).Cells(2).Text = Microsoft.VisualBasic.Left(grdCampaigns.Rows(i).Cells(2).Text, 10) 
     grdCampaigns.Rows(i).Cells(3).Text = Microsoft.VisualBasic.Left(grdCampaigns.Rows(i).Cells(3).Text, 10) 
    Next 
End Sub 

Public Function get_data(ByVal SQLStatement As String) As DataView 

    'Populates the datatable 
    Dim dt As Data.DataTable 

    dt = db.GetDataTable(SQLStatement) 

    Dim dv As System.Data.DataView = New System.Data.DataView(dt) 

    If Not ViewState("sortExpr") Is Nothing Then 
     dv.Sort = ViewState("sortExpr") 
    Else 
     dv = dt.DefaultView 
    End If 

    Session("dv5") = dv 
    Return dv 
End Function 

여기 내 코드입니다.

+0

코드가 좋게 보입니다. 사용자 콘트롤의 코드 뒤에 다른 것이 있습니까? – Icarus

+0

다른 그리드에서 정보를 편집하고 삭제하는 코드. 이것은 읽기 전용으로되어 있습니다. 도움이되면,이 격자를 채울 때 (다른 격자의 선택 버튼을 클릭하여), 디버거는 Page_Load를 두 번 누르기 전에 다른 것을 수행합니다. – Ortund

답변

0

나는이 질문에 관련된 올바른 코드가 아니었지만, 그 질문에 붙여 넣은 코드에 대해 사과드립니다. 즉, 내 코드를 살펴볼 시간을내어 주신 것에 대해 감사드립니다. Icarus.

페이징/정렬이 작동합니다. 문제를 해결하기 위해 수행 한 작업은 PageIndexChangingSorting 이벤트 처리기 내의 GetCampaignData()에 대한 호출을 필요한 결과를 제공하는 데 필요한 SQL 코드 및 데이터 바인딩 메서드로 바꾸는 것이 었습니다.

관련 문제