首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 认证考试-> Cisco认证
一个相当独立的.通用分页控件c#源码四-.NET教程,C#语言
作者:网友供稿 点击:113
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
public class defaultpagerlayout:itemplate
{
private imagebutton next;
private imagebutton first;
private imagebutton last;
private imagebutton previous;
private panel pager;

public defaultpagerlayout()
{
next = new imagebutton();
first = new imagebutton();
last = new imagebutton();
previous = new imagebutton();
pager = new panel();

next.id="next"; next.alternatetext="下一页";next.imageurl="play2.gif";
first.id="first"; first.alternatetext="首页";first.imageurl="play2l_dis.gif";
last.id = "last"; last.alternatetext ="末页";last.imageurl="play2_dis.gif";
previous.id="previous"; previous.alternatetext="上一页";previous.imageurl="play2l.gif";
pager.id="pager";
}
public void instantiatein(control control)
{
control.controls.clear();
table table = new table();
table.borderwidth = unit.pixel(0);
table.cellspacing= 1;
table.cellpadding =0;
tablerow row = new tablerow();
row.verticalalign = verticalalign.top;
table.rows.add(row);
tablecell cell = new tablecell();
cell.horizontalalign = horizontalalign.right;
cell.verticalalign = verticalalign.middle;
cell.controls.add(first);
cell.controls.add(previous);
row.cells.add(cell);
cell = new tablecell();
cell.horizontalalign= horizontalalign.center;
cell.controls.add(pager);
row.cells.add(cell);
cell = new tablecell();
cell.verticalalign = verticalalign.middle;
cell.controls.add(next);
cell.controls.add(last);
row.cells.add(cell);

control.controls.add(table);
}
}

  defaultpagerlayout通过编程的方式提供了所有的导航元素,并将它们加入到aspx页面,不过这一次导航元素用标准的html表格设置了格式。现在,如果用户没有提供一个表现模板,程序将自动提供一个默认的模板。

[templatecontainer(typeof(layoutcontainer))]
public itemplate layout
{
get{return (_layout == null)? new defaultpagerlayout():_layout;}
set{_layout =value;}
}

  下面再来看看生成各个页面编号的过程。分页控件首先需要确定一些属性值,通过这些属性值来确定要生成多少不同的页面编号。

public int currentpage
{
get
{
string cur = (string)viewstate["currentpage"];
return (cur == string.empty || cur ==null)? 1 : int.parse(cur);
}
set
{
viewstate["currentpage"] = value.tostring();}
}

public int pagerstoshow
{
get{return _results;}
set{_results = value;}
}

public int resultstoshow
{
get{return _resultsperpage;}
set{_resultsperpage = value;}
}

  currentpage保存的实际上是页面编号的viewstate中的当前页面,pagerstoshow方法定义的属性允许用户指定要显示多少页面,而resultstoshow定义的属性则允许用户指定每页要显示多少记录,默认值是10。

  numberofpagerstogenerate返回当前应当生成的页面编号的数量。

private int pagersequence
{
get
{
return convert.toint32
(math.ceiling((double)currentpage/(double)pagerstoshow));}
}

private int numberofpagerstogenerate
{
get{return pagersequence*pagerstoshow;}
}

private int totalpagestoshow
{
get{return convert.toint32(math.ceiling((double)totalresults/(double)_resultsperpage));}
}
public int totalresults
{
get{return _builder.adapter.totalcount;}
}

  totalpagestoshow方法返回要显示的总页面数量,由用户预设的resultstoshow属性调整。
  虽然asp.net定义了一些默认的样式,不过对于分页控件的用户它们可能不是很实用。用户可以通过自定义样式来调整分页控件的外观。

public style unselectedpagerstyle {get {return unselectedpager;}}
public style selectedpagerstyle {get {return selectedpager;}}

  unselectedpagerstyle提供了页面编号未选中时所用的样式,而selectedpagerstyle提供了页面编号被选中时所用的样式。

private void generatepagers(webcontrol control)
{
control.controls.clear();
int pager = (pagersequence-1)* pagerstoshow +1;

for (;pager<=numberofpagerstogenerate && pager<=totalpagestoshow;pager++)
{
linkbutton link = new linkbutton();
link.text = pager.tostring();
link.id = pager.tostring();
link.click += new eventhandler(this.pager_click);
if (link.id.equals(currentpage.tostring()))
link.mergestyle(selectedpagerstyle);
else
link.mergestyle(unselectedpagerstyle);

control.controls.add(link);
control.controls.add(new literalcontrol(" "));
}
}

