GridView 의 효율 적 인 페이지 나 누 기와 검색 기능 의 실현 코드
19213 단어 GridView효율 적 인 페이지수색 하 다.
회사 프로젝트 개발,지난주 임 무 는 기초 데이터 관 리 였 다.Sharepoint 2010 에 asp.net 이 들 어 있 는 aspx 페이지 에서 여러 가지 기이 한 문 제 를 만 났 습 니 다.그 전에 sharepoint 에 대해 알 고 있 었 을 뿐 구체 적 인 프로 그래 밍 작업 을 설계 하지 못 했 기 때문에 이번 에는 처음 접 하 는 셈 입 니 다.그 중 일 부 는 기초 데이터 의 양 이 매우 많 고 대체적으로 10 여 만 개가 있다.기초 데이터 에 대한 유지 이기 때문에 데이터 에 대해 목록 을 보 여 주 고 삭제 하고 검사 해 야 한다.모두 가 Asp.net 안에 있 는 GridView 는 자체 적 인 페이지 가 있다 는 것 을 알 고 있다.그러나 그 페이지 는 소량의 데이터 에 있어 서 좋다.이런 수 십 만 의 데이터 양 에 있어이런 페이지 나 누 기 방식 은 그야말로 재난 이다.인터넷 에 서 는 GridView 의 효율 적 인 페이지 나 누 기 에 관 한 것 이 많 습 니 다.하 나 를 찾 아 고 쳤 습 니 다.사용 효과 가 괜 찮 으 니 여러분 과 공유 해 보 세 요.
이것 은 페이지 를 나 누 는 효과 그림 이다.
다음은 구체 적 인 실현 에 대해 말씀 드 리 겠 습 니 다.먼저 이 물건 이 제 가 창작 한 것 이 아니 라 이 를 바탕 으로 수식 과 보완 을 했 을 뿐 입 니 다.여러분 에 게 깨 우 침 을 주 셨 으 면 좋 겠 습 니 다.
프런트 레이아웃
<div>
<div id="main">
<div id="search">
<table>
<tr>
<td>
<asp:Label ID="lb" runat="server" Text=" "></asp:Label></td>
<td>
<asp:TextBox ID="SearchName" runat="server"></asp:TextBox>
</td>
<td>
<asp:Button ID="btnSearch" runat="server" Text=" " onclick="PagerBtnCommand_OnClick" CommandName="search" />
</td>
<td>
<asp:Button ID="btnReset" runat="server" Text=" " onclick="btnReset_Click" />
</td>
</tr>
</table>
</div>
<div id="gridView">
<asp:GridView ID="UserGridView" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:TemplateField HeaderText=" ">
<ItemTemplate>
<asp:Label ID="UserName" runat="server" Text='<%#Eval("username") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText=" ">
<ItemTemplate>
<asp:Label ID="DisplayName" runat="server" Text='<%#Eval("displayname") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText=" ">
<ItemTemplate>
<asp:Label ID="OrgCode" runat="server" Text='<%#Eval("orgcode") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText=" ">
<ItemTemplate>
<asp:Label ID="OrgName" runat="server" Text='<%#Eval("orgname") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</div>
<div id="page">
<table>
<tr>
<td>
<asp:Label ID="lbcurrentpage1" runat="server" Text=" :"></asp:Label>
<asp:Label ID="lbCurrentPage" runat="server" Text=""></asp:Label>
<asp:Label ID="lbFenGe" runat="server" Text="/"></asp:Label>
<asp:Label ID="lbPageCount" runat="server" Text=""></asp:Label>
</td>
<td>
<asp:Label ID="recordscount" runat="server" Text=" :"></asp:Label>
<asp:Label ID="lbRecordCount" runat="server" Text=""></asp:Label>
</td>
<td>
<asp:Button ID="Fistpage" runat="server" CommandName="" Text=" " OnClick="PagerBtnCommand_OnClick" />
<asp:Button ID="Prevpage" runat="server" CommandName="prev" Text=" "
OnClick="PagerBtnCommand_OnClick" />
<asp:Button ID="Nextpage" runat="server" CommandName="next" Text=" " OnClick="PagerBtnCommand_OnClick" />
<asp:Button ID="Lastpage" runat="server" CommandName="last" Text=" "
key="last" OnClick="PagerBtnCommand_OnClick" />
</td>
<td>
<asp:Label ID="lbjumppage" runat="server" Text=" "></asp:Label>
<asp:TextBox ID="GotoPage" runat="server" Width="25px"></asp:TextBox>
<asp:Label ID="lbye" runat="server" Text=" "></asp:Label>
<asp:Button ID="Jump" runat="server" Text=" " CommandName="jump" OnClick="PagerBtnCommand_OnClick" />
</td>
</tr>
</table>
</div>
</div>
</div>
레이아웃 효 과 는 다음 과 같 습 니 다.2.배경 코드 구현
나 는 조금씩 모두 에 게 이 페이지 의 원 리 를 분명하게 설명 할 것 이다.
Members:여기 서 몇 개의 전역 변 수 를 정의 합 니 다.주로 정보의 수량,페이지 의 수량 과 현재 페이지 를 기록 하 는 데 사 용 됩 니 다.
#region Members
const int PAGESIZE = 10;//
int PagesCount, RecordsCount;//
int CurrentPage, Pages, JumpPage;// , ( ),
const string COUNT_SQL = "select count(*) from p_user";
#endregion
Methods: 1.GetRecordsCount:이 방법 은 현재 정보의 총 수 를 얻 는 데 사 용 됩 니 다.sqlSearch 매개 변수 가 있 습 니 다.기본 값 은 default 입 니 다.즉,페이지 를 초기 화 할 때 모든 정보의 총 항목 수 를 조회 합 니 다.사용자 가 검색 할 사용자 이름 을 입력 하여 검색 할 때 사용자 검색 조건 에 맞 는 정 보 를 얻 는 총 항목 수 입 니 다.
/// <summary>
///
/// </summary>
/// <param name="sqlSearch"></param>
/// <returns></returns>
public static int GetRecordsCount(string sqlRecordsCount)
{
string sqlQuery;
if (sqlRecordsCount == "default")
{
sqlQuery = COUNT_SQL;
}
else
{
sqlQuery = sqlRecordsCount;
}
int RecordCount = 0;
SqlCommand cmd = new SqlCommand(sqlQuery, Conn());
RecordCount = Convert.ToInt32(cmd.ExecuteScalar());
cmd.Connection.Close();
return RecordCount;
}
2.OverPage:이 방법 은 남 은 페이지 를 계산 하 는 데 사 용 됩 니 다.현재 설정 한 것 은 페이지 당 10 개의 데 이 터 를 표시 하 는 것 입 니 다.조건 에 맞 는 데 이 터 는 11 개 이 고 2 페이지 를 표시 해 야 합 니 다.
/// <summary>
///
/// </summary>
/// <returns></returns>
public int OverPage()
{
int pages = 0;
if (RecordsCount % PAGESIZE != 0)
pages = 1;
else
pages = 0;
return pages;
}
3.ModPage:이 방법 도 나머지 페이지 를 계산 하 는데 주로 SQL 이 넘 치 는 것 을 방지 합 니 다.
/// <summary>
/// , SQL
/// </summary>
/// <returns></returns>
public int ModPage()
{
int pages = 0;
if (RecordsCount % PAGESIZE == 0 && RecordsCount != 0)
pages = 1;
else
pages = 0;
return pages;
}
4.Conn:이 방법 은 데이터 연결 대상 을 만 드 는 데 사 용 됩 니 다.사용 할 때 자신의 데이터베이스 이름 으로 바 꾸 면 됩 니 다.
/// <summary>
///
/// </summary>
/// <returns></returns>
public static SqlConnection Conn()
{
SqlConnection conn = new SqlConnection("data source=.;initial catalog=DB_GSL_ZCW;Integrated Security=true");
conn.Open();
return conn;
}
5.GridView DataBind:이 방법 은 주로 데이터 바 인 딩 에 사 용 됩 니 다.들 어 오 는 매개 변수 가 default 이면 모든 데 이 터 를 기본 으로 바 인 딩 합 니 다.그렇지 않 으 면 걸 러 진 데 이 터 를 바 인 딩 합 니 다.
/// <summary>
/// GridView , , ,
/// </summary>
/// <param name="sqlSearch"></param>
private void GridViewDataBind(string sqlSearch)
{
CurrentPage = (int)ViewState["PageIndex"];
// ViewState CurrentPage
Pages = (int)ViewState["PagesCount"];
// ViewState
// ( 、 、 、 )
if (CurrentPage + 1 > 1)//
{
Fistpage.Enabled = true;
Prevpage.Enabled = true;
}
else
{
Fistpage.Enabled = false;
Prevpage.Enabled = false;
}
if (CurrentPage == Pages)//
{
Nextpage.Enabled = false;
Lastpage.Enabled = false;
}
else
{
Nextpage.Enabled = true;
Lastpage.Enabled = true;
}
DataSet ds = new DataSet();
string sqlResult;
// sqlSearch , default ,
if (sqlSearch == "default")
{
sqlResult = "Select Top " + PAGESIZE + "user_serialid,username,displayname,orgcode,orgname from p_user where user_serialid not in(select top " + PAGESIZE * CurrentPage + " user_serialid from p_user order by user_serialid asc) order by user_serialid asc";
}
else
{
sqlResult = sqlSearch;
}
SqlDataAdapter sqlAdapter = new SqlDataAdapter(sqlResult, Conn());
sqlAdapter.Fill(ds, "Result");
UserGridView.DataSource = ds.Tables["Result"].DefaultView;
UserGridView.DataBind();
// Label lbCurrentPaget GotoPage
lbCurrentPage.Text = (CurrentPage + 1).ToString();
GotoPage.Text = (CurrentPage + 1).ToString();
sqlAdapter.Dispose();
}
6、Page_Load:페이지 로 딩 함 수 는 주로 페이지 에 처음 들 어 갈 때 초기 화 되 며 기본적으로 모든 정 보 를 가 져 옵 니 다.
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)// ,
{
RecordsCount = GetRecordsCount("default");//
PagesCount = RecordsCount / PAGESIZE + OverPage();//
ViewState["PagesCount"] = RecordsCount / PAGESIZE - ModPage();// , 1
ViewState["PageIndex"] = 0;// 0
ViewState["JumpPages"] = PagesCount;
// ,
// lbPageCount、lbRecordCount
lbPageCount.Text = PagesCount.ToString();
lbRecordCount.Text = RecordsCount.ToString();
//
if (RecordsCount <= 10)
{
GotoPage.Enabled = false;
}
GridViewDataBind("default");// TDataBind()
}
}
7、PagerBtnCommand_OnClick:이 방법 은 보기 페이지 의"첫 페이지","다음 페이지","이전 페이지","끝 페이지","조회"단추 의 Click 이 벤트 를 처리 하 는 데 사 용 됩 니 다.주로 서로 다른 단추 의 CommandName 속성 을 통 해 각각 처리 합 니 다.프론트 데스크 에서 모든 단추 에 해당 하 는 CommandName 속성 값 을 부여 해 야 합 니 다.사용자 가"조회"단 추 를 누 르 면...이 때 는 사용자 가 입력 한 검색 조건 인 Sql 문 구 를 다시 쓰 고 필터 조건 을 추가 해 야 합 니 다.
/// <summary>
/// Click
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void PagerBtnCommand_OnClick(object sender, EventArgs e)
{
CurrentPage = (int)ViewState["PageIndex"];
// ViewState CurrentPage
Pages = (int)ViewState["PagesCount"];// ViewState
Button btn = sender as Button;
string sqlResult="default";
if (btn != null)
{
string cmd = btn.CommandName;
switch (cmd)// CommandName
{
case "next":
CurrentPage++;
break;
case "prev":
CurrentPage--;
break;
case "last":
CurrentPage = Pages;
break;
case "search":
if (!string.IsNullOrEmpty(SearchName.Text))
{
RecordsCount = GetRecordsCount("select count(*) from p_user where username like '" + SearchName.Text + "%'");//
PagesCount = RecordsCount / PAGESIZE + OverPage();//
ViewState["PagesCount"] = RecordsCount / PAGESIZE - ModPage();// , 1
ViewState["PageIndex"] = 0;// 0 ViewState, 0
ViewState["JumpPages"] = PagesCount;
// PageCount ViewState,
// lbPageCount、lbRecordCount
lbPageCount.Text = PagesCount.ToString();
lbRecordCount.Text = RecordsCount.ToString();
//
if (RecordsCount <= 10)
GotoPage.Enabled = false;
sqlResult = "Select Top " + PAGESIZE + "user_serialid,username,displayname,orgcode,orgname from p_user where user_serialid not in(select top " + PAGESIZE * CurrentPage + " user_serialid from p_user order by user_serialid asc) and username like '" + SearchName.Text + "%' order by user_serialid asc";
}
else
{
Response.Write(" !");
}
break;
case "jump":
JumpPage = (int)ViewState["JumpPages"];
// ViewState JumpPage
//
if(Int32.Parse(GotoPage.Text) > JumpPage || Int32.Parse(GotoPage.Text) <= 0)
Response.Write("<script>alert(' !')</script>");
else
{
int InputPage = Int32.Parse(GotoPage.Text.ToString()) - 1;
// int InputPage
ViewState["PageIndex"] = InputPage;
CurrentPage = InputPage;
// InputPage ViewState["PageIndex"]
sqlResult = "Select Top " + PAGESIZE + "user_serialid,username,displayname,orgcode,orgname from p_user where user_serialid not in(select top " + PAGESIZE * CurrentPage + " user_serialid from p_user order by user_serialid asc) and username like '" + SearchName.Text + "%' order by user_serialid asc";
}
break;
default:
CurrentPage = 0;
break;
}
ViewState["PageIndex"] = CurrentPage;
// CurrentPage ViewState
GridViewDataBind(sqlResult);// TDataBind()
}
}
8、btn_Reset_클릭:이 방법 은 주로 리 셋 을 하 는 데 사 용 됩 니 다.사용자 가 한 번 의 조 회 를 마 친 후에 리 셋 을 해 야 다음 조회 작업 을 할 수 있 습 니 다.
protected void btnReset_Click(object sender, EventArgs e)
(
RecordsCount = GetRecordsCount("default");//
PagesCount = RecordsCount / PAGESIZE + OverPage();//
ViewState["PagesCount"] = RecordsCount / PAGESIZE - ModPage();// , 1
ViewState["PageIndex"] = 0;// 0
ViewState["JumpPages"] = PagesCount;
// ,
// lbPageCount、lbRecordCount
lbPageCount.Text = PagesCount.ToString();
lbRecordCount.Text = RecordsCount.ToString();
//
if (RecordsCount <= 10)
{
GotoPage.Enabled = false;
}
GridViewDataBind("default");// TDataBind()
}
여기 서 효율 적 인 페이지 나 누 기 방법 은 주로 select top 10 Id,Name from tb where Id not in(select top 10*N from tb order by Id asc)order by Id asc 를 사용 합 니 다.예 를 들 어 N 은 페이지 수 를 대표 합 니 다.그 전에 원자 에서 도 효율 적 인 페이지 에 관 한 토론 이 많 았 습 니 다.여 기 는 더 이상 말 하지 않 겠 습 니 다.저 는 개인 적 으로 이 페이지 의 문장 효과 가 괜찮다 고 생각 합 니 다.물론 그 밖 에 row 도 있 습 니 다.number()함수 페이지 나 누 기,select Max()페이지 나 누 기 등 방법 이 있 습 니 다.전에 도 정 리 를 한 적 이 있 습 니 다.관심 이 있 는 분 들 은 제 가 전에 쓴 ListView 와 Repeater 의 효율 적 인 페이지 나 누 기 글 을 보 세 요.그 안에 서술 한 것 도 상세 합 니 다.한 걸음 한 걸음 연습 하면 문제 가 크 지 않 을 것 입 니 다.
데이터 바 인 딩 컨트롤 이 없 는 이 유 를 설명해 야 합 니 다.sharepoint 2010 프로젝트 에서 지원 하 는 데이터 원본 컨트롤 은 XMLdataSource 만 있 기 때문에 직접 만 이 루어 집 니 다.
자,오늘 은 여기까지 입 니 다.여러분 에 게 도움 이 되 었 으 면 좋 겠 습 니 다!잘 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
GridView의 데이터를 EXCEL로 내보내기백그라운드에서 데이터 조회 작업을 할 때, 우리는 GridView 컨트롤러를 사용하여 데이터 표시를 할 수 있습니다. 때로는 GridView 컨트롤러에 표시된 데이터를 EXCEL 파일로 내보내야 하고, GridVie...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.