zoukankan      html  css  js  c++  java
  • (转)C#高效分页代码(不用存储过程)

    摘要:文章:C#高效分页代码(不用存储过程) 摘要:首先创建一张表(要求ID自动编号):createtableredheadedfile(idintidentity(1,1,发表于北京联高软件有限公司技术文章栏目,代码以高亮显示。
    关键字:过程, 存储, 代码, 高效, gt, system, web, int, viewstate, ui, id, currentpage, webcontrols, pages, this, linkbutton, using, gotopage, 数据


    首先创建一张表(要求ID自动编号):

    create table redheadedfile
    (
       id int identity(1,1),
       filenames nvarchar(50),
       senduser nvarchar(50),
       primary key(id)
    )

    然后我们写入50万条记录:

    declare @i int
    set @i=1
    while @i<=500000
    begin
        insert into redheadedfile(filenames,senduser) values("高效分页算法测试数据" + str(i) ,"北京联高软件开发有限公司")
    set @i=@i+1
    end
    GO

    用Microsoft Visual Studio .NET 2005创建一张WebForm网页。
    前台代码片段如下(webform8.aspx):
    < %@ Page language="c#" Codebehind="WebForm8.aspx.cs" AutoEventWireup="false" Inherits="WebApplication6.WebForm8" %>
    < !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
    < HTML>
    < HEAD>
    < title>WebForm8</title>
    < meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
    < meta content="C#" name="CODE_LANGUAGE">
    < meta content="javascript" name="vs_defaultClientScript">
    < meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
    < /HEAD>
    < body MS_POSITIONING="GridLayout">
    < form id="Form1" method="post" runat="server">
    < asp:datalist id="datalist1" AlternatingItemStyle-BackColor="#f3f3f3" Width="100%" CellSpacing="0" CellPadding="0" Runat="server">
    < ItemTemplate>
    < table width="100%" border="0" cellspacing="0" cellpadding="0">
    < tr>
    < td width="30%" align="center"><%#DataBinder.Eval(Container.DataItem,"filenames")%></td>
    < td width="30%" align="center"><%#DataBinder.Eval(Container.DataItem,"senduser")%></td>
    < td width="30%" align="center"><%#DataBinder.Eval(Container.DataItem,"id")%></td>
    < /tr>
    < /table>
    < /ItemTemplate>
    < /asp:datalist>
    < div align="center">共<asp:label id="LPageCount" Runat="server" ForeColor="#ff0000"></asp:label>页/共
    <asp:label id="LRecordCount" Runat="server" ForeColor="#ff0000"></asp:label>记录
    <asp:linkbutton id="Fistpage" Runat="server" CommandName="0">首页</asp:linkbutton>   
    < asp:linkbutton id="Prevpage" Runat="server" CommandName="prev">上一页</asp:linkbutton>   
    < asp:linkbutton id="Nextpage" Runat="server" CommandName="next">下一页</asp:linkbutton>   
    < asp:linkbutton id="Lastpage" Runat="server" CommandName="last">尾页</asp:linkbutton>   
    当前第<asp:label id="LCurrentPage" Runat="server" ForeColor="#ff0000"></asp:label>页   
    跳页<asp:TextBox ID="gotoPage" Runat="server" Width="30px" MaxLength="5" AutoPostBack="True"></asp:TextBox>
    < /div>
    < /form>
    < /body>
    < /HTML>

    后台代码片段如下(webform8.aspx.cs)

    1. using System; 
    2. using System.Collections; 
    3. using System.ComponentModel; 
    4. using System.Data; 
    5. using System.Drawing; 
    6. using System.Web; 
    7. using System.Web.SessionState; 
    8. using System.Web.UI; 
    9. using System.Web.UI.WebControls; 
    10. using System.Web.UI.HtmlControls; 
    11. using System.Data.SqlClient; 
    12. using System.Configuration; 
    13. namespace WebApplication6 
    14.     /// <summary> 
    15.     /// WebForm8 的摘要说明。 
    16.     /// </summary> 
    17.     public class WebForm8 : System.Web.UI.Page 
    18.     { 
    19.         protected System.Web.UI.WebControls.LinkButton Fistpage; 
    20.         protected System.Web.UI.WebControls.LinkButton Prevpage; 
    21.         protected System.Web.UI.WebControls.LinkButton Nextpage; 
    22.         protected System.Web.UI.WebControls.LinkButton Lastpage; 
    23.         protected System.Web.UI.WebControls.DataList datalist1; 
    24.         protected System.Web.UI.WebControls.DropDownList mydroplist; 
    25.         protected System.Web.UI.WebControls.Label LPageCount; 
    26.         protected System.Web.UI.WebControls.Label LRecordCount; 
    27.         protected System.Web.UI.WebControls.Label LCurrentPage; 
    28.         protected System.Web.UI.WebControls.TextBox gotoPage; 
    29.         //定义每页显示记录 
    30.         const int PageSize = 20; 
    31.         //定义几个保存分页参数变量 
    32.         int PageCount, RecCount, CurrentPage, Pages, JumpPage; 
    33.         private void Page_Load(object sender, System.EventArgs e) 
    34.         { 
    35.             if (!IsPostBack) 
    36.             { 
    37.                 //通过Calc()函数获取总记录数 
    38.                 RecCount = Calc(); 
    39.                 //计算总页数(加上OverPage()函数防止有余数造成显示数据不完整) 
    40.                 PageCount = RecCount / PageSize + OverPage(); 
    41.                 //保存总页参数到ViewState(减去ModPage()函数防止SQL语句执行时溢出查询范围,可以用存储过程分页算法来理解这句) 
    42.                 ViewState["PageCounts"] = RecCount / PageSize - ModPage(); 
    43.                 //保存一个为0的页面索引值到ViewState 
    44.                 ViewState["PageIndex"] = 0; 
    45.                 //保存PageCount到ViewState,跳页时判断用户输入数是否超出页码范围 
    46.                 ViewState["JumpPages"] = PageCount; 
    47.                 //显示LPageCount、LRecordCount的状态 
    48.                 LPageCount.Text = PageCount.ToString(); 
    49.                 LRecordCount.Text = RecCount.ToString(); 
    50.                 //判断跳页文本框失效 
    51.                 if (RecCount <= 20) 
    52.                 { 
    53.                     gotoPage.Enabled = false
    54.                 } 
    55.                 //调用数据绑定函数TDataBind()进行数据绑定运算 
    56.                 TDataBind(); 
    57.             } 
    58.         } 
    59.         //计算余页 
    60.         public int OverPage() 
    61.         { 
    62.             int pages = 0; 
    63.             if (RecCount % PageSize != 0) 
    64.                 pages = 1; 
    65.             else 
    66.                 pages = 0; 
    67.             return pages; 
    68.         } 
    69.         //计算余页,防止SQL语句执行时溢出查询范围 
    70.         public int ModPage() 
    71.         { 
    72.             int pages = 0; 
    73.             if (RecCount % PageSize == 0 && RecCount != 0) 
    74.                 pages = 1; 
    75.             else 
    76.                 pages = 0; 
    77.             return pages; 
    78.         } 
    79.         // 计算总记录的静态函数 
    80.         // 本人在这里使用静态函数的理由是:如果引用的是静态数据或静态函数, 
    81.         // 连接器会优化生成代码,去掉动态重定位项(对海量数据表分页效果更明显)。 
    82.         // 希望大家给予意见、如有不正确的地方望指正。 
    83.         public static int Calc() 
    84.         { 
    85.             int RecordCount = 0; 
    86.             SqlCommand MyCmd = new SqlCommand("select count(*) as co from redheadedfile", MyCon()); 
    87.             SqlDataReader dr = MyCmd.ExecuteReader(); 
    88.             if (dr.Read()) 
    89.                 RecordCount = Int32.Parse(dr["co"].ToString()); 
    90.             MyCmd.Connection.Close(); 
    91.             return RecordCount; 
    92.         } 
    93.         //数据库连接语句(从Web.Config中获取) 
    94.         public static SqlConnection MyCon() 
    95.         { 
    96.             SqlConnection MyConnection = new SqlConnection(ConfigurationSettings.AppSettings["DSN"]); 
    97.             MyConnection.Open(); 
    98.             return MyConnection; 
    99.         } 
    100.         //对四个按钮(首页、上一页、下一页、尾页)返回的CommandName值进行操作 
    101.         private void Page_OnClick(object sender, CommandEventArgs e) 
    102.         { 
    103.             //从ViewState中读取页码值保存到CurrentPage变量中进行参数运算 
    104.             CurrentPage = (int)ViewState["PageIndex"]; 
    105.             //从ViewState中读取总页参数运算 
    106.             Pages = (int)ViewState["PageCounts"]; 
    107.             string cmd = e.CommandName; 
    108.             //筛选CommandName 
    109.             switch (cmd) 
    110.             { 
    111.                 case "next"
    112.                     CurrentPage++; 
    113.                     break
    114.                 case "prev"
    115.                     CurrentPage--; 
    116.                     break
    117.                 case "last"
    118.                     CurrentPage = Pages; 
    119.                     break
    120.                 default
    121.                     CurrentPage = 0; 
    122.                     break
    123.             } 
    124.             //将运算后的CurrentPage变量再次保存至ViewState 
    125.             ViewState["PageIndex"] = CurrentPage; 
    126.             //调用数据绑定函数TDataBind() 
    127.             TDataBind(); 
    128.         } 
    129.         private void TDataBind() 
    130.         { 
    131.             //从ViewState中读取页码值保存到CurrentPage变量中进行按钮失效运算 
    132.             CurrentPage = (int)ViewState["PageIndex"]; 
    133.             //从ViewState中读取总页参数进行按钮失效运算 
    134.             Pages = (int)ViewState["PageCounts"]; 
    135.             //判断四个按钮(首页、上一页、下一页、尾页)状态 
    136.             if (CurrentPage + 1 > 1) 
    137.             { 
    138.                 Fistpage.Enabled = true
    139.                 Prevpage.Enabled = true
    140.             } 
    141.             else 
    142.             { 
    143.                 Fistpage.Enabled = false
    144.                 Prevpage.Enabled = false
    145.             } 
    146.             if (CurrentPage == Pages) 
    147.             { 
    148.                 Nextpage.Enabled = false
    149.                 Lastpage.Enabled = false
    150.             } 
    151.             else 
    152.             { 
    153.                 Nextpage.Enabled = true
    154.                 Lastpage.Enabled = true
    155.             } 
    156.             //数据绑定到DataList控件 
    157.             DataSet ds = new DataSet(); 
    158.             //核心SQL语句,进行查询运算(决定了分页的效率:)) 
    159.             SqlDataAdapter MyAdapter = new SqlDataAdapter("Select Top " + PageSize + " * from redheadedfile where id not in(select top " + PageSize * CurrentPage + " id from redheadedfile order by id asc) order by id asc", MyCon()); 
    160.             MyAdapter.Fill(ds, "news"); 
    161.             datalist1.DataSource = ds.Tables["news"].DefaultView; 
    162.             datalist1.DataBind(); 
    163.             //显示Label控件LCurrentPaget和文本框控件gotoPage状态 
    164.             LCurrentPage.Text = (CurrentPage + 1).ToString(); 
    165.             gotoPage.Text = (CurrentPage + 1).ToString(); 
    166.             //释放SqlDataAdapter 
    167.             MyAdapter.Dispose(); 
    168.         } 
    169.         #region Web 窗体设计器生成的代码 
    170.         override protected void OnInit(EventArgs e) 
    171.         { 
    172.             // 
    173.             // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。 
    174.             // 
    175.             InitializeComponent(); 
    176.             base.OnInit(e); 
    177.         } 
    178.         /// <summary> 
    179.         /// 设计器支持所需的方法 - 不要使用代码编辑器修改 
    180.         /// 此方法的内容。 
    181.         /// </summary> 
    182.         private void InitializeComponent() 
    183.         { 
    184.             this.Fistpage.Command += new System.Web.UI.WebControls.CommandEventHandler(this.Page_OnClick); 
    185.             this.Prevpage.Command += new System.Web.UI.WebControls.CommandEventHandler(this.Page_OnClick); 
    186.             this.Nextpage.Command += new System.Web.UI.WebControls.CommandEventHandler(this.Page_OnClick); 
    187.             this.Lastpage.Command += new System.Web.UI.WebControls.CommandEventHandler(this.Page_OnClick); 
    188.             this.gotoPage.TextChanged += new System.EventHandler(this.gotoPage_TextChanged); 
    189.             this.Load += new System.EventHandler(this.Page_Load); 
    190.         } 
    191.         #endregion 
    192.         //跳页代码 
    193.         private void gotoPage_TextChanged(object sender, System.EventArgs e) 
    194.         { 
    195.             try 
    196.             { 
    197.                 //从ViewState中读取可用页数值保存到JumpPage变量中 
    198.                 JumpPage = (int)ViewState["JumpPages"]; 
    199.                 //判断用户输入值是否超过可用页数范围值 
    200.                 if (Int32.Parse(gotoPage.Text) > JumpPage || Int32.Parse(gotoPage.Text) <= 0) 
    201.                 { 
    202.                     Response.Write("<script>alert("页码范围越界!");location.href="WebForm8.aspx"</script>"); 
    203.                 } 
    204.                 else 
    205.                 { 
    206.                     //转换用户输入值保存在int型InputPage变量中 
    207.                     int InputPage = Int32.Parse(gotoPage.Text.ToString()) - 1; 
    208.                     //写入InputPage值到ViewState["PageIndex"]中 
    209.                     ViewState["PageIndex"] = InputPage; 
    210.                     //调用数据绑定函数TDataBind()再次进行数据绑定运算 
    211.                     TDataBind(); 
    212.                 } 
    213.             } 
    214.             //捕获由用户输入不正确数据类型时造成的异常 
    215.             catch (Exception eXP) 
    216.             { 
    217.                 Response.Write("<script>alert("" + exp.Message + "");location.href="WebForm8.aspx"</script>"); 
    218.             } 
    219.         } 
    220.     } 
  • 相关阅读:
    Spring Batch 之 Sample(XML文件操作)(五)
    Spring Batch 之 Spring Batch 简介(一)
    Spring Batch 之 Sample(固定长格式文件读写)(六)
    Spring Batch 之 Sample(复合格式文件的读、多文件的写)(七)
    bat调用jar包的两个典型问题
    Spring Batch 之 Sample(Hello World)(三)
    开园大吉
    js中createElement方法的兼容性
    Struts2中关于"There is no Action mapped for namespace / and action name"的总结
    Spring Batch 之 框架流程简单介绍(二)
  • 原文地址:https://www.cnblogs.com/wangyt223/p/2716069.html
Copyright © 2011-2022 走看看