private void generatepagers()
{
generatepagers(holder);
}


   generatepagers方法动态地创建所有页面编号,页面编号是linkbutton类型的按钮。各个页面编号的标签和id属性通过循环赋值,同 时,点击事件被绑定到适当的事件句柄。最后,页面编号被加入到一个容器控件——在本例中是一个panel对象。按钮id起到了标识哪一个按钮触发点击事件 的作用。下面是事件句柄的定义:

private void pager_click(object sender, system.eventargs e)
{
linkbutton button = (linkbutton) sender;
currentpage = int.parse(button.id);
raiseevent(pagechanged, this,new pagechangedeventargs(currentpage,pagedeventinvoker.pager));
update();
}

private void next_click(object sender, system.web.ui.imageclickeventargs e)
{
if (currentpage<totalpagestoshow)
currentpage++;
raiseevent(pagechanged, this,new pagechangedeventargs(currentpage,pagedeventinvoker.next));
update();
}

private void previous_click(object sender, system.web.ui.imageclickeventargs e)
{
if (currentpage > 1)
currentpage--;
raiseevent(pagechanged, this,new pagechangedeventargs(currentpage,pagedeventinvoker.previous));
update();
}
private void first_click(object sender, system.web.ui.imageclickeventargs e)
{
currentpage = 1;
raiseevent(pagechanged, this,new pagechangedeventargs(currentpage,pagedeventinvoker.first));
update();
}

private void last_click(object sender, system.web.ui.imageclickeventargs e)
{
currentpage = totalpagestoshow;
raiseevent(pagechanged, this,new pagechangedeventargs(currentpage,pagedeventinvoker.last));
update();
}

  这些事件句柄都相似,它们首先更改分页控件的当前页面,然后刷新绑定的控件。

private void update()
{
if (!hasparentcontrolcalleddatabinding) return;
applydatasensitivityrules();
bindparent();
boundcontrol.databind();
}

   首先,分页控件通过调用hasparentcontrolcalleddatabinding方法检查是否已经初始化了必要的适配器。如果是,则将前面 指出的根据数据显示情况自动调整控件的规则应用到当前的控件,这些规则使得分页控件根据boundcontrol中数据的不同情况表现出不同的行为。虽然 这些规则由分页控件内部控制,但必要时可以用[gof] state模式方便地移出到控件之外。

public bool isdatasensitive
{
get{return _isdatasensitive;}
set{_isdatasensitive = value;}
}

private bool ispagervisible
{
get{return (totalpagestoshow != 1) && isdatasensitive;}
}

private bool ispreviousvisible
{
get
{
return (!isdatasensitive)? true:
(currentpage != 1);
}
}

private bool isnextvisible
{
get
{
return (!isdatasensitive)? true:
(currentpage != totalpagestoshow);
}
}

private void applydatasensitivityrules()
{
firstbutton.visible = ispreviousvisible;
previousbutton.visible = ispreviousvisible;
lastbutton.visible = isnextvisible;
nextbutton.visible = isnextvisible;
if (ispagervisible) generatepagers();
}

   applydatasensitivityrules方法实施预定义的规则,诸如ispagervisible、ispreviousvisible和 isnextvisible。默认情况下,分页控件将启用这些规则,但用户可以通过设置isdatasensitive属性来关闭这些规则。

  至此为止,分页控件的显示部分基本设计完毕。最后剩下的结束工作是提供几个事件句柄,使得用户能够在各种分页控件事件出现时进行必要的调整。

public delegate void pagedelegate(object sender,pagechangedeventargs e);

public enum pagedeventinvoker{next,previous,first,last,pager}

public class pagechangedeventargs:eventargs
{
private int newpage;
private enum invoker;

public pagechangedeventargs(int newpage):base()
{
this.newpage = newpage;
}
public pagechangedeventargs(int newpage,pagedeventinvoker invoker)
{
this.newpage = newpage;
this.invoker = invoker;
}
public int newpage {get{return newpage;}}
public enum eventinvoker{get{return invoker;}}
}


   由于分页控件需要返回自定义的事件参数,所以我们定义了一个专用的pagechangedeventargs类。 pagechangedeventargs类返回pagedeventinvoker类型,pagedeventinvoker类型是可能触发事件的控件 的枚举量。为了处理自定义的事件参数,我们定义了一个新的delegate,即pagedelegate。事件按照下面的形式定义:

public event pagedelegate pagechanged;
public event eventhandler dataupdate;

  当事件没有对应的事件监听器时,asp.net会抛出一个异常。分页控件定义了下列raiseevent方法。

