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 만 있 기 때문에 직접 만 이 루어 집 니 다.
자,오늘 은 여기까지 입 니 다.여러분 에 게 도움 이 되 었 으 면 좋 겠 습 니 다!잘 부탁드립니다!

좋은 웹페이지 즐겨찾기