IT정보

DataSet을 이용한 정렬(소트), 페이징 구현

YUNOLAND 2009. 4. 17. 17:05

우선 소트입니다..

private const string ASCENDING = " ASC";
private const string DESCENDING = " DESC";

이 아이들을 전역변수로 지정해 두고,

aspx파일의 그리드뷰 선언부 입니다...

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
            DataKeyNames="emp_no" onrowediting="GridView1_RowEditing"
            AllowSorting="true" onsorting="GridView1_Sorting"
            onrowcancelingedit="GridView1_RowCancelingEdit"
            onrowupdating="GridView1_RowUpdating"
            AllowPaging="true"
            OnPageIndexChanging="GridView1_PageIndexChanging">

소팅에 필요한 속성은 빨간글씨~

protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
        {
            string sortExpression = e.SortExpression;

            if (GridViewSortDirection == SortDirection.Ascending)
            {
                GridViewSortDirection = SortDirection.Descending;
                SortGridView(sortExpression, DESCENDING);
            }
            else
            {
                GridViewSortDirection = SortDirection.Ascending;
                SortGridView(sortExpression, ASCENDING);
            }  
        }

public SortDirection GridViewSortDirection
        {
            get
            {
                if (ViewState["sortDirection"] == null)
                    ViewState["sortDirection"] = SortDirection.Ascending;

                return (SortDirection)ViewState["sortDirection"];
            }
            set { ViewState["sortDirection"] = value; }
        }

아래 메소드가 가장 중요한 부분..
실질적으로 소팅을 해주고 있습니다..
DataView를 생성시켜 DataTable을 참조합니다..
이 DataView의 Sort에 필요한 아이가, sortExpression이랑 sortDirection입니다..
그리고 마지막으로 소팅한 DataView를 DataSource에 추가해줘야 합니다..
이것이 포인트겠죠..

private void SortGridView(string sortExpression, string direction)
        {
            tableAdapterManager.ProjectManagerTableAdapter = new ProjectManagerTableAdapter();
            tableAdapterManager.ProjectManagerTableAdapter.GetProjectInfo(pmSystemDataSet.ProjectManager);

            DataTable dt = pmSystemDataSet.ProjectManager;

            DataView dv = new DataView(dt);
            dv.Sort = sortExpression + direction;

            GridView1.DataSource = dv;
            GridView1.DataBind();
        }

천천히 읽어 보면 어렵지 않을듯 합니다..

다음은 페이징이군요..프레임워크 버전이 올라가면서 DataGrid에서 Gridview로 변화되었는데요.. Customize Paging기능 구현이 까다로워졌다고 하는군요..공부하지 않으면 안되겠네요.. 설명은 GridView내의 자동 페이징 처리 입니다..(공부해야 할 듯..) 그래서 그리드뷰의 속성을 이용해서 사용했습니다..(일반 페이징[100개의 데이터가 10개씩 한 페이지에 보이는데 소팅을 하게 되면 10페이지 전체의 데이터가 소팅이 되어 버리는 것], Customize Paging은 보이는 화면에서의 소팅..)
이라고 이해를 해두겠습니다..

또 다시 aspx파일의 그리드뷰 선언부 입니다...

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
            DataKeyNames="emp_no" onrowediting="GridView1_RowEditing" 
            AllowSorting="true" onsorting="GridView1_Sorting"                     
            onrowcancelingedit="GridView1_RowCancelingEdit"
            onrowupdating="GridView1_RowUpdating"
            AllowPaging="true"
            OnPageIndexChanging="GridView1_PageIndexChanging"
>

페이징에 필요한 그리드뷰의 속성은 빨간글씨로 적었습니다..

protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            this.GridView1.PageIndex = e.NewPageIndex;
            DBind();
        }

cs단의 코드는 간단합니다..
GridView의 속성에서 AllowSorting속성을 true로 주면 자동으로 그리드뷰의 밑부분에 번호가 붙게 되고 번호를 눌렀을 때가 PageIndexChanging의 이벤트가 발생합니다..

소스 내용을 보면 현재 페이지화면에, 요청한 새로운 페이지를 넣습니다...
그리고 데이터를 다시한번 바인딩 해주면 끝!