private void raiseevent(eventhandler e,object sender)
{
this.raiseevent(e,this,null);
}

private void raiseevent(eventhandler e,object sender, pagechangedeventargs args)
{
if(e!=null)
{
e(sender,args);
}
}
private void raiseevent(pagedelegate e,object sender)
{
this.raiseevent(e,this,null);
}

private void raiseevent(pagedelegate e,object sender, pagechangedeventargs args)
{
if(e!=null)
{
e(sender,args);
}
}

  现在事件句柄可以通过调用各个raiseevent方法来触发事件了。

  四、应用实例

  至此为止,分页控件的设计已经全部完成,可以正式使用了。要使用该分页控件,只要把它绑定到一个表现控件即可。

<asp:repeater id="repeater" runat="server">
<itemtemplate>
列1:
<%# convert.tostring(databinder.eval(container.dataitem,"column1"))%>
<br>
列2:
<%# convert.tostring(databinder.eval(container.dataitem,"column2"))%>
<br>
列3:
<%# convert.tostring(databinder.eval(container.dataitem,"column3"))%>
<br>
<hr>
</itemtemplate>
</asp:repeater>
<cc1:pager id="pager" resultstoshow="2" runat="server" bindtocontrol="repeater">
<selectedpagerstyle backcolor="yellow" />
</cc1:pager>

  上面的aspx页面将分页控件绑定到一个repeater控件,设置每页显示的记录数量为2,选中的页面编号颜色为黄色,使用默认的布局,效果如图一。下面是另一个例子,它将分页控件绑定到一个datagrid,效果如图二。

<asp:datagrid id="grid" runat="server"></asp:datagrid>
<cc1:pager id="pagergrid" resultstoshow="2" runat="server" bindtocontrol="grid">
<selectedpagerstyle backcolor="red"></selectedpagerstyle>
<layout>
<asp:imagebutton id="first" runat="server" imageurl="play2l_dis.gif" alternatetext="首页"></asp:imagebutton>
<asp:imagebutton id="previous" runat="server" imageurl="play2l.gif" alternatetext="上一页"></asp:imagebutton>
<asp:imagebutton id="next" runat="server" imageurl="play2.gif" alternatetext="下一页"></asp:imagebutton>
<asp:imagebutton id="last" runat="server" imageurl="play2_dis.gif" alternatetext="末页"></asp:imagebutton>
<asp:panel id="pager" runat="server"></asp:panel>
</layout>
</cc1:pager>

  测试表明,分页控件并不依赖于特定的表现控件,它可以方便地处理不同的数据源,而且很容易使用,请读者下载本文后面的源代码参见完整的例子。

   虽然学习开发自定义web控件不是一件轻松的事情,但掌握这项技能带来的好处不言而喻,只要稍微增加一些工作量,开发者就可以将普通的web控件改换成 多用途的通用控件,数十倍地提高工作效率,本文的分页控件只是创建通用控件来满足现有和将来表现需要的其中一个例子而已。

应用实例:

 

文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·JSP页面中的自定义标签-JSP教程,Jsp/Servlet
·动态加载Asp.net分页控件-.NET教程,Asp.Net开发
·探究客户端浏览器分辨率的自适应问题(2)-.NET教程,评论及其它
·使用Eclipse开发Jsp-JSP教程,Jsp/Servlet
·正确优雅地解决用户退出——JSP及Struts解决方案-JSP教程,Jsp/Servlet
·关于C#中虚方法重载的说明-.NET教程,C#语言
·如何查看本机打开的端口是被哪个程序使用的-网管专栏,操作系统
·C#中来应用Hook-.NET教程,C#语言
·网页表单验证代码的改进-ASP教程,脚本编码
·最新版ccnp教材介绍
最新文章
·号称全球第一篇华人女站长的建站理财文章_站长心得
·衡量一个网站的价值的公平化的标准是什么?_站长心得
·谈谈网站设计的10个要点2_站长心得
·获取google pagerank值的研究_google推广
·强悍的网络编辑是怎样炼成的?_网络编辑
·点析网站发展三阶段3_站长心得
·个人网站真能转成商业网站,你能么?_站长心得
·百度搜索引擎使用指南_baidu推广
·加入自动功能windows vista磁盘整理全面解析_windows vista
·asp.net中多彩下拉框的实现_asp.net技巧
相关主题
  • 一个相当独立的.通用分页控件c#源码三-.NET教程,C#语言
  • 一个相当独立的.通用分页控件c#源码二-.NET教程,C#语言
  • 一个相当独立的.通用分页控件c#源码一-.NET教程,C#语言
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