一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

千万级数据分页之三----实现设计时支持和数字分页

时间:2008-04-26 编辑:简简单单 来源:一聚教程网

一。对上一版本源代码的修正

上一篇文章发布了一个分页控件的源码,但是这个分页控件的设计时支持不太好,出现了“未处理的异常,输入字符串的格式不正确”的错误,如下图所示:

原因是一下代码引起的异常:

int pageCount = int.Parse(_lblPageCount.Text); //获取总页数

修改为以下代码后即显示正常,如图所示:

 



 if (_lblPageCount.Text == "")
                
{
                    _lnkbtnLast.Enabled 
= false;
                }

                
else
                
{
                    
int pageCount = int.Parse(_lblPageCount.Text); //获取总页数
                    if (PageIndex == pageCount)//如果当前页为最后一页,则末页灰显
                    {
                        _lnkbtnLast.Enabled 
= false;
                    }

                    
else
                    
{
                        _lnkbtnLast.Enabled 
= true;
                    }

                }

二、增加“自动套用格式”:

代码如下:

继承DesignerAutoFormat类,重写Apply(Control control)方法,实现两种样式,分别是“英文样式”和“符号样式”。



using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Web.UI;
using System.Web;
using System.Web.UI.Design;
using System.Web.UI.Design.WebControls;
using System.Web.UI.WebControls;
using System.Drawing;
namespace CustomControls
{
    
public class AspNetPagerAutoFormat : DesignerAutoFormat
    
{
        
public AspNetPagerAutoFormat(string name) : base(name) { }
        
public override void Apply(Control control)
        
{
            
if (control is AspNetPager)
            
{
                AspNetPager aspNetPager 
= (AspNetPager)control;
                
if (this.Name == "英文样式")
                
{
                    aspNetPager.ButtonText 
= "Go";
                    aspNetPager.FirstPageText 
= "First";
                    aspNetPager.PrePageText 
= "Prev";
                    aspNetPager.NextPageText 
= "Next";
                    aspNetPager.EndPageText 
= "End";
                    aspNetPager.LabelStyle.ForeColor 
= Color.Blue;
                    aspNetPager.LabelStyle.Font.Bold 
= true;
                    aspNetPager.TextBoxStyle.CssClass 
= "blue_rounded";
                    aspNetPager.TextBoxStyle.Width 
= Unit.Parse("50px");
                    aspNetPager.PageSize 
= 20;
                    aspNetPager.RecordCount 
= 0;
                }

                
else if (this.Name == "符号样式")
                
{
                    aspNetPager.ButtonText 
= "转到";
                    aspNetPager.FirstPageText 
= "9";
                    aspNetPager.PrePageText 
= "7";
                    aspNetPager.NextPageText 
= "8";
                    aspNetPager.EndPageText 
= ":";
                    aspNetPager.LabelStyle.ForeColor 
= Color.Red;
                    aspNetPager.LabelStyle.Font.Bold 
= true;
                    aspNetPager.TextBoxStyle.CssClass 
= "blue_rounded";
                    aspNetPager.TextBoxStyle.Width 
= Unit.Parse("40px");
                    aspNetPager.PageSize 
= 40;
                }

            }

            
else
            
{
                
throw new Exception("The method or operation is not implemented.");
            }

        }

    }

}

其中套用”英文样式后效果如下:

套用“字符样式后效果如下:

三、数字分页效果的实现:

首先定义十个LinkButton,如下代码所示:

 



        private LinkButton _page_0;
        
private LinkButton _page_1;
        
private LinkButton _page_2;
        
private LinkButton _page_3;
        
private LinkButton _page_4;
        
private LinkButton _page_5;
        
private LinkButton _page_6;
        
private LinkButton _page_7;
        
private LinkButton _page_8;
        
private LinkButton _page_9;

在CreateChildControls()方法中生成这些控件,并定义一个共同的点击事件“BtnChangePage_Click”,

 



 _page_0 = new LinkButton();
            _page_0.ID 
= "_page_0";
            _page_0.Click 
+= new EventHandler(CurrentPage_Click);
            _page_1 
= new LinkButton();
            _page_1.ID 
= "_page_1";
            _page_1.Click 
+= new EventHandler(CurrentPage_Click);
            _page_2 
= new LinkButton();
            _page_2.ID 
= "_page_2";
            _page_2.Click 
+= new EventHandler(CurrentPage_Click);
            _page_3 
= new LinkButton();
            _page_3.ID 
= "_page_3";
            _page_3.Click 
+= new EventHandler(CurrentPage_Click);
            _page_4 
= new LinkButton();
            _page_4.ID 
= "_page_4";
            _page_4.Click 
+= new EventHandler(CurrentPage_Click);
            _page_5 
