관리 메뉴

IT 쟁이

ASP.NET 2.0 에서의 DataGrid 사용하기 (1) 사용자 지정 폐이징 본문

ASP.NET Ex

ASP.NET 2.0 에서의 DataGrid 사용하기 (1) 사용자 지정 폐이징

클라인STR 2008. 2. 12. 15:38

ASP.NET 2.0에서는 DataGrid를 업그레이드한 GridView라는 컨트롤이 있습니다.. 하지만 =_= 다시금 사용해보기로 했습니다. 별로 달라진건 없지만 2.0에서 데이터베이스접근을 쉽게하기위해서 나타난 SqlDataSource 객체를 사용하기로 합니다.. 다시 살펴보는 이유는 제가 .NET을 배울때는 데이터그리드 컨트롤에대해서 많이 다루어보질 않았기 때문입니다. 왜냐면 =_= 주변에서 평이 좋지않았고(강사님의 비추천)현업에서 안쓴다..변형이 어렵다..등등의 말을 많이들었기 때문이죠. 하지만 지금 생각하고 사용해본결과 괜찮은 컨트롤인거 같습니다.. 혹은 다른책에선 영리한 컨트롤이라고 그러더군요.

도구상자에서 데이터그리드를 찾아서 컨트롤을 작성할려고하면 보이지않습니다.
그러므로 소소 크도를 직접 작성하면 컨트롤을 모습이 나타납니다.

다음과 같이 컨트롤을 작성합니다.

사용자 삽입 이미지

SqlDataSource객체에서 오른쪽마우스버튼을 클릭하여 데이터 소스구성을 선택하고, 적잘한 데이터베이스를 선택합니다.
사용자 삽입 이미지

데이터베이스에서 데이터를 검색하는 방법중 사용자지정 SQL문 또는 저장프로시저를 지정합니다.

사용자 삽입 이미지
데이터소스구성에서 현재 폐이징에 사용될 저장프로시저를 선택합니다.

사용자 삽입 이미지
매개변수 정의 항목에서 현재 저장프로시저에서 선언된 매개변수의 값에 각각의 매개변수 소스를 선택해줍니다.
이때 매개변수 소스로 선택할수 있는 것에는 쿠키, 세션, 폼, 리스트링, 컨트롤 값등이 있습니다.
PageSize와 Page값이 미리저장된 히든필드를 ControlID로 지정해줍니다.
사용자 삽입 이미지

쿼리테스트 버튼을 선택하여 PageSize와 Page값을 임의로 주어서 테스트를 합니다.
사용자 삽입 이미지


사용자 삽입 이미지
테스트가 끝났음으로 마침을 선택합니다.

이상으로 SqlDataSource을 지정이 끝났으며
DataGrid1컨트롤의 DataSourceID의 값을 SqlDataSourceID값으로 설정해주면 됩니다.
이렇게 하면 소스에는 DataBinder.Eval과 같은 바인딩식을 작성해주지 않아도 됩니다. 하지만 SqlDataSource로 처리를 해주는것에는 한계가 있을듯 합니다. =_=아직 많이 안써봐서요..물론 바인딩식을 적어줘도 상관은 없을거 같네요.

그럼 폐이징에 사용된 저장프로시저를 분석하도록 하겠습니다. 이 쿼리문은 Taeyo님의 책에서 본 쿼리를 그대로 사용한 것입니다. 부속질의와 NOT_IN 구문으로 구성되어 있습니다.
 
사용자 삽입 이미지

캡처상태가 양호하지 못한거 같아서 T-SQL 구문으로 다시 작성해봅니다.

SELECT TOP 3  * FROM MyBoard WHERE seq NOT IN(SELECT TOP @page seq FROM MyBoard ORDER BY seq desc) ORDER By seq desc
대략이런구문입니다. @page에 값은 현재 폐이지 인덱스에 따라서 값이 달라지게 됩니다.
부속질의에 해당하는 구문부터 살펴보기로 합니다.
현재 폐이지 값이 첫폐이지라면 page값이 0이라면 (왜 0부터 시작하냐면 DataGrid에 폐이징 인덱스는 0부터 시작하기 때문) SELECT TOP 0 *FROM MyBoard ORDER BY seq desc 가되므로 괄호안에 쿼리문은 0개의 레코드를 가지고 옵니다. 즉 바깥의 쿼리문이 실행되어 SELECT TOP 3  * FROM MyBoard  ORDER by seq desc
최상위 5개의 레코드를 seq가 내림차순으로 데이터를 가지고 옵니다.

SELECT TOP 3  * FROM MyBoard WHERE seq NOT IN(SELECT TOP 0 seq FROM MyBoard ORDER BY seq desc) ORDER By seq desc

사용자 삽입 이미지


첫폐이지의경우 다음순으로 데이터를 가지고 오게 됩니다.
만약에 폐이지값이 1인경우  쿼리문은 다음과 같아 집니다.
@page 값은  Set @page = @page * @pagesize  식에 의해  3이 됩니다. 여기서 pagesize=3이라고 가정합니다.


SELECT TOP 3  * FROM MyBoard WHERE seq NOT IN(SELECT TOP 3 seq FROM MyBoard ORDER BY seq desc) ORDER By seq desc
여기서 부속질의안에 SELECT 구문은 바로 위에 레코드 그림처럼 seq값이 6,5,4인 레코드를 가지고 옵니다.
NOT IN은 AND와 같은 뜻입니다. 여기서 6,5,4를 제외한 최상위 3개의 레코드를 가지고 오라는 뜻이므로
다음과 같은 레코드를 반환합니다.

사용자 삽입 이미지


저장프로시저 구문에서 EXEC 라는 내부명령어를 사용하였는데 이러한 이유는 저장프로시저에서는 TOP 구문에 매개변수를 사용할 수 없기 때문입니다. 그러므로 위의 그림과 같이 문자열로 ' ' 쿼리문을 작성하였습니다.

 데이터그리드 컨트롤에서 폐이징을 사용하기 위해서는 컨트롤의 다음 속성을 True로 설정합니다.

사용자 삽입 이미지

PageSize는 한폐이지에 보여줄 게시물에 수입니다. 여기서 AllowCustomPaging 속성값을 false 할경우는 폐이지 인덱스 에러가 발생하므로 반드시 true로 해줍니다.


비하인드 코드에 다음코드를 추가합니다.
protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
          
            DataGrid1.VirtualItemCount = GetRecordCount();
        }
       
       
    }
DataGrid1에 VirtualItemCount에 현제 데이터베이스의 레코드수를 설정해준다.

그리고 protected void DataGrid1_PageIndexChanged(object source, DataGridPageChangedEventArgs e)
이벤트를 추가합니다.

try
        {
            iPage = e.NewPageIndex;
            HiddenField2.Value = iPage.ToString();
            DataGrid1.CurrentPageIndex = e.NewPageIndex;
            Label1.Text = DataGrid1.CurrentPageIndex.ToString();
            BindData();
        }
        catch (Exception ex)
        {
            Label1.Text = ex.Message;
        }
        finally
        {
           
        }
이때 e.NewPageIndex는 폐이징 클릭시 넘어오는 인덱스 값이다. 즉 다음폐이지에 보여줄 값이므로 이값을 컨트롤에 저장하고 데이터그리드에 반영하기위에 CurrentPageIndex 값을  바꿔줍니다.

시작폐이지
사용자 삽입 이미지

2폐이지를 선택했을때..
사용자 삽입 이미지

Comments