오랫만에 개발 관련 글을 적는것 같다 ㅡㅡ;;
최근에 GridView의 Pager 를 사용해 보다가. 왠지 custom도 짜증나고해서 간단한 페이징 기능을 구현했다.
아직 좀더 손봐야 되지만 우선 기본적인 부분 까지만 정리한걸 올려본다.
<asp:GridView ID="GVMember" runat="server" AutoGenerateColumns="true"
onrowdatabound="GVMember_RowDataBound">
</asp:GridView>
<p></p>
<asp:Button ID="btnPrev" runat="server" Text="Prev" OnClick="btnPrev_Clicked" Visible="false" />
<asp:DropDownList ID="ddlPages" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddlPages_SelectedIndexChanged"></asp:DropDownList> / <asp:Label ID="lblTotal" runat="server"></asp:Label>
<asp:Button ID="btnNext" runat="server" Text="Next" OnClick="btnNext_Clicked" Visible="false" />
GridView 는 그냥 그대로 놔두고
버튼 (이전 페이지, 다음페이지)와 드롭다운리스트로 페이지 리스트를 넣었다 (페이지 바로가기)
static int nPage = 1; // 현재 페이지 번호
static int iPage = 30; // 한페이지에 몇개의 게시물을 보여줄지 결정
static int iTotal = 0; // 전체 게시물 수
static int iTotalPage = 1; // 전체 페이지 수
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack) ServerDataBind(); // PostBack이 아닐때만 실행
}
public void ServerDataBind()
{
conn = db.dbcon("Board"); // DB 커넥션은 개인적으로 함수 만들어서 사용 중
SqlParameter[] param = new SqlParameter[2];
param[0] = new SqlParameter("@PAGE", SqlDbType.Int);
param[1] = new SqlParameter("@TOTAL", SqlDbType.Int);
param[0].Value = nPage;
param[1].Direction = ParameterDirection.Output;
ds = SqlHelper.ExecuteDataset(conn, CommandType.StoredProcedure, "dbo.BOARD_GET_LIST", param); // SQLHelper 사용중
iTotal = Convert.ToInt32(param[1].Value);
GVMember.DataSource = ds.Tables[0];
GVMember.DataBind();
conn.Close();
iTotalPage = (iTotal / iPage) + 1; // 전체 페이지 수는 (전체게시물 /페이지당 표시 수) + 1
SetPaging();
}
private void SetPaging()
{
lblTotal.Text = iTotalPage.ToString(); // 전체 페이지 수를 라펠에 표시
ddlPages.Items.Clear(); // 드롭다운리스트의 아이템 클리어
for (int i = 0; i < iTotalPage; i++)
{
int tmp = i + 1;
ListItem li = new ListItem(tmp.ToString());
if (nPage == tmp) li.Selected = true; // 현재 페이지 번호와 일치하면 selected
else li.Selected = false;
ddlPages.Items.Add(li);
}
if (nPage > 1) // 현재 페이지가 1페이지면 이전 페이지 버튼 안보임
{
btnPrev.Visible = true;
btnPrev.Text = (nPage - 1).ToString();
}
else btnPrev.Visible = false;
if (nPage < iTotalPage) // 현재 페이지가 끝페이지면 다음 페이지 버튼 안보임
{
btnNext.Visible = true;
btnNext.Text = (nPage + 1).ToString();
}
else btnNext.Visible = false;
}
protected void GVMember_RowDataBound(object sender, GridViewRowEventArgs e) // 데이터 바운드 할때 padding 조금 넣어놨음
{
for (int i = 0; i < e.Row.Cells.Count; i++)
e.Row.Cells[i].Style.Add("padding", "5px");
}
protected void btnNext_Clicked(object sender, EventArgs e)
{
nPage++;
ServerDataBind();
}
protected void btnPrev_Clicked(object sender, EventArgs e)
{
if (nPage > 1)
{
nPage--;
ServerDataBind();
}
}
protected void ddlPages_SelectedIndexChanged(object sender, EventArgs e)
{
nPage = ddlPages.SelectedIndex + 1;
ServerDataBind();
}
===============================================
프로시져
CREATE PROCEDURE [dbo].[BOARD_GET_LIST]
@PAGE Int
,@TOTAL Int OUTPUT
AS
BEGIN
SELECT @TOTAL = COUNT(*) FROM BOARD_TABLE
SELECT * FROM
(
SELECT TOP(30) * FROM
(
SELECT TOP (@PAGE * 30) * FROM MEMBER ORDER BY RegDate DESC
) A ORDER BY A.RegDate ASC
) B ORDER BY B.Regdate DESC
END
=============================================================
아래와 같은 형식으로 페이지를 표시한다..
전체 994페이지 중 현재 197페이지이며 앞페이지와 다음 페이지 번호를 버튼에 사용 중
이제 1,2,3,4,5,6,7,8,9,10 과 같이 페이지를 표시하는 기능만 추가하면 되는데...
천천히 해야 겠다..