= new LinkButton();
            _page_5.ID 
= "_page_5";
            _page_5.Click 
+= new EventHandler(CurrentPage_Click);
            _page_6 
= new LinkButton();
            _page_6.ID 
= "_page_6";
            _page_6.Click 
+= new EventHandler(CurrentPage_Click);
            _page_7 
= new LinkButton();
            _page_7.ID 
= "_page_7";
            _page_7.Click 
+= new EventHandler(CurrentPage_Click);
            _page_8 
= new LinkButton();
            _page_8.ID 
= "_page_8";
            _page_8.Click 
+= new EventHandler(CurrentPage_Click);
            _page_9 
= new LinkButton();
            _page_9.ID 
= "_page_9";
            _page_9.Click 
+= new EventHandler(CurrentPage_Click);
            _txtPageIndex 
= new TextBox();
            _txtPageIndex.ID 
= "txtPageIndex";
            _lblPageSize 
= new Label();
            _lblPageSize.ID 
= "lblPageSize";
            
this.Controls.Add(_page_0);
            
this.Controls.Add(_page_1);
            
this.Controls.Add(_page_2);
            
this.Controls.Add(_page_3);
            
this.Controls.Add(_page_4);
            
this.Controls.Add(_page_5);
            
this.Controls.Add(_page_6);
            
this.Controls.Add(_page_7);
            
this.Controls.Add(_page_8);
            
this.Controls.Add(_page_9);

CurrentPage_Click事件的代码:

 



 protected void CurrentPage_Click(object sender, EventArgs e)
        
{
            
string strID = ((LinkButton)sender).ID;
            
if (strID != "")
            
{
                
int pageIndex = 0;
                
int pageNum = PageIndex / 10;
                
try
                
{
                    
int pageNum2 = int.Parse(strID.Split(''_'')[2]);
                    
if (pageNum2 == 0)
                        pageNum2 
= 10;
                    pageIndex 
= pageNum2 + pageNum*10;
                }

                
catch
                
{
                    System.Web.HttpContext.Current.Response.Write(
"");
                    
return;
                }

                _lblCurrentPage.Text 
= pageIndex.ToString();
                OnPageChanged(EventArgs.Empty);
            }

        }

然后绘制控件,根据总页数和当前页码显示10个数字页,比如当前页是23页,则显示21到30共十个页的页码。

 



if (_lblPageCount.Text == "")
            
{
                
for (int i = 0; i < 10; i++)
                
{
                    LinkButton lb 
= (LinkButton)this.FindControl("_page_" + i.ToString());
                    lb.Enabled 
= false;
                    lb.Text 
= (i + 1).ToString();
                    lb.RenderControl(writer);
                    writer.Write(
" ");

                }

            }

            
else
            
{
                
int pageCount = int.Parse(_lblPageCount.Text);
                
int quot = PageIndex / 10;
                
int rema = PageIndex % 10;
                
//PageNum = quot * 10;
                if (pageCount < 10 || pageCount - PageIndex < 10)
                
{
                    
for (int i = quot * 10 + 1; i <= pageCount; i++)
                    
{
                        LinkButton lb2 
= (LinkButton)this.FindControl("_page_" + (i % 10).ToString());
                        lb2.Text 
= i.ToString();
                        
if (i == PageIndex)
                        
{
                            lb2.Enabled 
= false;
                            lb2.Font.Bold 
= true;
                            lb2.ForeColor 
= Color.Red;
                        }

                        
else
                        
{
                            lb2.Enabled 
= true;
                        }

                        lb2.RenderControl(writer);
                        writer.Write(
" ");
                    }

                }

                
else
                
{
                    
for (int i = quot * 10 + 1; i <= quot * 10 + 10; i++)
                    
{
                        LinkButton lb2 
= (LinkButton)this.FindControl("_page_" + (i % 10).ToString());
                        lb2.Text 
= i.ToString();
                        
if (i == PageIndex)
                        
{
                            lb2.Enabled 
= false;
                            lb2.Font.Bold 
= true;
                            lb2.ForeColor 
= Color.Red;
                        }

                        
else
                        
{
                            lb2.Enabled 
= true;
                        }

                        lb2.RenderControl(writer);
                        writer.Write(
" ");
                    }

                }

            }

设计时效果如下图所示:

分页效果如下:

控件的源码如下:

 



using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Drawing;

namespace CustomControls
{
    [Designer(
typeof(AspNetPagerDesigner)),ToolboxData("<{0}:AspNetPager runat=''server'' PageSize=''25'' FirstPageText=''首页'' PrePageText=''上一页'' NextPageText=''下一页'' EndPageText=''末页'' ButtonText=''GO''>")]
    
public class AspNetPager : WebControl, INamingContainer
    
{
 &

热门栏目