2013-01-15 2 views
0

이 시나리오에 어려움을 겪고 있습니다. 누군가가 단계/논리가없는 부분을 명확히하는 데 도움이되기를 바랍니다. 온라인 검색을 시도했지만이 문제를 해결 한 예를 찾을 수 없습니다.PagedDataSource가 이전/다음 페이지에서 작동하지 않습니다.

처음로드 할 때 여러 가지 옵션 (예 : 텍스트 상자, 체크 박스 등)이 표시되는 검색 페이지를 설정하고 있습니다. 사용자가 양식을 작성하고 양식을 다시 제출할 것입니다. 다시 게시되면 페이지에서 사용자의 옵션으로 데이터베이스에 대해 SQL 쿼리 (예 : SELECT WHERE Company = 'Acme'및 AmtDue = 3)를 작성하고 실행 한 다음 결과가 표시됩니다. 이 부분은 정상적으로 작동합니다.

페이지 나누기는 페이지 매김을 추가하려고 할 때 발생합니다. 결과 집합은 Repeater에 바인딩 된 DataTable입니다. 나는 페이지 매김을 추가하기 위해 PagedDataSource를 사용하고있다. 페이지 매김은 첫 페이지에는 효과적이지만 후속 페이지에는 효과가 없습니다. 기본적으로 요청 된 결과의 다음 페이지를 반환하는 대신 (예 : WHERE Company = 'Acme'및 AmtDue = 3 인 고객 ID 선택), 사용자의 검색 옵션을 추가하기 전에 SQL 쿼리가 반환됩니다 (예 : SELECT ID FROM 고객).

내 기본적인 문제는 정상적인 페이지를 구별하는 방법이 확실하지 않다는 것입니다. 결과를 통해 페이지를 뒤로 넘기고 페이지 매기기. 이 문제를 일으키는 이유는 양식 데이터를 다시 수집하고 쿼리를 다시 작성하고 DB를 다시 쿼리하기를 원하지 않기 때문입니다.

온라인에서 찾은 예제에는 페이지가로드 될 때마다 다시 작성되는 DataTable의 페이지 매김이 포함됩니다 (예 : Page.IsPostBack이 아님).

Public dtCustomers As DataTable = New DataTable() 
Sub Page_Load(ByVal Sender As Object, ByVal E As EventArgs) Handles Me.Load 
    ' When the page first loads, show the search form with search options. 
    If Not Page.IsPostBack Then 
     ShowSearchForm() 
    ' Once the form is submitted, show the search results. 
    Else 
     ' ---------------------------------------- 
     ' This is the part that I'm having trouble with. How do I skip the following two steps (GatherFormData() and BuildDT()) when the user requests a subsequent page? 
     GatherFormData() 
     dtCustomers = BuildDT() 
     ' ---------------------------------------- 
     BindData() 
    End If 
End Sub 
Sub BindData() 
    Dim objPDS As PagedDataSource = New PagedDataSource() 
    objPDS.DataSource = dtCustomers.DefaultView 
    objPDS.AllowPaging = True 
    objPDS.PageSize = intNumPerPage 
    objPDS.CurrentPageIndex = Me.ViewState("_CurrentPage") 
    rptSearchResults.DataSource = objPDS 
End Sub 
' Subroutine called when the previous page button is pressed. 
Sub GoToPrevPage() 
    ' Set viewstate variable to the previous page. 
    Me.ViewState("_CurrentPage") -= 1 
    BindData() 
End Sub 
' Subroutine called when the next page button is pressed. 
Sub GoToNextPage() 
    ' Set viewstate variable to the next page. 
    Me.ViewState("_CurrentPage") += 1 
    BindData() 
End Sub 

참고 :

여기에 우리의 코드의 대략적인 윤곽이다 나는 DataTable을 캐시 또는 세션 변수에 투입 할 수있을 것이라는 점을 이해하지만, 가장 좋은 방법을 결정하지 못했다.

코드 개요는 실례지만 실제 코드는 방대해서 단순화하면 문제의 핵심에 쉽게 도달 할 수 있습니다.

불분명 한 것이 있으면 알려주세요. 미리 감사드립니다!

답변

0

세션/캐시에 데이터를 저장한다고 가정하고 있습니다. 나중에 세션을 저장하기위한 유스 케이스가있을 수 있습니다. 뷰 상태와 현재 상태에 키를 저장할 수 있습니다. post-back이 페이지 매김을위한 것인가 아닌가를 결정하는 데 키를 사용할 수 있습니다. 검색이 (

마지막으로,이 데이터베이스/데이터 저장소에서 페이징을 수행 할 수도 있습니다 리셋 (또는 유사한 조건) 인 경우 예를 들어,

if (ViewState["dataKey"] == null) 
{ 
    // first form submittal, do the search 
    GatherFormData(); 
    dtCustomers = BuildDT(); 
    // store it in cache 
    ViewState["dataKey"] = Guid.NewGuid().ToString(); // create a key 
    Cache.[ViewState["dataKey"].ToString()] = dtCustomers; // TODO use Add method to control expiration etc 
} 

그것의 중요한

당신은 뷰 상태 선택을 취소 예를 들어, SQL Server의 순위 지정 기능을 사용하여 검색 결과를 세션/캐시에 저장하지 않고 각 포스트 백에서 데이터베이스 트립을 수행 할 수 있습니다. 이러한 접근 방식은 전체 결과 집합 크기가 커질 수있는 경우에 유용합니다.

+0

답변 해 주셔서 감사합니다. 제공된 예에서 포스트 백을 처음 접하는 것과 이후 페이지를 비교하는 방법은 어떻게 다른가요? 내가 생각하고있는 시나리오는 사용자가 뒤로 단추를 사용하여 원래 양식으로 돌아가서 다른 검색 옵션을 설정 한 다음 양식을 다시 제출할 때입니다. 뒤로 버튼을 사용하면 사용자가 원래 양식을 다시로드하지 않아서 ViewState를 무효화 할 방법이 없으므로 양식을 처리하는 대신 결과가 캐시에서 가져옵니다. – jiminy

+0

나는 간단한 일을 알아 냈다.나는 정규식 필드를 원래 폼에 추가하고 포스트 백에서는 해당 입력 필드의 값이 있는지 테스트합니다. 필드는 첫 번째 포스트 백 (예 : 1 페이지)에만 값을 가지며 각 후속 페이지 (예 : 2+ 페이지)에 값을 갖지 않습니다. 도와 줘서 고마워. – jiminy

+0

@jiminy, 숨겨진 필드는 물론 작동합니다. 참고로, 이전 질문에 대해서는'Request.Form'을 스니핑하여 검색 버튼이 클릭되었는지 확인한 다음 '예'인 경우 뷰 상태를 지울 필요가 있습니다. – VinayC

관련 문제