专注于技术 心无旁骛 - justforfan528

Linux技术| 网络编程coding | 网络安全Cyber Security | study |

 

导航

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

数据表结构:
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 
- 11);
                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>

posted on 2007-10-16 08:18  游荡者  阅读(412)  评论(0编辑  收藏  举报