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

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

上一篇文章《 千万级数据分页之二---一个简单的自定义分页控件》发布了一个分页控件的源码,但是这个分页控件的设计时支持不太好,出现了“未处理的异常,输入字符串的格式不正确”的错误,如下图所示:

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

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;
                    }

                }

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

一个设计完善友好的控件离不开设计时支持,其中ControlDesigner作为web服务器控件的设计器的基类,通过继承此类,你可以实现需要的设计时效果。如果你要继承类似Label这样的控件,可以通过继承LabelDesigner来实现相应的功能。而要实现”自动套用格式“,就要继承DesignerAutoFormat类,实现自定义样式。DesignerAutoFormat 是一个基类,如果你想为你的控件在设计时提供格式化的功能,你可以从此类派生,你必须实现Apply方法,此方法会将相关联的控件设置样式.

继承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 
= "<font face=webdings color="red">9</font>";
                    aspNetPager.PrePageText 
= "<font face=webdings color="red">7</font>";
                    aspNetPager.NextPageText 
= "<font face=webdings color="red">8</font>";
                    aspNetPager.EndPageText 
= "<font face=webdings color="red">:</font>";
                    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.");
            }

        }

    }

}

继承ControlDesigner类,重写AutoFormats属性以实现自定义“自动套用格式”,其中给AspNetPagerDesigner类加上加上SupportsPreviewControl元数据,这样可以支持预览功能:

 

using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.Web;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.ComponentModel;
using  System.Web.UI.Design;
namespace  CustomControls
{
    [SupportsPreviewControl(
true)]
    
public class AspNetPagerDesigner : ControlDesigner
    
{
        
private DesignerAutoFormatCollection _dafc;
        
public override DesignerAutoFormatCollection AutoFormats
        
{
            
get
            
{
                
if (_dafc == null)
                
{
                    _dafc 
= new DesignerAutoFormatCollection();
                    _dafc.Add(
new AspNetPagerAutoFormat("英文样式"));
                    _dafc.Add(
new AspNetPagerAutoFormat("符号样式"));
                }

                
return _dafc;
            }

        }

    }

}

下面是设计时效果,把鼠标移动到控件上方,右上角就会出现一个黑三角,点击该三角,出现一个任务栏,点击“自动套用格式”,就会出现“自动套用格式”对话框,选取左边列表的任意一个样式,点确定即可。

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

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

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

首先定义十个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(
"<Script>alert('非法的页码!');</script>");
                    
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(
"&nbsp;");

                }

            }

            
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(
"&nbsp;");
                    }

                }

                
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(
"&nbsp;");
                    }

                }

            }

设计时效果如下图所示:

分页效果如下:

控件的源码如下:

 

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'></{0}:AspNetPager>")]
    
public class AspNetPager : WebControl, INamingContainer
    
{
        
属性块

        
分页事件相关

        
样式属性

        
自定义视图状态

        
生成控件

        
按钮点击事件

        
重写TagKey

        
绘制控件
    }

}

评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值