Eric的超高效数据分页(图示+代码)

来源:互联网 发布:个人业务网站源码php 编辑:程序博客网 时间:2024/05/29 03:51
运行截图:

  数据表结构:
  megaid int IDENTITY (1, 1) NOT NULL PRIMARY KEY  CLUSTERED
  megaguid char (36) NOT NULL INDEX

  数据生成脚本:

   DECLARE @i int
  SET @i = 1
  WHILE @i < 1000001
  BEGIN
  INSERT INTO megatable (megaguid) VALUES(NEWID())
  SET @i = @i + 1
  END
  GO


  C#代码:


   DateTime startTime;
  void Page_Init(Object sender, EventArgs e)
  {
  startTime = DateTime.Now;
  }

  protected override void Render(HtmlTextWriter writer) 
  {
  base.Render(writer);
  Response.Write("本页执行时间: "  +  (DateTime.Now - startTime)); 
  } 

  int records = 10000;
  int pages = 10;
  int pageSize = 15;
  SqlConnection conn = new SqlConnection("Server=(local);Database=megadata;User Id=sa;Password=xxx");

  void Page_Load(object sender, EventArgs e)
  {
  if (!IsPostBack)
  {
  dgBind(getSqlString(1));
  }

  int firstPage = int.Parse(hidFirstPage.Value);
  pnlButtons.Controls.Add(getPager(firstPage));
  lblPrompt.Text = "数据提取范围: <B>SELECT TOP " + records.ToString() + " megaid FROM megatable ORDER BY megaguid</B>";
  }

  string getSqlString(int selectedPage)
  {
  string[] idsStrArray;
  string sqlStr;

  if (Session["idStr"] != null)
  {
  idsStrArray = Session["idStr"].ToString().Split('#');
  }
  else
  {
  sqlStr = "SELECT TOP " + records.ToString() + " megaid FROM megatable ORDER BY megaguid";
  SqlCommand cmd = new SqlCommand(sqlStr, conn);
  conn.Open();
  SqlDataReader dr = cmd.ExecuteReader();
  StringBuilder sb = new StringBuilder("");
  int n = 1;

  while (dr.Read())
  {
  if (n % pageSize == 0)
  {
  sb.Append(dr[0].ToString() + "#");
  }
  else
  {
  sb.Append(dr[0].ToString() + ",");
  }
 n++;
  }

  dr.Close();
  conn.Close();
  sb.Remove(sb.Length - 1, 1);
  idsStrArray = sb.ToString().Split('#');
  Session["idStr"] = sb.ToString();
  }

  hidPageCount.Value = idsStrArray.Length.ToString();
  sqlStr = "SELECT megaid, megaguid FROM megatable WHERE megaid IN (" + idsStrArray[selectedPage - 1] + ") ";
  sqlStr += "ORDER BY megaguid";
  return sqlStr;
  }
  
  Panel getPager(int firstPage)
  {
  int pageCount = int.Parse(hidPageCount.Value);
  Panel pnlPager = new Panel();
  pnlPager.Controls.Add(new LiteralControl("<BR> 共" + pageCount.ToString() + "页 "));
  pnlPager.Controls.Add(getLinkButton("Fst", "首页", "pgBtn", "1"));
  pnlPager.Controls.Add(new LiteralControl(" "));

  if (firstPage > 0)
  {
  pnlPager.Controls.Add(getLinkButton("Pre", "前" + pages.ToString() + "页", "pgBtn", (firstPage - pages + 1).ToString()));
  pnlPager.Controls.Add(new LiteralControl(" "));
  }

  for (int i = firstPage + 1; i < firstPage + pages + 1; i++)
  {
  if (i > pageCount)
  {
  break;
  }
  
  pnlPager.Controls.Add(getLinkButton(i.ToString(), "[" + i.ToString() + "]", "pgBtn", i.ToString()));
  pnlPager.Controls.Add(new LiteralControl(" "));
  }

  if (firstPage + pages < pageCount)
  {
  pnlPager.Controls.Add(getLinkButton("Nxt", "后" + pages.ToString() + "页", "pgBtn", (firstPage + pages + 1).ToString()));
  pnlPager.Controls.Add(new LiteralControl(" "));
  }

   pnlPager.Controls.Add(getLinkButton("Lst", "末页", "pgBtn", pageCount.ToString()));
  return pnlPager;
  }

  LinkButton getLinkButton(string lbId, string lbText, string lbCmdName, string lbCmdArg)
  {
  LinkButton lb = new LinkButton();
  lb.ID = lbCmdName + lbId;
  lb.Text = lbText;
  lb.CommandName = lbCmdName;
  lb.CommandArgument = lbCmdArg;
  lb.Command += new CommandEventHandler(pageTurn);
  return lb;
  }
  
  void pageTurn(object sender, CommandEventArgs e)
  {
  LinkButton lb = (LinkButton)sender;
  int selectedPage = int.Parse(lb.CommandArgument);
  int firstPage = selectedPage / pages * pages;
  firstPage = (selectedPage % pages == 0) ? (firstPage - pages) : firstPage;
  hidFirstPage.Value = firstPage.ToString();
  dgBind(getSqlString(selectedPage));
  pnlButtons.Controls.RemoveAt(pnlButtons.Controls.Count - 1);
  pnlButtons.Controls.Add(getPager(firstPage));
  lb = (LinkButton)pnlButtons.Controls[pnlButtons.Controls.Count - 1].FindControl("pgBtn" + selectedPage.ToString());
  lb.Enabled = false;
  }
  
  void dgBind(string sqlStr)
  {
  SqlDataAdapter da = new SqlDataAdapter(sqlStr, conn);
  DataTable dt = new DataTable();
  conn.Open();
  da.Fill(dt);
  conn.Close();
  da.Dispose();
  dg.DataSource = dt;
  dg.DataBind();
  }

  void dg_ItemDataBound(object sender, DataGridItemEventArgs e)
  {
  dg.Controls[0].EnableViewState = false;
  }
   ASPX代码:


   <%@ Import Namespace="System.Text" %>
  <%@ Import Namespace="System.Data.SqlClient" %>
  <%@ Import Namespace="System.Data" %>
  <%@ Page Language="C#" %>
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
  <HTML>
  <HEAD>
  <TITLE>Pager</TITLE>
  <SCRIPT runat="server">
  //插入上面的C#代码
  </SCRIPT>
  <STYLE>BODY {}{ FONT-SIZE: 9pt; FONT-FAMILY: Tahoma,宋体; TEXT-ALIGN: center }
  TD {}{ FONT-SIZE: 9pt; FONT-FAMILY: Tahoma,宋体; TEXT-ALIGN: center }
  </STYLE>
  </HEAD>
  <BODY>
  <FORM id="form1" runat="server">
  <DIV>
  <ASP:LABEL id="lblPrompt" runat="server" text="?" enableviewstate="False" enabletheming="True"></ASP:LABEL>
  <BR>
  <ASP:PANEL id="pnlButtons" runat="server" width="560px">
  <INPUT id="hidFirstPage" type="hidden" value="0" runat="server"><INPUT id="hidPageCount" type="hidden" runat="server">
  <ASP:DATAGRID id="dg" runat="server" width="100%" onitemdatabound="dg_ItemDataBound" cellpadding="4"
  backcolor="White" borderwidth="1px" borderstyle="None" bordercolor="#CC9966" autogeneratecolumns="False"
  pagesize="5">
  <FOOTERSTYLE forecolor="#330099" backcolor="#FFFFCC"></FOOTERSTYLE>
  <HEADERSTYLE font-bold="True" forecolor="#FFFFCC" backcolor="#990000"></HEADERSTYLE>
  <PAGERSTYLE horizontalalign="Center" forecolor="#330099" backcolor="#FFFFCC"></PAGERSTYLE>
  <SELECTEDITEMSTYLE font-bold="True" forecolor="#663399" backcolor="#FFCC66"></SELECTEDITEMSTYLE>
  <ITEMSTYLE forecolor="#330099" backcolor="White"></ITEMSTYLE>
  <COLUMNS>
  <ASP:BOUNDCOLUMN datafield="megaid" headertext="MegaID"></ASP:BOUNDCOLUMN>
  <ASP:BOUNDCOLUMN datafield="megaguid" headertext="MegaGUID"></ASP:BOUNDCOLUMN>
  </COLUMNS>
  </ASP:DATAGRID>
  </ASP:PANEL></DIV>
  <BR>
  <ASP:HYPERLINK id="lnkReload" runat="server" width="80px" navigateurl="Pager.aspx" enableviewstate="False">重载</ASP:HYPERLINK>
  </FORM>
  </BODY>
  </HTML>

原创粉丝点击