<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href='http://feed.wyangel.com/styles/podcast2.xsl' type='text/xsl' ?><!--这是一个由Feedsy提供技术支持的Feed，为了提高读者阅读的体验，以及满足用户美化自己Feed的需要，我们设计了多种精美的Feed模板，提供给大家选择，所有最终呈现出来的样式，皆由用户自愿选择使用，未经许可，任何团体和个人，请不要擅自修改样式或者盗用，这是对于用户选择权的尊重。--><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fs="http://www.feedsky.com/namespace/feed" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link href="http://feed.wyangel.com" type="application/rss+xml" rel="self"></atom:link><fs:self_link href="http://feed.feedsky.com/wyangel" type="application/rss+xml"></fs:self_link><lastBuildDate>Thu, 20 Aug 2009 01:52:41 GMT</lastBuildDate><title>Wyangel's Blog</title><description>Wyangel's Blog Where there is a will , there is a way !</description><link>http://blog.wyangel.com/</link><language>zh-cn</language><copyright>Copyright 2007 WYangel's Blog</copyright><image><title>WYangel's Blog</title><url>http://blog.wyangel.com/images/logos.gif</url><link>http://blog.wyangel.com/</link><description>WYangel's Blog</description></image><item><title>迅雷在线地址转换，快车，QQ旋风地址转换</title><link>http://blog.wyangel.com/default.asp?id=1161</link><description>迅雷,地址转换,迅雷地址转换,在线迅雷地址转换,&lt;br/&gt;thunder://,thunder转换http,thunder转换ftp,在线迅雷地址转换,普通地址转换迅雷地址,在线迅雷地址解密&lt;br/&gt;&lt;br/&gt;&lt;a href=&quot;http://www1.wyangel.com/xunlei.php&quot; target=&quot;_blank&quot;&gt;http://www1.wyangel.com/xunlei.php&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;快车,地址转换,快车地址转换,在线快车地址转换,&lt;br/&gt;flashget://,flashget转换http,flashget转换ftp,在线快车地址转换,普通地址转换快车地址,在线快车地址解密&lt;br/&gt;&lt;br/&gt;&lt;a href=&quot;http://www1.wyangel.com/flashget.php&quot; target=&quot;_blank&quot;&gt;http://www1.wyangel.com/flashget.php&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;QQ旋风,地址转换,QQ旋风地址转换,在线QQ旋风地址转换,&lt;br/&gt;qqdl://,qqdl转换http,qqdl转换ftp,在线QQ旋风地址转换,普通地址转换QQ旋风地址,在线QQ旋风地址解密&lt;br/&gt;&lt;br/&gt;&lt;a href=&quot;http://www1.wyangel.com/xuanfeng.php&quot; target=&quot;_blank&quot;&gt;http://www1.wyangel.com/xuanfeng.php&lt;/a&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/261840907/wyangel/feedsky/s.gif?r=http://blog.wyangel.com/default.asp?id=1161&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/wyangel/261840907/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/wyangel/261840907/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class=&quot;fsflare&quot;&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=1bd6fca0c99bcc28da3e11cf1f0f201a&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=1bd6fca0c99bcc28da3e11cf1f0f201a&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=9f5ace29490f43aea163dea2a857ab85&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=9f5ace29490f43aea163dea2a857ab85&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=5394b8e8823a07ee12554f310d784aee&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=5394b8e8823a07ee12554f310d784aee&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=30c2f440d753bb369114d77202e6a920&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=30c2f440d753bb369114d77202e6a920&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;</description><category>我的日志</category><pubDate>Thu, 20 Aug 2009 09:52:41 +0800</pubDate><author>wy533@126.com(admin)</author><guid isPermaLink="false">http://blog.wyangel.com/default.asp?id=1161</guid><dc:creator>wy533@126.com(admin)</dc:creator><fs:srclink>http://blog.wyangel.com/default.asp?id=1161</fs:srclink><fs:srcfeed>http://blog.wyangel.com/feed.asp</fs:srcfeed><fs:itemid>feedsky/wyangel/~7058344/261840907/4070471</fs:itemid></item><item><title>ASP.NET设计中的性能优化问题</title><link>http://blog.wyangel.com/default.asp?id=1160</link><description>&lt;P&gt;一、SqlDataRead和Dataset的选择&lt;/P&gt;&lt;P&gt;　　Sqldataread优点：读取数据非常快。如果对返回的数据不需做大量处理的情况下，建议使用SqlDataReader，其性能要比datset好很多。缺点：直到数据读完才可close掉于数据库的连接&lt;/P&gt;&lt;P&gt;　　(SqlDataReader读数据是快速向前的。SqlDataReader类提供了一种读取从SQLServer数据库检索的只进数据流的方法。它使用SQLServer的本机网络数据传输格式从数据库连接直接读取数据。DataReader需及时显式的close。可及时的释放对数据的连接。)&lt;/P&gt;&lt;P&gt;　　Dataset是把数据读出，缓存在内存中。缺点：对内存的占用较高。如果对返回的数据需做大量的处理用Dataset比较好些可以减少对数据库的连接操作。优点：只需连接一次就可close于数据库的连接&lt;/P&gt;&lt;P&gt;　　*一般情况下,读取大量数据,对返回数据不做大量处理用SqlDataReader.对返回数据大量处理用datset比较合适.对SqlDataReader和Dataset的选择取决于程序功能的实现。&lt;/P&gt;&lt;P&gt;二、ExecuteNonQuery和ExecuteScalar&lt;/P&gt;&lt;P&gt;　　对数据的更新不需要返回结果集，建议使用ExecuteNonQuery。由于不返回结果集可省掉网络数据传输。它仅仅返回受影响的行数。如果只需更新数据用ExecuteNonQuery性能的开销比较小。&lt;/P&gt;&lt;P&gt;　　ExecuteScalar它只返回结果集中第一行的第一列。使用ExecuteScalar方法从数据库中检索单个值（例如id号）。与使用ExecuteReader方法，返回的数据执行生成单个值所需的操作相比，此操作需要的代码较少。&lt;/P&gt;&lt;P&gt;　　*只需更新数据用ExecuteNonQuery.单个值的查询使用ExecuteScalar数据绑定的选择&lt;/P&gt;&lt;P&gt;三、数据的绑定DataBinder&lt;/P&gt;&lt;P&gt;　　一般的绑定方法&amp;lt;#DataBinder.Eval(Container.DataItem,&quot;字段名&quot;)&amp;gt;用DataBinder.eval绑定不必关心数据来源(Dataread或dataset)。不必关心数据的类型eval会把这个数据对象转换为一个字符串。在底层绑定做了很多工作，使用了反射性能。正因为使用方便了，但却影响了数据性能。来看下&amp;lt;#DataBinder.Eval(Container.DataItem,&quot;字段名&quot;)&amp;gt;。当于dataset绑定时，DataItem其实式一个DataRowView（如果绑定的是一个数据读取器（dataread）它就是一个IdataRecord。）因此直接转换成DataRowView的话，将会给性能带来很大提升。&lt;/P&gt;&lt;P&gt;　　&amp;lt;#ctype(Container.DataItem,DataRowView).Row(&quot;字段名&quot;)&amp;gt;&lt;/P&gt;&lt;P&gt;　　*对数据的绑定建议使用&amp;lt;#ctype(Container.DataItem,DataRowView).Row(&quot;字段名&quot;)&amp;gt;。数据量大的时候可提高几百倍的速度。使用时注意2方面：1.需在页面添加&amp;lt;@Importnamespace=&quot;System.Data&quot;&amp;gt;.2.注意字段名的大小写（要特别注意）。如果和查询的不一致，在某些情况下会导致比&amp;lt;#DataBinder.Eval(Container.DataItem,&quot;字段名&quot;)&amp;gt;还要慢。如果想进一步提高速度，可采用&amp;lt;#ctype(Container.DataItem,DataRowView).Row(0)&amp;gt;的方法。不过其可读性不高。&lt;/P&gt;&lt;P&gt;　　以上的是vb.net的写法。在c#中：&amp;lt;@((DataRowView)Container.DataItem)[&quot;字段名&quot;]&amp;gt;&lt;/P&gt;&lt;P&gt;　　对查看页面每个执行过程状态最简单的办法：其页面的trace属性为true就可查看细节。&lt;/P&gt;&lt;P&gt;一、使用存储过程：&lt;/P&gt;&lt;P&gt;　　1、性能方面：存储过程提供了许多标准sql语言中所没有的高级特性。其传递参数和执行逻辑表达式的功能，有助于应用程序设计者处理复杂任务。另外，存储过程存储在本地服务器上，减少了执行该过程所需的网络传输宽带和执行时间。（存储过程已经对sql语句进行了预编译，所以其执行速度比在程序里执行sql语句快很多）&lt;/P&gt;&lt;P&gt;　　2、程序结构方面：从程序的可扩展性看，使用存储过程会对程序以后的修改带来方便。比如数据库的结构改变了，只需修改相对应的存储结构，和程序中的调用部分即可。这部分不属于本文探讨范围，属于程序结构设计方面。所以不在此展开。&lt;/P&gt;&lt;P&gt;　　3、程序安全性：使用存储过程可避免SQLInjection攻击。&lt;/P&gt;&lt;P&gt;二、查询语句的优化（针对sqlserver2000）&lt;/P&gt;&lt;P&gt;　　很多人只为目的写出sql语句，而不考虑sql语句的执行效率。在这我只提供一优化表顺序的方法，（sql语句的优化和原则将会在我的sqlserver2000学习笔记中专题讨论）&lt;/P&gt;&lt;P&gt;　　对sql语句执行效率可用sqlserver2000的查询分析器来查看语句的执行过程。&lt;/P&gt;&lt;P&gt;　　优化表顺序：一般情况下，sqlserver会对表的连接作出自动优化。例如：selectname,nofromAjoinBonA.id=B.idjoinConC.id=A.idwherename=’wang’&lt;/P&gt;&lt;P&gt;　　尽管A表在From中先列出，然后才是B,最后才是C。但sqlserver可能会首先使用c表。它的选择原则是相对于该查询限制为单行或少数几行，就可以减少在其他表中查找的总数据量。绝大多数情况下，sqlserver会作出最优的选择，但如果你发觉某个复杂的联结查询速度比预计的要慢，就可以使用SETFORCEPLAN语句强制sqlserver按照表出现顺序使用表。如上例加上：SETFORCEPLANON…….SETFORCEPLANOFF表的执行顺序将会按照你所写的顺序执行。在查询分析器中查看2种执行效率，从而选择表的连接顺序。&lt;/P&gt;&lt;P&gt;　　*使用SETFORCEPLAN选择表联结顺序&lt;/P&gt;&lt;P&gt;三、页面的优化（.aspx）&lt;/P&gt;&lt;P&gt;主要针对几个页面属性&lt;/P&gt;&lt;P&gt;　　1、EnableViewState(页面的视图状态)。如果无特殊要求设置为false。使用ViewState，每个对象都必须先序列化到ViewState中，然后再通过回传进行反序列化，因此使用ViewState是没有代价的。尽量减少使用对象，如果可能，尽量减少放入ViewState中的对象的数目。下面情况基本上可以禁用viewstate：&lt;/P&gt;&lt;P&gt;　　（1）页面控件（.ascx）&lt;BR&gt;　　（2）页面不回传给自身。&lt;BR&gt;　　（3）无需对控件的事件处理。&lt;BR&gt;　　（4）控件没有动态的或数据绑定的属性值（或对于每个postpack都在代码中处理）&lt;/P&gt;&lt;P&gt;　　单个页面或每个页面都禁用ViewState，如下所示：单个页面：&amp;lt;@PageEnableViewState=&quot;False&quot;&amp;gt;每个页面：在web.config中&amp;lt;PagesEnableViewState=&quot;false&quot;/&amp;gt;EnableSessionState保持默认值即可（如果页面用到sessionstate它才会占用资源）。EnableViewStateMac如果无安全上的特殊要求，保持默认值。&lt;/P&gt;&lt;P&gt;　　2、Pagelayout.页面布局模型。建议使用Flowlayout(元素不带绝对定位属性添加).Gridlayout(绝对定位属性)由于采用绝对定位，将会比Flowlayout生产更多的代码，主要是控件的定位信息。&lt;/P&gt;&lt;P&gt;　　3、项目发布的时候切记解除页面的Debug状态。&lt;/P&gt;&lt;P&gt;　　4、Html语言的优化。我的建议是熟练掌握Html/JavaScript，少用vs.net2003自动生产的代码，它会自动生成一些无用的html代码。&lt;/P&gt;&lt;P&gt;　　5、smartnavigation设置为true能让用户明显的感觉性能提高。启用此属性后对客户端和服务端影响不大.它能智能涮新需要涮新需涮新的部分.&lt;/P&gt;&lt;P&gt;四、控件的选择：&lt;/P&gt;&lt;P&gt;　　Html控件和服务器控件的选择。服务器控件带来的方便和功能上的实现是html控件所不能比拟的。但是是以牺牲服务器端的资源来取得的。我个人建议：如果html控件达不到所要实现的功能，而且和一些脚本语言（如javascrpt/vbscript）结合也不能实现的话。才会选择服务器控件。选择服务器控件后，也尽量对其控件优化，如取消一些页面状态等（具体看控件的优化）&lt;/P&gt;&lt;P&gt;　　服务器控件的选择：主要针对几个常用数据控件说明一下：&lt;/P&gt;&lt;P&gt;　　DataGrid：自带最强大的数据显示控件，内置了对数据的修改、删除、添加、分页等很多实用功能。如果你只需对数据显示的话，尽量不要选择DataGrid（它把数据都存储在viewstate中）.也不要使用自带的分页功能，microsoft在自动分页的底层做了很多工作，虽然使用方便了，但性能开销大了。&lt;/P&gt;&lt;P&gt;　　DataList：比DataGrid功能少了很多。但自定义性强了很多。特有的多行数据显示，给我们带来了很多方便。DataGrid能实现的功能，它基本能实现。所以建议使用它。&lt;/P&gt;&lt;P&gt;　　Repeater：功能最少，但自定义性非常强。如果只需对数据显示，建议使用。由于减少了很多功能，对服务器的性能带来消耗最小。因此，如果是对数据显示的话，我基本上都是选择Repeater然后DataList最后DataGrid&lt;/P&gt;&lt;P&gt;　　*尽量选择html控件。能在客户端实现的功能就在客户端实现(熟练掌握javascript)，减少服务器的压力。数据控件选择顺序：Repeater、DataList、DataGrid&lt;/P&gt;&lt;P&gt;五、服务器控件的优化：&lt;/P&gt;&lt;P&gt;　　1、Viewstate&lt;/P&gt;&lt;P&gt;　　控件的viewstate与页面的viewstate基本是一致的。用来保存控件的一些状态。处理原则和处理页面的viewstate一样。有兴趣的可以用Datagrid绑定数据测试下viewstate保存的数据量有多大，它所保存的数据基本和Datagrid显示的数据量大小是等同的。&lt;/P&gt;&lt;P&gt;　　2、Ispostpack&lt;/P&gt;&lt;P&gt;　　默认false.需要产生事件的时候才需设置为true.&lt;/P&gt;&lt;P&gt;　　控件的优化，主要看你对此控件的熟悉情况。对控件内部运作的原理越了解，就会对其作出合适的优化。&lt;/P&gt;&lt;P&gt;　　性能优化是三两句话说不清的，我所写出的仅仅是冰山一角，性能的优化是靠平时经验的积累和对程序的运作原理的不断认知。&lt;/P&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/wyangel/261840908/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/wyangel/261840908/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class=&quot;fsflare&quot;&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=1bc123eb1d4ee76d1a67e327a2453e69&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=1bc123eb1d4ee76d1a67e327a2453e69&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=662eb913a38d048be5724c8c487f9738&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=662eb913a38d048be5724c8c487f9738&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=d5562afabbce49fc2a7321904bb8abbc&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=d5562afabbce49fc2a7321904bb8abbc&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=12fb1400cbbdd455bc361d0a86899e88&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=12fb1400cbbdd455bc361d0a86899e88&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;</description><category>.NET学习</category><pubDate>Fri, 03 Oct 2008 18:39:27 +0800</pubDate><author>wy533@126.com(admin)</author><guid isPermaLink="false">http://blog.wyangel.com/default.asp?id=1160</guid><dc:creator>wy533@126.com(admin)</dc:creator><fs:srclink>http://blog.wyangel.com/default.asp?id=1160</fs:srclink><fs:srcfeed>http://blog.wyangel.com/feed.asp</fs:srcfeed><fs:itemid>feedsky/wyangel/~7058344/261840908/4070471</fs:itemid></item><item><title>ASP.NET跨页面传值技巧总结</title><link>http://blog.wyangel.com/default.asp?id=1159</link><description>&lt;P&gt;今天TM群里有人问起关于页面传值的方法，又引发了一场讨论。看来这个还是有很多人关注的，因此我就我个人观点做了些总结，希望对大家有所帮助。&lt;BR&gt;1.使用QueryString变量&lt;BR&gt;　　　QueryString是一种非常简单的传值方式，他可以将传送的值显示在浏览器的地址栏中。如果是传递一个或多个安全性要求不高或是结构简单的数值时，可以使用这个方法。但是对于传递数组或对象的话，就不能用这个方法了。下面是一个例子：&lt;BR&gt;a.aspx的C#代码&lt;BR&gt;privatevoidButton1_Click(objectsender,System.EventArgse)&lt;BR&gt;{&lt;BR&gt;strings_url;&lt;BR&gt;s_url=&quot;b.aspx?name=&quot; Label1.Text;&lt;BR&gt;Response.Redirect(s_url);&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;b.aspx中C#代码&lt;BR&gt;privatevoidPage_Load(objectsender,EventArgse)&lt;BR&gt;{&lt;BR&gt;Label2.Text=Request.QueryString[&quot;name&quot;];&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;2.使用Application对象变量&lt;BR&gt;　　Application对象的作用范围是整个全局，也就是说对所有用户都有效。其常用的方法用Lock和UnLock。&lt;BR&gt;a.aspx的C#代码&lt;BR&gt;privatevoidButton1_Click(objectsender,System.EventArgse)&lt;BR&gt;{&lt;BR&gt;Application[&quot;name&quot;]=Label1.Text;&lt;BR&gt;Server.Transfer(&quot;b.aspx&quot;);&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;b.aspx中C#代码&lt;BR&gt;privatevoidPage_Load(objectsender,EventArgse)&lt;BR&gt;{&lt;BR&gt;stringname;&lt;BR&gt;Application.Lock();&lt;BR&gt;name=Application[&quot;name&quot;].ToString();&lt;BR&gt;Application.UnLock();&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;3.使用Session变量&lt;BR&gt;　　想必这个肯定是大家使用中最常见的用法了，其操作与Application类似，作用于用户个人，所以，过量的存储会导致服务器内存资源的耗尽。&lt;BR&gt;a.aspx的C#代码&lt;BR&gt;privatevoidButton1_Click(objectsender,System.EventArgse)&lt;BR&gt;{&lt;BR&gt;Session[&quot;name&quot;]=Label.Text;&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;b.aspx中C#代码&lt;BR&gt;privatevoidPage_Load(objectsender,EventArgse)&lt;BR&gt;{&lt;BR&gt;stringname;&lt;BR&gt;name=Session[&quot;name&quot;].ToString();&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;4.使用Cookie对象变量&lt;BR&gt;　　这个也是大家常使用的方法，与Session一样，其是什对每一个用户而言的，但是有个本质的区别，即Cookie是存放在客户端的，而session是存放在服务器端的。而且Cookie的使用要配合ASP.NET内置对象Request来使用。&lt;/P&gt;&lt;P&gt;a.aspx的C#代码&lt;BR&gt;privatevoidButton1_Click(objectsender,System.EventArgse)&lt;BR&gt;{&lt;BR&gt;HttpCookiecookie_name=newHttpCookie(&quot;name&quot;);&lt;BR&gt;cookie_name.Value=Label1.Text;&lt;BR&gt;Reponse.AppendCookie(cookie_name);&lt;BR&gt;Server.Transfer(&quot;b.aspx&quot;);&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;b.aspx中C#代码&lt;BR&gt;privatevoidPage_Load(objectsender,EventArgse)&lt;BR&gt;{&lt;BR&gt;stringname;&lt;BR&gt;name=Request.Cookie[&quot;name&quot;].Value.ToString();&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;5.使用Server.Transfer方法&lt;BR&gt;　　这个才可以说是面象对象开发所使用的方法，其使用Server.Transfer方法把流程从当前页面引导到另一个页面中，新的页面使用前一个页面的应答流，所以这个方法是完全面象对象的，简洁有效。&lt;BR&gt;a.aspx的C#代码&lt;BR&gt;publicstringName&lt;BR&gt;{&lt;BR&gt;get{returnLabel1.Text;}&lt;BR&gt;}&lt;BR&gt;privatevoidButton1_Click(objectsender,System.EventArgse)&lt;BR&gt;{&lt;BR&gt;Server.Transfer(&quot;b.aspx&quot;);&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;b.aspx中C#代码&lt;BR&gt;privatevoidPage_Load(objectsender,EventArgse)&lt;BR&gt;{&lt;BR&gt;anewWeb;//实例a窗体&lt;BR&gt;newWeb=(source)Context.Handler;&lt;BR&gt;stringname;&lt;BR&gt;name=newWeb.Name;&lt;BR&gt;}&lt;BR&gt;&lt;/P&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/wyangel/261840909/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/wyangel/261840909/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class=&quot;fsflare&quot;&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=1af074c29fa550a008540e37a2e71069&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=1af074c29fa550a008540e37a2e71069&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=822be47170fb34bf6b670d31ea0cd32f&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=822be47170fb34bf6b670d31ea0cd32f&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=bb2388e7524c9b8df64a9a3a42987759&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=bb2388e7524c9b8df64a9a3a42987759&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=0fc7a47156dd4b49bf427b724454b67f&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=0fc7a47156dd4b49bf427b724454b67f&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;</description><category>.NET学习</category><pubDate>Fri, 03 Oct 2008 18:39:23 +0800</pubDate><author>wy533@126.com(admin)</author><guid isPermaLink="false">http://blog.wyangel.com/default.asp?id=1159</guid><dc:creator>wy533@126.com(admin)</dc:creator><fs:srclink>http://blog.wyangel.com/default.asp?id=1159</fs:srclink><fs:srcfeed>http://blog.wyangel.com/feed.asp</fs:srcfeed><fs:itemid>feedsky/wyangel/~7058344/261840909/4070471</fs:itemid></item><item><title>简写的通用数据层代码</title><link>http://blog.wyangel.com/default.asp?id=1158</link><description>&lt;P&gt;publicclassSqlHelper&lt;BR&gt;...{&lt;BR&gt;ExecuteNonQuery的两个重载#regionExecuteNonQuery的两个重载&lt;BR&gt;publicstaticintExecuteNonQuery(stringconnStr,CommandTypecommandType,stringcommStr)&lt;BR&gt;...{&lt;BR&gt;SqlConnectionconn=newSqlConnection(connStr);&lt;BR&gt;SqlCommandcomm=newSqlCommand(commStr,conn);&lt;BR&gt;comm.CommandType=commandType;&lt;/P&gt;&lt;P&gt;conn.Open();&lt;BR&gt;introwNum=comm.ExecuteNonQuery();&lt;BR&gt;comm.Dispose();&lt;BR&gt;conn.Close();&lt;/P&gt;&lt;P&gt;returnrowNum;&lt;BR&gt;}&lt;BR&gt;publicstaticintExecuteNonQuery(stringconnStr,CommandTypecommandType,stringcommStr,paramsSqlParameter[]commandParameters)&lt;BR&gt;...{&lt;BR&gt;SqlConnectionconn=newSqlConnection(connStr);&lt;BR&gt;SqlCommandcomm=newSqlCommand(commStr,conn);&lt;BR&gt;comm.CommandType=commandType;&lt;/P&gt;&lt;P&gt;for(inti=0;i&amp;lt;commandParameters.Length;i  )&lt;BR&gt;comm.Parameters.Add(commandParameters[i]);&lt;/P&gt;&lt;P&gt;conn.Open();&lt;BR&gt;introwNum=comm.ExecuteNonQuery();&lt;BR&gt;comm.Dispose();&lt;BR&gt;conn.Close();&lt;/P&gt;&lt;P&gt;returnrowNum;&lt;BR&gt;}&lt;BR&gt;#endregion&lt;/P&gt;&lt;P&gt;ExecuteScalar的两个重载#regionExecuteScalar的两个重载&lt;BR&gt;publicstaticobjectExecuteScalar(stringconnStr,CommandTypecommandType,stringcommStr)&lt;BR&gt;...{&lt;BR&gt;SqlConnectionconn=newSqlConnection(connStr);&lt;BR&gt;SqlCommandcomm=newSqlCommand(commStr,conn);&lt;BR&gt;comm.CommandType=commandType;&lt;/P&gt;&lt;P&gt;conn.Open();&lt;BR&gt;objectfirstObj=comm.ExecuteScalar();&lt;BR&gt;comm.Dispose();&lt;BR&gt;conn.Close();&lt;/P&gt;&lt;P&gt;returnfirstObj;&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;publicstaticobjectExecuteScalar(stringconnStr,CommandTypecommandType,stringcommStr,paramsSqlParameter[]commandParameters)&lt;BR&gt;...{&lt;BR&gt;SqlConnectionconn=newSqlConnection(connStr);&lt;BR&gt;SqlCommandcomm=newSqlCommand(commStr,conn);&lt;BR&gt;comm.CommandType=commandType;&lt;/P&gt;&lt;P&gt;for(inti=0;i&amp;lt;commandParameters.Length;i  )&lt;BR&gt;comm.Parameters.Add(commandParameters[i]);&lt;/P&gt;&lt;P&gt;conn.Open();&lt;BR&gt;objectfirstObj=comm.ExecuteScalar();&lt;BR&gt;comm.Dispose();&lt;BR&gt;conn.Close();&lt;/P&gt;&lt;P&gt;returnfirstObj;&lt;BR&gt;}&lt;BR&gt;#endregion&lt;/P&gt;&lt;P&gt;ExecuteReader的两个重载#regionExecuteReader的两个重载&lt;BR&gt;publicstaticSqlDataReaderExecuteReader(stringconnStr,CommandTypecommandType,stringcommStr)&lt;BR&gt;...{&lt;BR&gt;SqlConnectionconn=newSqlConnection(connStr);&lt;BR&gt;SqlCommandcomm=newSqlCommand(commStr,conn);&lt;BR&gt;comm.CommandType=commandType;&lt;/P&gt;&lt;P&gt;conn.Open();&lt;BR&gt;SqlDataReaderreader=comm.ExecuteReader(CommandBehavior.CloseConnection);&lt;/P&gt;&lt;P&gt;returnreader;&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;publicstaticSqlDataReaderExecuteReader(stringconnStr,CommandTypecommandType,stringcommStr,paramsSqlParameter[]commandParameters)&lt;BR&gt;...{&lt;BR&gt;SqlConnectionconn=newSqlConnection(connStr);&lt;BR&gt;SqlCommandcomm=newSqlCommand(commStr,conn);&lt;BR&gt;comm.CommandType=commandType;&lt;/P&gt;&lt;P&gt;for(inti=0;i&amp;lt;commandParameters.Length;i  )&lt;BR&gt;comm.Parameters.Add(commandParameters[i]);&lt;/P&gt;&lt;P&gt;conn.Open();&lt;BR&gt;SqlDataReaderreader=comm.ExecuteReader(CommandBehavior.CloseConnection);&lt;/P&gt;&lt;P&gt;returnreader;&lt;BR&gt;}&lt;BR&gt;#endregion&lt;/P&gt;&lt;P&gt;SqlDataSetAdapter的两个重载#regionSqlDataSetAdapter的两个重载&lt;BR&gt;publicstaticDataSetSqlDataSetAdapter(stringconnStr,CommandTypecommandType,stringcommStr,paramsSqlParameter[]commandParameters)&lt;BR&gt;...{&lt;BR&gt;SqlConnectionconn=newSqlConnection(connStr);&lt;BR&gt;SqlCommandcomm=newSqlCommand(commStr,conn);&lt;BR&gt;comm.CommandType=commandType;&lt;/P&gt;&lt;P&gt;for(inti=0;i&amp;lt;commandParameters.Length;i  )&lt;BR&gt;comm.Parameters.Add(commandParameters[i]);&lt;/P&gt;&lt;P&gt;&lt;BR&gt;SqlDataAdaptersda=newSqlDataAdapter(comm);&lt;BR&gt;DataSetds=newDataSet();&lt;/P&gt;&lt;P&gt;sda.Fill(ds);&lt;BR&gt;returnds;&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;publicstaticDataSetSqlDataSetAdapter(stringconnStr,CommandTypecommandType,stringcommStr)&lt;BR&gt;...{&lt;BR&gt;SqlConnectionconn=newSqlConnection(connStr);&lt;BR&gt;SqlCommandcomm=newSqlCommand(commStr,conn);&lt;BR&gt;comm.CommandType=commandType;&lt;/P&gt;&lt;P&gt;&lt;BR&gt;SqlDataAdaptersda=newSqlDataAdapter(comm);&lt;BR&gt;DataSetds=newDataSet();&lt;/P&gt;&lt;P&gt;sda.Fill(ds);&lt;BR&gt;returnds;&lt;BR&gt;}&lt;BR&gt;#endregion&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/wyangel/261840910/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/wyangel/261840910/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class=&quot;fsflare&quot;&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=09f31c0ecc0e8064ea3fcf214aa03c99&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=09f31c0ecc0e8064ea3fcf214aa03c99&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=ed816e4364c32a72e9f2a18cbb84403f&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=ed816e4364c32a72e9f2a18cbb84403f&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=f03ebc14c1f5ea0a951760b4f56444cd&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=f03ebc14c1f5ea0a951760b4f56444cd&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=0762d9eb0d43e4c17646788e841a7909&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=0762d9eb0d43e4c17646788e841a7909&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;</description><category>.NET学习</category><pubDate>Fri, 03 Oct 2008 18:39:23 +0800</pubDate><author>wy533@126.com(admin)</author><guid isPermaLink="false">http://blog.wyangel.com/default.asp?id=1158</guid><dc:creator>wy533@126.com(admin)</dc:creator><fs:srclink>http://blog.wyangel.com/default.asp?id=1158</fs:srclink><fs:srcfeed>http://blog.wyangel.com/feed.asp</fs:srcfeed><fs:itemid>feedsky/wyangel/~7058344/261840910/4070471</fs:itemid></item><item><title>分析ASP.NET服务器控件开发-控件生命周期</title><link>http://blog.wyangel.com/default.asp?id=1157</link><description>&lt;P&gt;ASP.NET2.0服务器控件开发----控件生命周期&lt;BR&gt;服务器控件生命周期简介&lt;BR&gt;　　服务器控件的生命周期是创建服务器控件最重要的概念。作为开发人员，必须对服务器控件生命周期深刻理解。当然，这不是一朝一夕就可以做到的。对于学习控件开发技术的初学者，可以不必掌握得非常详细深入，只需对服务器控件的生命周期中的不同阶段有一个大致的了解即可。&lt;/P&gt;&lt;P&gt;　　在掌握服务器控件生命周期的过程中，读者要特别注意有关服务器控件状态的相关内容。在重点了解生命周期各个阶段的同时，对服务器控件的状态变化要注意以下问题：控件的生命周期何时保存控件和恢复其状态；何时与页面及其他控件之间进行交互；何时执行重要的处理逻辑；在各个阶段，控件可使用哪些信息、保持哪些数据、控件呈现时处于哪种状态以及何时输出显示标记文本等。如下列举了服务器控件生命周期所要经历的11个阶段。&lt;/P&gt;&lt;P&gt;　　（1）初始化----在此阶段中，主要完成两项工作：一、初始化在传入Web请求生命周期内所需的设置；二、跟踪视图状态。首先，页面框架通过默认方式引发Init事件，并调用OnInit()方法，控件开发人员可以重写该方法为控件提供初始化逻辑。此后，页面框架将调用TrackViewState方法来跟踪视图状态。需要注意的是：多数情况下，Control基类提供的TrackViewState方法实现已经足够了。只有在控件定义了复杂属性时，开发人员才可能需要重写TrackViewState方法。&lt;/P&gt;&lt;P&gt;　　（2）加载视图状态----此阶段的主要任务是检查服务器控件是否存在以及是否需要将其状态恢复到它在处理之前的请求结束的状态。因此该过程发生在页面回传过程中，而不是初始化请求过程。在此阶段，页面框架将自动恢复ViewState字典。如果服务器控件不维持其状态，或者它有能力通过默认方式保存其所有状态而使用ViewState字典，那么开发人员则不必实现任何逻辑。针对那些无法在ViewState字典中存储的数据类型或者需要自定义状态管理的情况，开发人员可以通过重写LoadViewState方法来自定义状态的恢复和管理。&lt;/P&gt;&lt;P&gt;　　（3）处理回发数据----若要使控件能够检查客户端发回的窗体数据，那么必须实现System.Web.UI.IPostBackDataHandler接口的　LoadPostData()方法。因此只有处理回发数据的控件参与此阶段。&lt;/P&gt;&lt;P&gt;　　（4）加载----至此阶段开始，控件树中的服务器控件已创建并初始化、状态已还原并且窗体控件反映了客户端的数据。此时，开发人员可以通过重写OnLoad()方法来实现每个请求共同的逻辑。&lt;/P&gt;&lt;P&gt;　　（5）发送回发更改通知----在此阶段，服务器控件通过引发事件作为一种信号，表明由于回发而发生的控件状态变化（因此该阶段仅用于回发过程）。为了建立这种信号，开发人员必须再次使用System.Web.UI.IPostBackDataHandler接口，并实现另一方法-RaisePostBackChangedEvent()。其判断过程为：如果控件状态因回发而更改，则LoadPostData()返回true；否则返回false。页面框架跟踪所有返回true的控件并在这些控件上调用RaisePostDataChangedEvent()。&lt;/P&gt;&lt;P&gt;　　（6）处理回发事件----该阶段处理引起回发的客户端事件。为了便于将客户端事件映射到服务器端事件上进行处理，开发人员在此阶段可以通过实现System.Web.UI.IPostBackEventHandler接口的RaisePostBackEvent()方法来实现该逻辑。由此途径，服务器控件将成功捕获回发的客户端事件进行服务器端的相应处理。&lt;/P&gt;&lt;P&gt;　　（7）预呈现----该阶段完成在生成控件之前所需要的任何工作。通常情况下是通过重写OnPreRender()方法完成该工作。需要注意的是：在该阶段，可以保存在预呈现阶段对控件状态所做的更改，而在呈现阶段进行的更改则会丢失。&lt;/P&gt;&lt;P&gt;　　（8）保存状态----如果服务器控件不维持状态，或者它有能力通过默认方式保存其所有状态而使用ViewState字典，那么开发人员不必在该阶段实现任何逻辑。因为这个保存状态的过程是自动的。如果服务器控件需要自定义状态保存，或者控件无法在ViewState字典中存储特殊的数据类型，则需要通过重写SaveViewState()方法来实现状态保存。&lt;/P&gt;&lt;P&gt;　　（9）呈现----表示向HTTP输出流中写入标记文本的过程。开发人员通过重写Render()方法使其在输出流上自定义标记文本。&lt;/P&gt;&lt;P&gt;　　（10）处置----在此阶段中，通过重写Dispose()方法完成释放对昂贵资源的引用，如数据库链接等。&lt;/P&gt;&lt;P&gt;　　（11）卸载----完成的工作与&quot;处置&quot;阶段相同，但是，开发人员通常在Dispose()方法中执行清除，而不处理Unload事件。&lt;/P&gt;&lt;P&gt;　　小结&lt;/P&gt;&lt;P&gt;　　服务器控件在ASP.NET2.0框架中起着举足轻重的作用，是构建Web应用程序最关键、最重要的组成元素。对于一个优秀的开发人员，掌握服务器控件的基础知识是非常重要的。本文就服务器控件的概念、类型、生命周期等关键内容进行了介绍。希望读者能够将这些内容牢固掌握，为写出精彩的服务器控件打下良好的基础。&lt;/P&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/wyangel/261840911/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/wyangel/261840911/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class=&quot;fsflare&quot;&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=6958906f21ef623f369b25d7b3828f33&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=6958906f21ef623f369b25d7b3828f33&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=ae40785d787626215d17179b13ec33c2&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=ae40785d787626215d17179b13ec33c2&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=ae7636a0d2ae99788a6ec63401c50916&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=ae7636a0d2ae99788a6ec63401c50916&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=0758f7630dc018d1b3d9b76777c26575&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=0758f7630dc018d1b3d9b76777c26575&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;</description><category>.NET学习</category><pubDate>Fri, 03 Oct 2008 18:39:17 +0800</pubDate><author>wy533@126.com(admin)</author><guid isPermaLink="false">http://blog.wyangel.com/default.asp?id=1157</guid><dc:creator>wy533@126.com(admin)</dc:creator><fs:srclink>http://blog.wyangel.com/default.asp?id=1157</fs:srclink><fs:srcfeed>http://blog.wyangel.com/feed.asp</fs:srcfeed><fs:itemid>feedsky/wyangel/~7058344/261840911/4070471</fs:itemid></item><item><title>AspNetPager分页控件--使用方法</title><link>http://blog.wyangel.com/default.asp?id=1156</link><description>&lt;P&gt;//此源代码仅供学习参考，不得用作任何商业用途；&lt;BR&gt;//若需修改并重新编译该控件，请保留完整的源代码的版权信息！&lt;BR&gt;//有关控件升级及新控件发布信息，请留意www.webdiyer.com。&lt;BR&gt;usingSystem;&lt;BR&gt;usingSystem.IO;&lt;BR&gt;usingSystem.Web;&lt;BR&gt;usingSystem.Web.UI;&lt;BR&gt;usingSystem.Web.UI.WebControls;&lt;BR&gt;usingSystem.Web.UI.HtmlControls;&lt;BR&gt;usingSystem.Collections.Specialized;&lt;BR&gt;usingSystem.Text;&lt;BR&gt;usingSystem.ComponentModel;&lt;BR&gt;usingSystem.ComponentModel.Design;&lt;BR&gt;usingSystem.Collections;&lt;BR&gt;namespaceWuqi.Webdiyer&lt;BR&gt;{&lt;BR&gt;#regionAspNetPagerServerControl&lt;/P&gt;&lt;P&gt;#region控件说明及示例&lt;BR&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///用于ASP.NETWeb应用程序中对数据进行分页的的服务器控件。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;///&amp;lt;remarks&amp;gt;不同于DataGrid控件，AspNetPager分页控件本身并不显示任何数据，而只显示页导航元素，数据在页面上的显示方式与该控件无关。该控件可以为DataGrid、DataList、Repeater以及自定义控件进行分页，配合Sql存储过程，分页性能较使用DataGrid分页有明显提升，尤其是当数据量大时性能可提升数倍！&lt;BR&gt;///&amp;lt;p&amp;gt;AspNetPager2.0中新增了通过Url来分页的功能，这使得访问者可以直接输入相应的Url来访问任何页面，并且搜索引擎也可以直接检索每个页面，若使用DataGrid的分页功能，这是无法实现的。&amp;lt;/p&amp;gt;&lt;BR&gt;///&amp;lt;p&amp;gt;要使用AspNetPager分页控件，必须最少指定它的&amp;lt;seecref=&quot;RecordCount&quot;/&amp;gt;属性，指定并编写&amp;lt;seecref=&quot;PageChanged&quot;/&amp;gt;事件的处理程序。&lt;BR&gt;///&amp;lt;seecref=&quot;RecordCount&quot;/&amp;gt;属性指定要分页的所有数据的总项数，若未指定该值或该值小于等于&amp;lt;seecref=&quot;PageSize&quot;/&amp;gt;，则AspNetPager控件不会显示任何内容。&lt;BR&gt;///若未指定并编写&amp;lt;seecref=&quot;PageChanged&quot;/&amp;gt;事件处理程序，则当用户点击页导航元素或在页索引文本框中手式输入页索引并提交时AspNetPager不会跳转到指定的页。&lt;BR&gt;///AspNetPager控件的分页方法和DataGrid基本相同，即在它的&amp;lt;seecref=&quot;PageChanged&quot;/&amp;gt;事件处理程序中将传递事件数据的&amp;lt;seecref=&quot;PageChangedEventArgs&quot;/&amp;gt;的&amp;lt;seecref=&quot;PageChangedEventArgs.NewPageIndex&quot;/&amp;gt;值赋给AspNetPager的&amp;lt;seecref=&quot;CurrentPageIndex&quot;/&amp;gt;属性，然后重新将新的数据与数据显示控件绑定。&amp;lt;/p&amp;gt;&amp;lt;/remarks&amp;gt;&lt;BR&gt;///&amp;lt;example&amp;gt;以下示例说明如何用AspNetPager对DataGrid进行分页。&lt;BR&gt;///&amp;lt;code&amp;gt;&amp;lt;![CDATA[&lt;BR&gt;///&amp;lt;@PageLanguage=&quot;C#&quot;&amp;gt;&lt;BR&gt;///&amp;lt;@ImportNamespace=&quot;System.Data&quot;&amp;gt;&lt;BR&gt;///&amp;lt;@ImportNamespace=&quot;System.Data.SqlClient&quot;&amp;gt;&lt;BR&gt;///&amp;lt;@ImportNamespace=&quot;System.Configuration&quot;&amp;gt;&lt;BR&gt;///&amp;lt;@RegisterTagPrefix=&quot;Webdiyer&quot;Namespace=&quot;Wuqi.Webdiyer&quot;Assembly=&quot;aspnetpager&quot;&amp;gt;&lt;BR&gt;///&amp;lt;HTML&amp;gt;&lt;BR&gt;///&amp;lt;HEAD&amp;gt;&lt;BR&gt;///&amp;lt;TITLE&amp;gt;WelcometoWebdiyer.com&amp;lt;/TITLE&amp;gt;&lt;BR&gt;///&amp;lt;scriptrunat=&quot;server&quot;&amp;gt;&lt;BR&gt;///SqlConnectionconn;&lt;BR&gt;///SqlCommandcmd;&lt;BR&gt;///voidPage_Load(objectsrc,EventArgse)&lt;BR&gt;///{&lt;BR&gt;///conn=newSqlConnection(ConfigurationSettings.AppSettings[&quot;ConnStr&quot;]);&lt;BR&gt;///if(!Page.IsPostBack)&lt;BR&gt;///{&lt;BR&gt;///cmd=newSqlCommand(&quot;GetNews&quot;,conn);&lt;BR&gt;///cmd.CommandType=CommandType.StoredProcedure;&lt;BR&gt;///cmd.Parameters.Add(&quot;@pageindex&quot;,1);&lt;BR&gt;///cmd.Parameters.Add(&quot;@pagesize&quot;,1);&lt;BR&gt;///cmd.Parameters.Add(&quot;@docount&quot;,true);&lt;BR&gt;///conn.Open();&lt;BR&gt;///pager.RecordCount=(int)cmd.ExecuteScalar();&lt;BR&gt;///conn.Close();&lt;BR&gt;///BindData();&lt;BR&gt;///}&lt;BR&gt;///}&lt;BR&gt;///&lt;BR&gt;///voidBindData()&lt;BR&gt;///{&lt;BR&gt;///cmd=newSqlCommand(&quot;GetNews&quot;,conn);&lt;BR&gt;///cmd.CommandType=CommandType.StoredProcedure;&lt;BR&gt;///cmd.Parameters.Add(&quot;@pageindex&quot;,pager.CurrentPageIndex);&lt;BR&gt;///cmd.Parameters.Add(&quot;@pagesize&quot;,pager.PageSize);&lt;BR&gt;///cmd.Parameters.Add(&quot;@docount&quot;,false);&lt;BR&gt;///conn.Open();&lt;BR&gt;///dataGrid1.DataSource=cmd.ExecuteReader();&lt;BR&gt;///dataGrid1.DataBind();&lt;BR&gt;///conn.Close();&lt;BR&gt;///pager.CustomInfoText=&quot;记录总数：&amp;lt;fontcolor=&quot;blue&quot;&amp;gt;&amp;lt;b&amp;gt;&quot; pager.RecordCount.ToString() &quot;&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&quot;;&lt;BR&gt;///pager.CustomInfoText =&quot;总页数：&amp;lt;fontcolor=&quot;blue&quot;&amp;gt;&amp;lt;b&amp;gt;&quot; pager.PageCount.ToString() &quot;&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&quot;;&lt;BR&gt;///pager.CustomInfoText =&quot;当前页：&amp;lt;fontcolor=&quot;red&quot;&amp;gt;&amp;lt;b&amp;gt;&quot; pager.CurrentPageIndex.ToString() &quot;&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&quot;;&lt;BR&gt;///}&lt;BR&gt;///voidChangePage(objectsrc,PageChangedEventArgse)&lt;BR&gt;///{&lt;BR&gt;///pager.CurrentPageIndex=e.NewPageIndex;&lt;BR&gt;///BindData();&lt;BR&gt;///}&lt;BR&gt;///&amp;lt;/script&amp;gt;&lt;BR&gt;///&amp;lt;metahttp-equiv=&quot;Content-Language&quot;content=&quot;zh-cn&quot;&amp;gt;&lt;BR&gt;///&amp;lt;metahttp-equiv=&quot;content-type&quot;content=&quot;text/html;charset=gb2312&quot;&amp;gt;&lt;BR&gt;///&amp;lt;METANAME=&quot;Generator&quot;CONTENT=&quot;EditPlus&quot;&amp;gt;&lt;BR&gt;///&amp;lt;METANAME=&quot;Author&quot;CONTENT=&quot;Webdiyer(yhaili@21cn.com)&quot;&amp;gt;&lt;BR&gt;///&amp;lt;/HEAD&amp;gt;&lt;BR&gt;///&amp;lt;body&amp;gt;&lt;BR&gt;///&amp;lt;formrunat=&quot;server&quot;ID=&quot;Form1&quot;&amp;gt;&lt;BR&gt;///&amp;lt;asp:DataGridid=&quot;dataGrid1&quot;runat=&quot;server&quot;/&amp;gt;&lt;BR&gt;///&amp;lt;Webdiyer:AspNetPagerid=&quot;pager&quot;&lt;BR&gt;///runat=&quot;server&quot;&lt;BR&gt;///PageSize=&quot;8&quot;&lt;BR&gt;///NumericButtonCount=&quot;8&quot;&lt;BR&gt;///ShowCustomInfoSection=&quot;left&quot;&lt;BR&gt;///PagingButtonSpacing=&quot;0&quot;&lt;BR&gt;///ShowInputBox=&quot;always&quot;&lt;BR&gt;///CssClass=&quot;mypager&quot;&lt;BR&gt;///HorizontalAlign=&quot;right&quot;&lt;BR&gt;///OnPageChanged=&quot;ChangePage&quot;&lt;BR&gt;///SubmitButtonText=&quot;转到&quot;&lt;BR&gt;///NumericButtonTextFormatString=&quot;[{0}]&quot;/&amp;gt;&lt;BR&gt;///&amp;lt;/form&amp;gt;&lt;BR&gt;///&amp;lt;/body&amp;gt;&lt;BR&gt;///&amp;lt;/HTML&amp;gt;&lt;BR&gt;///]]&amp;gt;&lt;BR&gt;///&amp;lt;/code&amp;gt;&lt;BR&gt;///&amp;lt;p&amp;gt;下面是该示例所用的SqlServer存储过程：&amp;lt;/p&amp;gt;&lt;BR&gt;///&amp;lt;code&amp;gt;&lt;BR&gt;///&amp;lt;![CDATA[&lt;BR&gt;///CreateprocedureGetNews&lt;BR&gt;///(@pagesizeint,&lt;BR&gt;///@pageindexint,&lt;BR&gt;///@docountbit)&lt;BR&gt;///as&lt;BR&gt;///setnocounton&lt;BR&gt;///if(@docount=1)&lt;BR&gt;///selectcount(id)fromnews&lt;BR&gt;///else&lt;BR&gt;///begin&lt;BR&gt;///declare@indextabletable(idintidentity(1,1),nidint)&lt;BR&gt;///declare@PageLowerBoundint&lt;BR&gt;///declare@PageUpperBoundint&lt;BR&gt;///set@PageLowerBound=(@pageindex-1)*@pagesize&lt;BR&gt;///set@PageUpperBound=@PageLowerBound @pagesize&lt;BR&gt;///setrowcount@PageUpperBound&lt;BR&gt;///insertinto@indextable(nid)selectidfromnewsorderbyaddtimedesc&lt;BR&gt;///selectO.id,O.source,O.title,O.addtimefromnewsO,@indextabletwhereO.id=t.nid&lt;BR&gt;///andt.id&amp;gt;@PageLowerBoundandt.id&amp;lt;=@PageUpperBoundorderbyt.id&lt;BR&gt;///end&lt;BR&gt;///setnocountoff&lt;BR&gt;///GO&lt;BR&gt;///]]&amp;gt;&lt;BR&gt;///&amp;lt;/code&amp;gt;&amp;lt;/example&amp;gt;&lt;BR&gt;#endregion&lt;BR&gt;[DefaultProperty(&quot;PageSize&quot;)]&lt;BR&gt;[DefaultEvent(&quot;PageChanged&quot;)]&lt;BR&gt;[ParseChildren(false)]&lt;BR&gt;[PersistChildren(false)]&lt;BR&gt;[Description(&quot;专用于ASP.NetWeb应用程序的分页控件&quot;)]&lt;BR&gt;[Designer(typeof(PagerDesigner))]&lt;BR&gt;[ToolboxData(&quot;&amp;lt;{0}:AspNetPagerrunat=server&amp;gt;&amp;lt;/{0}:AspNetPager&amp;gt;&quot;)]&lt;BR&gt;publicclassAspNetPager:Panel,INamingContainer,IPostBackEventHandler,IPostBackDataHandler&lt;BR&gt;{&lt;BR&gt;privatestringcssClassName;&lt;BR&gt;privatestringurlPageIndexName=&quot;page&quot;;&lt;BR&gt;privateboolurlPaging=false;&lt;BR&gt;privatestringinputPageIndex;&lt;BR&gt;privatestringcurrentUrl=null;&lt;BR&gt;privateNameValueCollectionurlParams=null;#regionProperties#regionNavigationButtons///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置一个值，该值批示当鼠标指针悬停在导航按钮上时是否显示工具提示。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Category(&quot;导航按钮&quot;),DefaultValue(true),Description(&quot;指定当鼠标停留在导航按钮上时，是否显示工具提示&quot;)]&lt;BR&gt;publicboolShowNavigationToolTip&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectobj=ViewState[&quot;ShowNavigationToolTip&quot;];&lt;BR&gt;return(obj==null)?true:(bool)obj;&lt;BR&gt;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;ViewState[&quot;ShowNavigationToolTip&quot;]=value;&lt;BR&gt;}&lt;BR&gt;}///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置导航按钮工具提示文本的格式。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Category(&quot;导航按钮&quot;),&lt;BR&gt;DefaultValue(&quot;转到第{0}页&quot;),&lt;BR&gt;Description(&quot;页导航按钮工具提示文本的格式&quot;)]&lt;BR&gt;publicstringNavigationToolTipTextFormatString&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectobj=ViewState[&quot;NavigationToolTipTextFormatString&quot;];&lt;BR&gt;return(obj==null)?&quot;转到第{0}页&quot;:(string)obj;&lt;BR&gt;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;stringtip=value;&lt;BR&gt;if(tip.Trim().Length&amp;lt;1&amp;amp;&amp;amp;tip.IndexOf(&quot;{0}&quot;)&amp;lt;0)&lt;BR&gt;tip=&quot;{0}&quot;;&lt;BR&gt;ViewState[&quot;NavigationToolTipTextFormatString&quot;]=tip;&lt;BR&gt;}&lt;BR&gt;}///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置一个值，该值指示是否将页索引按钮用中文数字代替。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;///&amp;lt;remarks&amp;gt;&lt;BR&gt;///将该值设为true并且未使用图片按钮时，页索引按钮中的数值1、2、3等将会被中文字符一、二、三等代替。&lt;BR&gt;///&amp;lt;/remarks&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Category(&quot;导航按钮&quot;),&lt;BR&gt;DefaultValue(false),&lt;BR&gt;Description(&quot;是否将页索引数值按钮用中文数字一、二、三等代替&quot;)]&lt;BR&gt;publicboolChinesePageIndex&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectobj=ViewState[&quot;ChinesePageIndex&quot;];&lt;BR&gt;return(obj==null)?false:(bool)obj;&lt;BR&gt;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;ViewState[&quot;ChinesePageIndex&quot;]=value;&lt;BR&gt;}&lt;BR&gt;}///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置页索引数值导航按钮上文字的显示格式。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;///&amp;lt;value&amp;gt;&lt;BR&gt;///字符串，指定页索引数值按钮上文字的显示格式，默认值为&amp;lt;seecref=&quot;String.Empty&quot;/&amp;gt;，即未设置该属性。&amp;lt;/value&amp;gt;&lt;BR&gt;///&amp;lt;remarks&amp;gt;&lt;BR&gt;///使用NumericButtonTextFormatString属性指定页索引数值按钮的显示格式，如未设置该值时索引按钮文本将会是：123...，设置该值将改变索引按钮文本的显示格式，&lt;BR&gt;///如将该值设为“[{0}]”则索引文本会显示为：[1][2][3]...，将该值设为“-{0}-”则会使索引文本变为：-1--2--3-...。&lt;BR&gt;///&amp;lt;/remarks&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;DefaultValue(&quot;&quot;),&lt;BR&gt;Category(&quot;导航按钮&quot;),&lt;BR&gt;Description(&quot;页索引数值按钮上文字的显示格式&quot;)]&lt;BR&gt;publicstringNumericButtonTextFormatString&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectobj=ViewState[&quot;NumericButtonTextFormatString&quot;];&lt;BR&gt;return(obj==null)?String.Empty:(string)obj;&lt;BR&gt;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;ViewState[&quot;NumericButtonTextFormatString&quot;]=value;&lt;BR&gt;}&lt;BR&gt;}///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置分页导航按钮的类型，即使用文字还是图片。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;///&amp;lt;remarks&amp;gt;&lt;BR&gt;///要使用图片按钮，您需要准备以下图片：从0到9的十个数值图片（当ShowPageIndex设为true时），第一页、上一页、下一页、最后一页及更多页（...）五个按钮图片（当ShowFirstLast及ShowPrevNext都设为true时），&lt;BR&gt;///若需要使当前页索引的数值按钮不同于别的页索引数值按钮，则还需准备当前页索引的按钮图片；&lt;BR&gt;///若需要使已禁用的第一页、上一页、下一页及最后一页按钮图片不同于正常的按钮图片，则还需准备这四个按钮在禁用状态下的图片；&lt;BR&gt;///&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;图片文件的命名规则如下：&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;BR&gt;///&amp;lt;p&amp;gt;从0到9十张数值按钮图片必须命名为“数值 ButtonImageNameExtension ButtonImageExtension”，其中的ButtonImageNameExtension可以不用设置，&lt;BR&gt;///ButtonImageExtension是图片文件的后缀名，如.gif或.jpg等可以在浏览器中显示的任何图片文件类型。如页索引“1”的图片文件可命名为“1.gif”或“1.jpg”，&lt;BR&gt;///当您有两套或更多套图片文件时，可以通过指定ButtonImageNameExtension属性值来区分不同套的图片，如第一套图片可以不用设ButtonImageNameExtension，则图片文件名类似于“1.gif”、“2.gif”等等，而第二套图片则设置ButtonImageNameExtension为“f”，图片文件名类似于“1f.gif”，“2f.gif”等等。&amp;lt;/p&amp;gt;&lt;BR&gt;///&amp;lt;p&amp;gt;第一页按钮的图片文件名以“first”开头，上一页按钮图片名以“prev”开头，下一页按钮图片名以“next”开头，最后一页按钮图片名以“last”开头，更多页按钮图片名以“more”开头，是否使用ButtonImageNameExtension取决于数值按钮的设置及是否有更多套图片。&amp;lt;/p&amp;gt;&lt;BR&gt;///&amp;lt;/remarks&amp;gt;&lt;BR&gt;///&amp;lt;example&amp;gt;&lt;BR&gt;///以下代码片段示例如果使用图片按钮：&lt;BR&gt;///&amp;lt;p&amp;gt;&lt;BR&gt;///&amp;lt;code&amp;gt;&amp;lt;![CDATA[&lt;BR&gt;///&amp;lt;Webdiyer:AspNetPagerrunat=&quot;server&quot;&lt;BR&gt;///id=&quot;pager1&quot;&lt;BR&gt;///OnPageChanged=&quot;ChangePage&quot;&lt;BR&gt;///PagingButtonType=&quot;image&quot;&lt;BR&gt;///ImagePath=&quot;images&quot;&lt;BR&gt;///ButtonImageNameExtension=&quot;n&quot;&lt;BR&gt;///DisabledButtonImageNameExtension=&quot;g&quot;&lt;BR&gt;///ButtonImageExtension=&quot;gif&quot;&lt;BR&gt;///CpiButtonImageNameExtension=&quot;r&quot;&lt;BR&gt;///PagingButtonSpacing=5/&amp;gt;&lt;BR&gt;///]]&amp;gt;&lt;BR&gt;///&amp;lt;/code&amp;gt;&lt;BR&gt;///&amp;lt;/p&amp;gt;&lt;BR&gt;///&amp;lt;/example&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;DefaultValue(PagingButtonType.Text),&lt;BR&gt;Category(&quot;导航按钮&quot;),&lt;BR&gt;Description(&quot;分页导航按钮的类型，是使用文字还是图片&quot;)]&lt;BR&gt;publicPagingButtonTypePagingButtonType&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectobj=ViewState[&quot;PagingButtonType&quot;];&lt;BR&gt;return(obj==null)?PagingButtonType.Text:(PagingButtonType)obj;&lt;BR&gt;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;ViewState[&quot;PagingButtonType&quot;]=value;&lt;BR&gt;}&lt;BR&gt;}///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置页导航数值按钮的类型，该值仅当PagingButtonType设为Image时才有效。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;///&amp;lt;remarks&amp;gt;&lt;BR&gt;///当您将PagingButtonType设为Image当又不想让页索引数值按钮使用图片时，可以将该值设为Text，这会使页索引数据按钮使用文本而不是图片按钮。&lt;BR&gt;///&amp;lt;/remarks&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;DefaultValue(PagingButtonType.Text),&lt;BR&gt;Category(&quot;导航按钮&quot;),&lt;BR&gt;Description(&quot;页导航数值按钮的类型&quot;)]&lt;BR&gt;publicPagingButtonTypeNumericButtonType&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectobj=ViewState[&quot;NumericButtonType&quot;];&lt;BR&gt;return(obj==null)?PagingButtonType:(PagingButtonType)obj;&lt;BR&gt;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;ViewState[&quot;NumericButtonType&quot;]=value;&lt;BR&gt;}&lt;BR&gt;}///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置第一页、上一页、下一页和最后一页按钮的类型，该值仅当PagingButtonType设为Image时才有效。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;///&amp;lt;remarks&amp;gt;&lt;BR&gt;///当您将PagingButtonType设为Image但又不想让第一页、下一页、下一页和最后一页按钮使用图片，则可以将该值设为Text，这会使前面的四个按钮使用文本而不是图片按钮。&lt;BR&gt;///&amp;lt;/remarks&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Category(&quot;导航按钮&quot;),&lt;BR&gt;DefaultValue(PagingButtonType.Text),&lt;BR&gt;Description(&quot;第一页、上一页、下一页和最后一页按钮的类型&quot;)]&lt;BR&gt;publicPagingButtonTypeNavigationButtonType&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectobj=ViewState[&quot;NavigationButtonType&quot;];&lt;BR&gt;return(obj==null)?PagingButtonType:(PagingButtonType)obj;&lt;BR&gt;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;ViewState[&quot;NavigationButtonType&quot;]=value;&lt;BR&gt;}&lt;BR&gt;}///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置“更多页”（...）按钮的类型，该值仅当PagingButtonType设为Image时才有效。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;///&amp;lt;remarks&amp;gt;&lt;BR&gt;///当您将PagingButtonType设为Image但又不想让更多页（...）按钮使用图片时，可以将此值设为Text，这会使更多页按钮使用文本而不是图片按钮。&lt;BR&gt;///&amp;lt;/remarks&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Category(&quot;导航按钮&quot;),&lt;BR&gt;DefaultValue(PagingButtonType.Text),&lt;BR&gt;Description(&quot;“更多页”（...）按钮的类型&quot;)]&lt;BR&gt;publicPagingButtonTypeMoreButtonType&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectobj=ViewState[&quot;MoreButtonType&quot;];&lt;BR&gt;return(obj==null)?PagingButtonType:(PagingButtonType)obj;&lt;BR&gt;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;ViewState[&quot;MoreButtonType&quot;]=value;&lt;BR&gt;}&lt;BR&gt;}///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置分页导航按钮之间的间距。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Category(&quot;导航按钮&quot;),&lt;BR&gt;DefaultValue(typeof(Unit),&quot;5px&quot;),&lt;BR&gt;Description(&quot;分页导航按钮之间的间距&quot;)]&lt;BR&gt;publicUnitPagingButtonSpacing&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectobj=ViewState[&quot;PagingButtonSpacing&quot;];&lt;BR&gt;return(obj==null)?Unit.Pixel(5):(Unit.Parse(obj.ToString()));&lt;BR&gt;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;ViewState[&quot;PagingButtonSpacing&quot;]=value;&lt;BR&gt;}&lt;BR&gt;}///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置一个值，该值指示是否在页导航元素中显示第一页和最后一页按钮。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Description(&quot;是否在页导航元素中显示第一页和最后一页按钮&quot;),&lt;BR&gt;Category(&quot;导航按钮&quot;),&lt;BR&gt;DefaultValue(true)]&lt;BR&gt;publicboolShowFirstLast&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectobj=ViewState[&quot;ShowFirstLast&quot;];&lt;BR&gt;return(obj==null)?true:(bool)obj;&lt;BR&gt;}&lt;BR&gt;set{ViewState[&quot;ShowFirstLast&quot;]=value;}&lt;BR&gt;}///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置一个值，该值指示是否在页导航元素中显示上一页和下一页按钮。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Description(&quot;是否在页导航元素中显示上一页和下一页按钮&quot;),&lt;BR&gt;Category(&quot;导航按钮&quot;),&lt;BR&gt;DefaultValue(true)]&lt;BR&gt;publicboolShowPrevNext&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectobj=ViewState[&quot;ShowPrevNext&quot;];&lt;BR&gt;return(obj==null)?true:(bool)obj;&lt;BR&gt;}&lt;BR&gt;set{ViewState[&quot;ShowPrevNext&quot;]=value;}&lt;BR&gt;}///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置一个值，该值指示是否在页导航元素中显示页索引数值按钮。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Description(&quot;是否在页导航元素中显示数值按钮&quot;),&lt;BR&gt;Category(&quot;导航按钮&quot;),&lt;BR&gt;DefaultValue(true)]&lt;BR&gt;publicboolShowPageIndex&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectobj=ViewState[&quot;ShowPageIndex&quot;];&lt;BR&gt;return(obj==null)?true:(bool)obj;&lt;BR&gt;}&lt;BR&gt;set{ViewState[&quot;ShowPageIndex&quot;]=value;}&lt;BR&gt;}///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置为第一页按钮显示的文本。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Description(&quot;第一页按钮上显示的文本&quot;),&lt;BR&gt;Category(&quot;导航按钮&quot;),&lt;BR&gt;DefaultValue(&quot;&amp;lt;fontface=&quot;webdings&quot;&amp;gt;9&amp;lt;/font&amp;gt;&quot;)]&lt;BR&gt;publicstringFirstPageText&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectobj=ViewState[&quot;FirstPageText&quot;];&lt;BR&gt;return(obj==null)?&quot;&amp;lt;fontface=&quot;webdings&quot;&amp;gt;9&amp;lt;/font&amp;gt;&quot;:(string)obj;&lt;BR&gt;}&lt;BR&gt;set{ViewState[&quot;FirstPageText&quot;]=value;}&lt;BR&gt;}///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置为上一页按钮显示的文本。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Description(&quot;上一页按钮上显示的文本&quot;),&lt;BR&gt;Category(&quot;导航按钮&quot;),&lt;BR&gt;DefaultValue(&quot;&amp;lt;fontface=&quot;webdings&quot;&amp;gt;3&amp;lt;/font&amp;gt;&quot;)]&lt;BR&gt;publicstringPrevPageText&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectobj=ViewState[&quot;PrevPageText&quot;];&lt;BR&gt;return(obj==null)?&quot;&amp;lt;fontface=&quot;webdings&quot;&amp;gt;3&amp;lt;/font&amp;gt;&quot;:(string)obj;&lt;BR&gt;}&lt;BR&gt;set{ViewState[&quot;PrevPageText&quot;]=value;}&lt;BR&gt;}///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置为下一页按钮显示的文本。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Description(&quot;下一页按钮上显示的文本&quot;),&lt;BR&gt;Category(&quot;导航按钮&quot;),&lt;BR&gt;DefaultValue(&quot;&amp;lt;fontface=&quot;webdings&quot;&amp;gt;4&amp;lt;/font&amp;gt;&quot;)]&lt;BR&gt;publicstringNextPageText&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectobj=ViewState[&quot;NextPageText&quot;];&lt;BR&gt;return(obj==null)?&quot;&amp;lt;fontface=&quot;webdings&quot;&amp;gt;4&amp;lt;/font&amp;gt;&quot;:(string)obj;&lt;BR&gt;}&lt;BR&gt;set{ViewState[&quot;NextPageText&quot;]=value;}&lt;BR&gt;}///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置为最后一页按钮显示的文本。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Description(&quot;最后一页按钮上显示的文本&quot;),&lt;BR&gt;Category(&quot;导航按钮&quot;),&lt;BR&gt;DefaultValue(&quot;&amp;lt;fontface=&quot;webdings&quot;&amp;gt;:&amp;lt;/font&amp;gt;&quot;)]&lt;BR&gt;publicstringLastPageText&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectobj=ViewState[&quot;LastPageText&quot;];&lt;BR&gt;return(obj==null)?&quot;&amp;lt;fontface=&quot;webdings&quot;&amp;gt;:&amp;lt;/font&amp;gt;&quot;:(string)obj;&lt;BR&gt;}&lt;BR&gt;set{ViewState[&quot;LastPageText&quot;]=value;}&lt;BR&gt;}///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置在&amp;lt;seecref=&quot;AspNetPager&quot;/&amp;gt;控件的页导航元素中同时显示的数值按钮的数目。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Description(&quot;要显示的页索引数值按钮的数目&quot;),&lt;BR&gt;Category(&quot;导航按钮&quot;),&lt;BR&gt;DefaultValue(10)]&lt;BR&gt;publicintNumericButtonCount&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectobj=ViewState[&quot;NumericButtonCount&quot;];&lt;BR&gt;return(obj==null)?10:(int)obj;&lt;BR&gt;}&lt;BR&gt;set{ViewState[&quot;NumericButtonCount&quot;]=value;}&lt;BR&gt;}///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置一个值，该值指定是否显示已禁用的按钮。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;///&amp;lt;remarks&amp;gt;&lt;BR&gt;///该值用来指定是否显示已禁用的分页导航按钮，当当前页为第一页时，第一页和上一页按钮将被禁用，当当前页为最后一页时，下一页和最后一页按钮将被禁用，被禁用的按钮没有链接，在按钮上点击也不会有任何作用。&lt;BR&gt;///&amp;lt;/remarks&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Category(&quot;导航按钮&quot;),&lt;BR&gt;Description(&quot;是否显示已禁用的按钮&quot;),&lt;BR&gt;DefaultValue(true)]&lt;BR&gt;publicboolShowDisabledButtons&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectobj=ViewState[&quot;ShowDisabledButtons&quot;];&lt;BR&gt;return(obj==null)?true:(bool)obj;&lt;BR&gt;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;ViewState[&quot;ShowDisabledButtons&quot;]=value;&lt;BR&gt;}&lt;BR&gt;}&lt;BR&gt;#endregion&lt;BR&gt;#regionImageButtons&lt;/P&gt;&lt;P&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置当使用图片按钮时，图片文件的路径。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Category(&quot;图片按钮&quot;),&lt;BR&gt;Description(&quot;当使用图片按钮时，指定图片文件的路径&quot;),&lt;BR&gt;DefaultValue(null)]&lt;BR&gt;publicstringImagePath&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;stringimgPath=(string)ViewState[&quot;ImagePath&quot;];&lt;BR&gt;if(imgPath!=null)&lt;BR&gt;imgPath=this.ResolveUrl(imgPath);&lt;BR&gt;returnimgPath;&lt;BR&gt;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;stringimgPath=value.Trim().Replace(&quot;&quot;,&quot;/&quot;);&lt;BR&gt;ViewState[&quot;ImagePath&quot;]=(imgPath.EndsWith(&quot;/&quot;))?imgPath:imgPath &quot;/&quot;;&lt;BR&gt;}&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置当使用图片按钮时，图片的类型，如gif或jpg，该值即图片文件的后缀名。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Category(&quot;图片按钮&quot;),&lt;BR&gt;DefaultValue(&quot;.gif&quot;),&lt;BR&gt;Description(&quot;当使用图片按钮时，图片的类型，如gif或jpg，该值即图片文件的后缀名&quot;)]&lt;BR&gt;publicstringButtonImageExtension&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectobj=ViewState[&quot;ButtonImageExtension&quot;];&lt;BR&gt;return(obj==null)?&quot;.gif&quot;:(string)obj;&lt;BR&gt;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;stringext=value.Trim();&lt;BR&gt;ViewState[&quot;ButtonImageExtension&quot;]=(ext.StartsWith(&quot;.&quot;))?ext:(&quot;.&quot; ext);&lt;BR&gt;}&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置自定义图片文件名的后缀字符串，以区分不同类型的按钮图片。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;///&amp;lt;remarks&amp;gt;&amp;lt;note&amp;gt;注意：&amp;lt;/note&amp;gt;该值不是文件后缀名，而是为区分不同的图片文件而在图片名中加入的字符串，如：&lt;BR&gt;///当前有两套按钮图片，其中一套中的“1”的图片名可为“1f.gif”，另一套中的“1”的图片名可起为“1n.gif”，其中的f和n即为ButtonImageNameExtension。&amp;lt;/remarks&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;DefaultValue(null),&lt;BR&gt;Category(&quot;图片按钮&quot;),&lt;BR&gt;Description(&quot;自定义图片文件名的后缀字符串（非文件后缀名），如图片“1f.gif”的ButtonImageNameExtension即为“f”&quot;)]&lt;BR&gt;publicstringButtonImageNameExtension&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;return(string)ViewState[&quot;ButtonImageNameExtension&quot;];&lt;BR&gt;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;ViewState[&quot;ButtonImageNameExtension&quot;]=value;&lt;BR&gt;}&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置当前页索引按钮的图片名后缀。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;///&amp;lt;remarks&amp;gt;&lt;BR&gt;///当&amp;lt;seecref=&quot;PagingButtonType&quot;/&amp;gt;设为Image时，该属性允许您设置当前页索引数值按钮使用的图片名后缀字符，因此可以使当前页索引按钮与其它页索引按钮使用不同的图片，若未设置该值，则默认值为&amp;lt;seecref=&quot;ButtonImageNameExtension&quot;/&amp;gt;，即当前页索引按钮与其它页索引按钮使用相同的图片。&lt;BR&gt;///&amp;lt;/remarks&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;DefaultValue(null),&lt;BR&gt;Category(&quot;图片按钮&quot;),&lt;BR&gt;Description(&quot;当前页索引按钮的图片名后缀字符串&quot;)]&lt;BR&gt;publicstringCpiButtonImageNameExtension&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectobj=ViewState[&quot;CpiButtonImageNameExtension&quot;];&lt;BR&gt;return(obj==null)?ButtonImageNameExtension:(string)obj;&lt;BR&gt;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;ViewState[&quot;CpiButtonImageNameExtension&quot;]=value;&lt;BR&gt;}&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置已禁用的页导航按钮图片名后缀字符串。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;///&amp;lt;remarks&amp;gt;&lt;BR&gt;///当&amp;lt;seecref=&quot;PagingButtonType&quot;/&amp;gt;设为Image时，该值允许您设置已禁用（即没有链接，因而点击后无反应）的页导航按钮（包括第一页、上一页、下一页、最后一页四个按钮）的图片文件名后缀字符串，因此可以使已禁用的页导航按钮不同于正常的页导航按钮。若未设置该值，则默认值为&amp;lt;seecref=&quot;ButtonImageNameExtension&quot;/&amp;gt;，即已禁用的页导航按钮与正常的页导航按钮使用相同的图片。&lt;BR&gt;///&amp;lt;/remarks&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;DefaultValue(null),&lt;BR&gt;Category(&quot;图片按钮&quot;),&lt;BR&gt;Description(&quot;已禁用的页导航按钮的图片名后缀字符串&quot;)]&lt;BR&gt;publicstringDisabledButtonImageNameExtension&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectobj=ViewState[&quot;DisabledButtonImageNameExtension&quot;];&lt;BR&gt;return(obj==null)?ButtonImageNameExtension:(string)obj;&lt;BR&gt;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;ViewState[&quot;DisabledButtonImageNameExtension&quot;]=value;&lt;BR&gt;}&lt;BR&gt;}&lt;BR&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///指定当使用图片按钮时，图片的对齐方式。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;/P&gt;&lt;P&gt;[Browsable(true),&lt;BR&gt;Description(&quot;指定当使用图片按钮时，图片的对齐方式&quot;),&lt;BR&gt;DefaultValue(ImageAlign.Baseline),&lt;BR&gt;Category(&quot;图片按钮&quot;)]&lt;BR&gt;publicImageAlignButtonImageAlign&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectobj=ViewState[&quot;ButtonImageAlign&quot;];&lt;BR&gt;return(obj==null)?ImageAlign.Baseline:(ImageAlign)obj;&lt;BR&gt;}&lt;BR&gt;set{ViewState[&quot;ButtonImageAlign&quot;]=value;}&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;&lt;BR&gt;#endregion&lt;/P&gt;&lt;P&gt;#regionPaging&lt;/P&gt;&lt;P&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置是否启用url来传递分页信息。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;///&amp;lt;remarks&amp;gt;&lt;BR&gt;///启用Url分页方式是将用户欲访问的页索引通过Url来传递，由于该分页方式不使用页面向自身回发来传递数据，&lt;BR&gt;///所以每次分页时所有的数据都恢复为初始值或需要重新获取。使用Url分页方式不支持动态改变分页控件的属性值，&lt;BR&gt;///因暂时无法将新的属性值通过Url来传递给下一页。&lt;BR&gt;///&amp;lt;/remarks&amp;gt;&lt;BR&gt;///&amp;lt;example&amp;gt;以下示例说明如何用AspNetPager的Url分页方式对DataGrid进行分页（使用Access数据库）：&lt;BR&gt;///&amp;lt;code&amp;gt;&amp;lt;![CDATA[&lt;BR&gt;///&amp;lt;@RegisterTagPrefix=&quot;Webdiyer&quot;Namespace=&quot;Wuqi.Webdiyer&quot;Assembly=&quot;aspnetpager&quot;&amp;gt;&lt;BR&gt;///&amp;lt;@ImportNamespace=&quot;System.Data.OleDb&quot;&amp;gt;&lt;BR&gt;///&amp;lt;@ImportNamespace=&quot;System.Data&quot;&amp;gt;&lt;BR&gt;///&amp;lt;@PageLanguage=&quot;C#&quot;debug=true&amp;gt;&lt;BR&gt;///&amp;lt;HTML&amp;gt;&lt;BR&gt;///&amp;lt;HEAD&amp;gt;&lt;BR&gt;///&amp;lt;TITLE&amp;gt;WelcometoWebdiyer.com&amp;lt;/TITLE&amp;gt;&lt;BR&gt;///&amp;lt;scriptrunat=&quot;server&quot;&amp;gt;&lt;BR&gt;///OleDbConnectionconn;&lt;BR&gt;///OleDbCommandcmd;&lt;BR&gt;///voidPage_Load(objectsrc,EventArgse){&lt;BR&gt;///conn=newOleDbConnection(&quot;Provider=Microsoft.Jet.OLEDB.4.0;DataSource=&quot; Server.MapPath(&quot;access/aspnetpager.mdb&quot;));&lt;BR&gt;///if(!Page.IsPostBack){&lt;BR&gt;///cmd=newOleDbCommand(&quot;selectcount(newsid)fromwqnews&quot;,conn);&lt;BR&gt;///conn.Open();&lt;BR&gt;///pager.RecordCount=(int)cmd.ExecuteScalar();&lt;BR&gt;///conn.Close();&lt;BR&gt;///BindData();&lt;BR&gt;///}&lt;BR&gt;///}&lt;BR&gt;///&lt;BR&gt;///voidBindData(){&lt;BR&gt;///cmd=newOleDbCommand(&quot;selectnewsid,heading,source,addtimefromwqnewsorderbyaddtimedesc&quot;,conn);&lt;BR&gt;///OleDbDataAdapteradapter=newOleDbDataAdapter(cmd);&lt;BR&gt;///DataSetds=newDataSet();&lt;BR&gt;///adapter.Fill(ds,pager.PageSize*(pager.CurrentPageIndex-1),pager.PageSize,&quot;news&quot;);&lt;BR&gt;///dg.DataSource=ds.Tables[&quot;news&quot;];&lt;BR&gt;///dg.DataBind();&lt;BR&gt;///}&lt;BR&gt;///&lt;BR&gt;///voidChangePage(objectsrc,PageChangedEventArgse){&lt;BR&gt;///pager.CurrentPageIndex=e.NewPageIndex;&lt;BR&gt;///BindData();&lt;BR&gt;///}&lt;BR&gt;///&lt;BR&gt;///&amp;lt;/script&amp;gt;&lt;BR&gt;///&amp;lt;metahttp-equiv=&quot;Content-Language&quot;content=&quot;zh-cn&quot;&amp;gt;&lt;BR&gt;///&amp;lt;metahttp-equiv=&quot;content-type&quot;content=&quot;text/html;charset=gb2312&quot;&amp;gt;&lt;BR&gt;///&amp;lt;METANAME=&quot;Generator&quot;CONTENT=&quot;EditPlus&quot;&amp;gt;&lt;BR&gt;///&amp;lt;METANAME=&quot;Author&quot;CONTENT=&quot;Webdiyer(yhaili@21cn.com)&quot;&amp;gt;&lt;BR&gt;///&amp;lt;/HEAD&amp;gt;&lt;BR&gt;///&amp;lt;body&amp;gt;&lt;BR&gt;///&amp;lt;formrunat=&quot;server&quot;ID=&quot;Form1&quot;&amp;gt;&lt;BR&gt;///&amp;lt;h2align=&quot;center&quot;&amp;gt;AspNetPager分页示例&amp;lt;/h2&amp;gt;&lt;BR&gt;///&amp;lt;asp:DataGridid=&quot;dg&quot;runat=&quot;server&quot;&lt;BR&gt;///Width=&quot;760&quot;CellPadding=&quot;4&quot;Align=&quot;center&quot;/&amp;gt;&lt;BR&gt;///&lt;BR&gt;///&amp;lt;Webdiyer:AspNetPagerrunat=&quot;server&quot;id=&quot;pager&quot;&lt;BR&gt;///OnPageChanged=&quot;ChangePage&quot;&lt;BR&gt;///HorizontalAlign=&quot;center&quot;&lt;BR&gt;///style=&quot;MARGIN-TOP:10px;FONT-SIZE:16px&quot;&lt;BR&gt;///PageSize=&quot;8&quot;&lt;BR&gt;///ShowInputBox=&quot;always&quot;&lt;BR&gt;///SubmitButtonStyle=&quot;border:1pxsolid#000066;height:20px;width:30px&quot;&lt;BR&gt;///InputBoxStyle=&quot;border:1px#0000FFsolid;text-align:center&quot;&lt;BR&gt;///SubmitButtonText=&quot;转到&quot;&lt;BR&gt;///UrlPaging=&quot;true&quot;&lt;BR&gt;///UrlPageIndexName=&quot;pageindex&quot;/&amp;gt;&lt;BR&gt;///&amp;lt;/form&amp;gt;&lt;BR&gt;///&amp;lt;/body&amp;gt;&lt;BR&gt;///&amp;lt;/HTML&amp;gt;&lt;BR&gt;///]]&amp;gt;&amp;lt;/code&amp;gt;&lt;BR&gt;///&amp;lt;/example&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Category(&quot;分页&quot;),&lt;BR&gt;DefaultValue(false),&lt;BR&gt;Description(&quot;是否使用url传递分页信息的方式来分页&quot;)]&lt;BR&gt;publicboolUrlPaging&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;returnurlPaging;&lt;BR&gt;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;urlPaging=value;&lt;BR&gt;}&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置当启用Url分页方式时，在url中表示要传递的页索引的参数的名称。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;///&amp;lt;remarks&amp;gt;&lt;BR&gt;///该属性允许您自定义通过Url传递页索引时表示要传递的页索引的参数的名称，以避免与现有的参数名重复。&lt;BR&gt;///&amp;lt;p&amp;gt;该属性的默认值是“page”，即通过Url分页时，显示在浏览器地址栏中的Url类似于：&amp;lt;/p&amp;gt;http://www.webdiyer.com/aspnetpager/samples/datagrid_url.aspx?page=2&lt;BR&gt;///&amp;lt;p&amp;gt;如将该值改为“pageindex”，则上面的Url将变为：&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;http://www.webdiyer.com/aspnetpager/samples/datagrid_url.aspx?pageindex=2&amp;lt;/p&amp;gt;&lt;BR&gt;///&amp;lt;/remarks&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;DefaultValue(&quot;page&quot;),&lt;BR&gt;Category(&quot;分页&quot;),&lt;BR&gt;Description(&quot;当启用Url分页方式时，显示在url中表示要传递的页索引的参数的名称&quot;)]&lt;BR&gt;publicstringUrlPageIndexName&lt;BR&gt;{&lt;BR&gt;get{returnurlPageIndexName;}&lt;BR&gt;set{urlPageIndexName=value;}&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置当前显示页的索引。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;///&amp;lt;remarks&amp;gt;使用此属性来确定在AspNetPager控件中当前显示的页，当前显示的页的数字索引将以红色字体加粗显示。此属性还用于以编程的方式控制所显示的页。&lt;BR&gt;///&amp;lt;p&amp;gt;　&amp;lt;b&amp;gt;注意：&amp;lt;/b&amp;gt;不同于DataGrid控件的CurrentPageIndex，AspNetPager的CurrentPageIndex属性是从1开始的。&amp;lt;/p&amp;gt;&amp;lt;/remarks&amp;gt;&lt;BR&gt;[ReadOnly(true),&lt;BR&gt;Browsable(false),&lt;BR&gt;Description(&quot;当前显示页的索引&quot;),&lt;BR&gt;Category(&quot;分页&quot;),&lt;BR&gt;DefaultValue(1),&lt;BR&gt;DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]&lt;BR&gt;publicintCurrentPageIndex&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectcpage=ViewState[&quot;CurrentPageIndex&quot;];&lt;BR&gt;intpindex=(cpage==null)?1:(int)cpage;&lt;BR&gt;if(pindex&amp;gt;PageCount&amp;amp;&amp;amp;PageCount&amp;gt;0)&lt;BR&gt;returnPageCount;&lt;BR&gt;elseif(pindex&amp;lt;1)&lt;BR&gt;return1;&lt;BR&gt;returnpindex;&lt;BR&gt;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;intcpage=value;&lt;BR&gt;if(cpage&amp;lt;1)&lt;BR&gt;cpage=1;&lt;BR&gt;elseif(cpage&amp;gt;this.PageCount)&lt;BR&gt;cpage=this.PageCount;&lt;BR&gt;ViewState[&quot;CurrentPageIndex&quot;]=cpage;&lt;BR&gt;}&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置需要分页的所有记录的总数。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;///&amp;lt;remarks&amp;gt;&lt;BR&gt;///当页面第一次加载时，应以编程方式将从存储过程或Sql语句中返回的数据表中所有要分页的记录的总数赋予该属性，AspNetPager会将其保存的ViewState中并在页面回发时从ViewState中获取该值，因此避免了每次分页都要访问数据库而影响分页性能。AspNetPager根据要分页的所有数据的总项数和&amp;lt;seecref=&quot;PageSize&quot;/&amp;gt;属性来计算显示所有数据需要的总页数，即&amp;lt;seecref=&quot;PageCount&quot;/&amp;gt;的值。&lt;BR&gt;///&amp;lt;/remarks&amp;gt;&lt;BR&gt;///&amp;lt;example&amp;gt;&lt;BR&gt;///下面的示例显示如何以编程方式将从Sql语句返回的记录总数赋给该属性：&lt;BR&gt;///&amp;lt;p&amp;gt;&lt;BR&gt;///&amp;lt;code&amp;gt;&amp;lt;![CDATA[&lt;BR&gt;///&amp;lt;HTML&amp;gt;&lt;BR&gt;///&amp;lt;HEAD&amp;gt;&lt;BR&gt;///&amp;lt;TITLE&amp;gt;WelcometoWebdiyer.com&amp;lt;/TITLE&amp;gt;&lt;BR&gt;///&amp;lt;scriptrunat=&quot;server&quot;&amp;gt;&lt;BR&gt;///SqlConnectionconn;&lt;BR&gt;///SqlCommandcmd;&lt;BR&gt;///voidPage_Load(objectsrc,EventArgse)&lt;BR&gt;///{&lt;BR&gt;///conn=newSqlConnection(ConfigurationSettings.AppSettings[&quot;ConnStr&quot;]);&lt;BR&gt;///if(!Page.IsPostBack)&lt;BR&gt;///{&lt;BR&gt;///cmd=newSqlCommand(&quot;selectcount(id)fromnews&quot;,conn);&lt;BR&gt;///conn.Open();&lt;BR&gt;///pager.RecordCount=(int)cmd.ExecuteScalar();&lt;BR&gt;///conn.Close();&lt;BR&gt;///BindData();&lt;BR&gt;///}&lt;BR&gt;///}&lt;BR&gt;///&lt;BR&gt;///voidBindData()&lt;BR&gt;///{&lt;BR&gt;///cmd=newSqlCommand(&quot;GetPagedNews&quot;,conn);&lt;BR&gt;///cmd.CommandType=CommandType.StoredProcedure;&lt;BR&gt;///cmd.Parameters.Add(&quot;@pageindex&quot;,pager.CurrentPageIndex);&lt;BR&gt;///cmd.Parameters.Add(&quot;@pagesize&quot;,pager.PageSize);&lt;BR&gt;///conn.Open();&lt;BR&gt;///dataGrid1.DataSource=cmd.ExecuteReader();&lt;BR&gt;///dataGrid1.DataBind();&lt;BR&gt;///conn.Close();&lt;BR&gt;///}&lt;BR&gt;///voidChangePage(objectsrc,PageChangedEventArgse)&lt;BR&gt;///{&lt;BR&gt;///pager.CurrentPageIndex=e.NewPageIndex;&lt;BR&gt;///BindData();&lt;BR&gt;///}&lt;BR&gt;///&amp;lt;/script&amp;gt;&lt;BR&gt;///&amp;lt;metahttp-equiv=&quot;Content-Language&quot;content=&quot;zh-cn&quot;&amp;gt;&lt;BR&gt;///&amp;lt;metahttp-equiv=&quot;content-type&quot;content=&quot;text/html;charset=gb2312&quot;&amp;gt;&lt;BR&gt;///&amp;lt;METANAME=&quot;Generator&quot;CONTENT=&quot;EditPlus&quot;&amp;gt;&lt;BR&gt;///&amp;lt;METANAME=&quot;Author&quot;CONTENT=&quot;Webdiyer(yhaili@21cn.com)&quot;&amp;gt;&lt;BR&gt;///&amp;lt;/HEAD&amp;gt;&lt;BR&gt;///&amp;lt;body&amp;gt;&lt;BR&gt;///&amp;lt;formrunat=&quot;server&quot;ID=&quot;Form1&quot;&amp;gt;&lt;BR&gt;///&amp;lt;asp:DataGridid=&quot;dataGrid1&quot;runat=&quot;server&quot;/&amp;gt;&lt;BR&gt;///&lt;BR&gt;///&amp;lt;Webdiyer:AspNetPagerid=&quot;pager&quot;runat=&quot;server&quot;&lt;BR&gt;///PageSize=&quot;8&quot;&lt;BR&gt;///NumericButtonCount=&quot;8&quot;&lt;BR&gt;///ShowCustomInfoSection=&quot;before&quot;&lt;BR&gt;///ShowInputBox=&quot;always&quot;&lt;BR&gt;///CssClass=&quot;mypager&quot;&lt;BR&gt;///HorizontalAlign=&quot;center&quot;&lt;BR&gt;///OnPageChanged=&quot;ChangePage&quot;/&amp;gt;&lt;BR&gt;///&lt;BR&gt;///&amp;lt;/form&amp;gt;&lt;BR&gt;///&amp;lt;/body&amp;gt;&lt;BR&gt;///&amp;lt;/HTML&amp;gt;&lt;BR&gt;///]]&amp;gt;&lt;BR&gt;///&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;BR&gt;///&amp;lt;p&amp;gt;本示例使用的存储过程代码如下：&amp;lt;/p&amp;gt;&lt;BR&gt;///&amp;lt;code&amp;gt;&amp;lt;![CDATA[&lt;BR&gt;///CreateprocedureGetPagedNews&lt;BR&gt;///(@pagesizeint,&lt;BR&gt;///@pageindexint)&lt;BR&gt;///as&lt;BR&gt;///setnocounton&lt;BR&gt;///declare@indextabletable(idintidentity(1,1),nidint)&lt;BR&gt;///declare@PageLowerBoundint&lt;BR&gt;///declare@PageUpperBoundint&lt;BR&gt;///set@PageLowerBound=(@pageindex-1)*@pagesize&lt;BR&gt;///set@PageUpperBound=@PageLowerBound @pagesize&lt;BR&gt;///setrowcount@PageUpperBound&lt;BR&gt;///insertinto@indextable(nid)selectidfromnewsorderbyaddtimedesc&lt;BR&gt;///selectO.id,O.title,O.source,O.addtimefromnewsO,@indextabletwhereO.id=t.nid&lt;BR&gt;///andt.id&amp;gt;@PageLowerBoundandt.id&amp;lt;=@PageUpperBoundorderbyt.id&lt;BR&gt;///setnocountoff&lt;BR&gt;///GO&lt;BR&gt;///]]&amp;gt;&lt;BR&gt;///&amp;lt;/code&amp;gt;&lt;BR&gt;///&amp;lt;/example&amp;gt;&lt;BR&gt;[Browsable(false),&lt;BR&gt;Description(&quot;要分页的所有记录的总数，该值须在程序运行时设置，默认值为225是为设计时支持而设置的参照值。&quot;),&lt;BR&gt;Category(&quot;Data&quot;),&lt;BR&gt;DefaultValue(225)]&lt;BR&gt;publicintRecordCount&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectobj=ViewState[&quot;Recordcount&quot;];&lt;BR&gt;return(obj==null)?0:(int)obj;&lt;BR&gt;}&lt;BR&gt;set{ViewState[&quot;Recordcount&quot;]=value;}&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取当前页之后未显示的页的总数。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;[Browsable(false),&lt;BR&gt;DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]&lt;BR&gt;publicintPagesRemain&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;returnPageCount-CurrentPageIndex;&lt;BR&gt;}&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置每页显示的项数。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;///&amp;lt;remarks&amp;gt;&lt;BR&gt;///该值获取或设置数据呈现控件每次要显示数据表中的的数据的项数，AspNetPager根据该值和&amp;lt;seecref=&quot;RecordCount&quot;/&amp;gt;来计算显示所有数据需要的总页数，即&amp;lt;seecref=&quot;PageCount&quot;/&amp;gt;的值。&amp;lt;/remarks&amp;gt;&lt;BR&gt;///&amp;lt;example&amp;gt;以下示例将&amp;lt;seecref=&quot;AspNetPager&quot;/&amp;gt;设置为允许每页显示8条数据：&lt;BR&gt;///&amp;lt;code&amp;gt;&lt;BR&gt;///&amp;lt;![CDATA[&lt;BR&gt;///...&lt;BR&gt;///&amp;lt;Webdiyer:AspNetPagerid=&quot;pager&quot;runat=&quot;server&quot;PageSize=8OnPageChanged=&quot;ChangePage&quot;/&amp;gt;&lt;BR&gt;///...&lt;BR&gt;///]]&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/example&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Description(&quot;每页显示的记录数&quot;),&lt;BR&gt;Category(&quot;分页&quot;),&lt;BR&gt;DefaultValue(10)]&lt;BR&gt;publicintPageSize&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectobj=ViewState[&quot;PageSize&quot;];&lt;BR&gt;return(obj==null)?10:(int)obj;&lt;BR&gt;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;ViewState[&quot;PageSize&quot;]=value;&lt;BR&gt;}&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取在当前页之后还未显示的剩余记录的项数。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;[Browsable(false),&lt;BR&gt;DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]&lt;BR&gt;publicintRecordsRemain&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;if(CurrentPageIndex&amp;lt;PageCount)&lt;BR&gt;returnRecordCount-(CurrentPageIndex*PageSize);&lt;BR&gt;return0;}&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;&lt;BR&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取所有要分页的记录需要的总页数。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;[Browsable(false),&lt;BR&gt;DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]&lt;BR&gt;publicintPageCount&lt;BR&gt;{&lt;BR&gt;get{return(int)Math.Ceiling((double)RecordCount/(double)PageSize);}&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;&lt;BR&gt;#endregion&lt;/P&gt;&lt;P&gt;#regionTextBoxandSubmitButton&lt;/P&gt;&lt;P&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置页索引文本框的显示方式。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;///&amp;lt;remarks&amp;gt;&lt;BR&gt;///页索引文件框允许用户手式输入要访问的页的索引，当页数非常多时，显示页索引文本框非常方便用户跳转到指定的页，默认情况下，该文本框只有在总页数大于或等于&amp;lt;seecref=&quot;ShowBoxThreshold&quot;/&amp;gt;的值时才显示，否则不显示，要想该文本框任何时候都显示，请将其值设为Always，若希望任何时候都不显示，则应设为Never。&lt;BR&gt;///&amp;lt;/remarks&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Description(&quot;指定页索引文本框的显示方式&quot;),&lt;BR&gt;Category(&quot;文本框及提交按钮&quot;),&lt;BR&gt;DefaultValue(ShowInputBox.Auto)]&lt;BR&gt;publicShowInputBoxShowInputBox&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectobj=ViewState[&quot;ShowInputBox&quot;];&lt;BR&gt;return(obj==null)?ShowInputBox.Auto:(ShowInputBox)obj;&lt;BR&gt;}&lt;BR&gt;set{ViewState[&quot;ShowInputBox&quot;]=value;}&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置应用于页索引输入文本框的CSS类名。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Category(&quot;文本框及提交按钮&quot;),&lt;BR&gt;DefaultValue(null),&lt;BR&gt;Description(&quot;应用于页索引输入文本框的CSS类名&quot;)]&lt;BR&gt;publicstringInputBoxClass&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;return(string)ViewState[&quot;InputBoxClass&quot;];&lt;BR&gt;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;if(value.Trim().Length&amp;gt;0)&lt;BR&gt;ViewState[&quot;InputBoxClass&quot;]=value;&lt;BR&gt;}&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置页索引输入文本框的CSS样式文本。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;/P&gt;&lt;P&gt;[Browsable(true),&lt;BR&gt;Category(&quot;文本框及提交按钮&quot;),&lt;BR&gt;DefaultValue(null),&lt;BR&gt;Description(&quot;应用于页索引输入文本框的CSS样式文本&quot;)]&lt;BR&gt;publicstringInputBoxStyle&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;return(string)ViewState[&quot;InputBoxStyle&quot;];&lt;BR&gt;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;if(value.Trim().Length&amp;gt;0)&lt;BR&gt;ViewState[&quot;InputBoxStyle&quot;]=value;&lt;BR&gt;}&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置页索引页索引输入文本框前的文本字符串值。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Category(&quot;文本框及提交按钮&quot;),&lt;BR&gt;DefaultValue(null),&lt;BR&gt;Description(&quot;页索引输入文本框前的文本内容字符串&quot;)]&lt;BR&gt;publicstringTextBeforeInputBox&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;return(string)ViewState[&quot;TextBeforeInputBox&quot;];&lt;BR&gt;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;ViewState[&quot;TextBeforeInputBox&quot;]=value;&lt;BR&gt;}&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置页索引文本输入框后的文本内容字符串值。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;DefaultValue(null),&lt;BR&gt;Category(&quot;文本框及提交按钮&quot;),&lt;BR&gt;Description(&quot;页索引输入文本框后的文本内容字符串&quot;)]&lt;BR&gt;publicstringTextAfterInputBox&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;return(string)ViewState[&quot;TextAfterInputBox&quot;];&lt;BR&gt;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;ViewState[&quot;TextAfterInputBox&quot;]=value;&lt;BR&gt;}&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;&lt;BR&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置提交按钮上的文本。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Category(&quot;文本框及提交按钮&quot;),&lt;BR&gt;DefaultValue(&quot;go&quot;),&lt;BR&gt;Description(&quot;提交按钮上的文本&quot;)]&lt;BR&gt;publicstringSubmitButtonText&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectobj=ViewState[&quot;SubmitButtonText&quot;];&lt;BR&gt;return(obj==null)?&quot;go&quot;:(string)obj;&lt;BR&gt;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;if(value.Trim().Length&amp;gt;0)&lt;BR&gt;ViewState[&quot;SubmitButtonText&quot;]=value;&lt;BR&gt;}&lt;BR&gt;}&lt;BR&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置应用于提交按钮的CSS类名。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Category(&quot;文本框及提交按钮&quot;),&lt;BR&gt;DefaultValue(null),&lt;BR&gt;Description(&quot;应用于提交按钮的CSS类名&quot;)]&lt;BR&gt;publicstringSubmitButtonClass&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;return(string)ViewState[&quot;SubmitButtonClass&quot;];&lt;BR&gt;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;ViewState[&quot;SubmitButtonClass&quot;]=value;&lt;BR&gt;}&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置应用于提交按钮的CSS样式。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Category(&quot;文本框及提交按钮&quot;),&lt;BR&gt;DefaultValue(null),&lt;BR&gt;Description(&quot;应用于提交按钮的CSS样式&quot;)]&lt;BR&gt;publicstringSubmitButtonStyle&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;return(string)ViewState[&quot;SubmitButtonStyle&quot;];&lt;BR&gt;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;ViewState[&quot;SubmitButtonStyle&quot;]=value;&lt;BR&gt;}&lt;BR&gt;}&lt;BR&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置自动显示页索引输入文本框的最低起始页数。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;///&amp;lt;remarks&amp;gt;&lt;BR&gt;///当&amp;lt;seecref=&quot;ShowInputBox&quot;/&amp;gt;设为Auto（默认）并且要分页的数据的总页数达到该值时会自动显示页索引输入文本框，默认值为30。该选项当&amp;lt;seecref=&quot;ShowInputBox&quot;/&amp;gt;设为Never或Always时没有任何作用。&lt;BR&gt;///&amp;lt;/remarks&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Description(&quot;指定当ShowInputBox设为ShowInputBox.Auto时，当总页数达到多少时才显示页索引输入文本框&quot;),&lt;BR&gt;Category(&quot;文本框及提交按钮&quot;),&lt;BR&gt;DefaultValue(30)]&lt;BR&gt;publicintShowBoxThreshold&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectobj=ViewState[&quot;ShowBoxThreshold&quot;];&lt;BR&gt;return(obj==null)?30:(int)obj;&lt;BR&gt;}&lt;BR&gt;set{ViewState[&quot;ShowBoxThreshold&quot;]=value;}&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;&lt;BR&gt;#endregion&lt;/P&gt;&lt;P&gt;#regionCustomInfoSection&lt;/P&gt;&lt;P&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置显示用户自定义信息区的方式。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;///&amp;lt;remarks&amp;gt;&lt;BR&gt;///该属性值设为Left或Right时会在分页导航元素左边或右边划出一个专门的区域来显示有关用户自定义信息，设为Never时不显示。&lt;BR&gt;///&amp;lt;/remarks&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Description(&quot;显示当前页和总页数信息，默认值为不显示，值为ShowCustomInfoSection.Left时将显示在页索引前，为ShowCustomInfoSection.Right时将显示在页索引后&quot;),&lt;BR&gt;DefaultValue(ShowCustomInfoSection.Never),&lt;BR&gt;Category(&quot;自定义信息区&quot;)]&lt;BR&gt;publicShowCustomInfoSectionShowCustomInfoSection&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectobj=ViewState[&quot;ShowCustomInfoSection&quot;];&lt;BR&gt;return(obj==null)?ShowCustomInfoSection.Never:(ShowCustomInfoSection)obj;&lt;BR&gt;}&lt;BR&gt;set{ViewState[&quot;ShowCustomInfoSection&quot;]=value;}&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置用户自定义信息区文本的对齐方式。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Category(&quot;自定义信息区&quot;),&lt;BR&gt;DefaultValue(HorizontalAlign.Left),&lt;BR&gt;Description(&quot;用户自定义信息区文本的对齐方式&quot;)]&lt;BR&gt;publicHorizontalAlignCustomInfoTextAlign&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectobj=ViewState[&quot;CustomInfoTextAlign&quot;];&lt;BR&gt;return(obj==null)?HorizontalAlign.Left:(HorizontalAlign)obj;&lt;BR&gt;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;ViewState[&quot;CustomInfoTextAlign&quot;]=value;&lt;BR&gt;}&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置用户自定义信息区的宽度。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Category(&quot;自定义信息区&quot;),&lt;BR&gt;DefaultValue(typeof(Unit),&quot;40&quot;),&lt;BR&gt;Description(&quot;用户自定义信息区的宽度&quot;)]&lt;BR&gt;publicUnitCustomInfoSectionWidth&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectobj=ViewState[&quot;CustomInfoSectionWidth&quot;];&lt;BR&gt;return(obj==null)?Unit.Percentage(40):(Unit)obj;&lt;BR&gt;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;ViewState[&quot;CustomInfoSectionWidth&quot;]=value;&lt;BR&gt;}&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置应用于用户自定义信息区的级联样式表类名。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Category(&quot;自定义信息区&quot;),&lt;BR&gt;DefaultValue(null),&lt;BR&gt;Description(&quot;应用于用户自定义信息区的级联样式表类名&quot;)]&lt;BR&gt;publicstringCustomInfoClass&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectobj=ViewState[&quot;CustomInfoClass&quot;];&lt;BR&gt;return(obj==null)?CssClass:(string)obj;&lt;BR&gt;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;ViewState[&quot;CustomInfoClass&quot;]=value;&lt;BR&gt;}&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置应用于用户自定义信息区的CSS样式文本。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;///&amp;lt;value&amp;gt;字符串值，要应用于用户自定义信息区的CSS样式文本。&amp;lt;/value&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Category(&quot;自定义信息区&quot;),&lt;BR&gt;DefaultValue(null),&lt;BR&gt;Description(&quot;应用于用户自定义信息区的CSS样式文本&quot;)]&lt;BR&gt;publicstringCustomInfoStyle&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectobj=ViewState[&quot;CustomInfoStyle&quot;];&lt;BR&gt;return(obj==null)?GetStyleString():(string)obj;&lt;BR&gt;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;ViewState[&quot;CustomInfoStyle&quot;]=value;&lt;BR&gt;}&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置在显示在用户自定义信息区的用户自定义文本。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Category(&quot;自定义信息区&quot;),&lt;BR&gt;DefaultValue(null),&lt;BR&gt;Description(&quot;要显示在用户自定义信息区的用户自定义信息文本&quot;)]&lt;BR&gt;publicstringCustomInfoText&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;return(string)ViewState[&quot;CustomInfoText&quot;];&lt;BR&gt;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;ViewState[&quot;CustomInfoText&quot;]=value;&lt;BR&gt;}&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;#endregion&lt;/P&gt;&lt;P&gt;#regionOthers&lt;/P&gt;&lt;P&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置一个值，该值指定是否总是显示AspNetPager分页按件，即使要分页的数据只有一页。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;///&amp;lt;remarks&amp;gt;&lt;BR&gt;///默认情况下，当要分页的数据小于两页时，AspNetPager不会在页面上显示任何内容，将此属性值设为true时，即使总页数只有一页，AspNetPager也将显示分页导航元素。&lt;BR&gt;///&amp;lt;/remarks&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Category(&quot;Behavior&quot;),&lt;BR&gt;DefaultValue(false),&lt;BR&gt;Description(&quot;总是显示分页控件，即使要分页的数据只要一页&quot;)]&lt;BR&gt;publicboolAlwaysShow&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectobj=ViewState[&quot;AlwaysShow&quot;];&lt;BR&gt;return(obj==null)?false:(bool)obj;&lt;BR&gt;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;ViewState[&quot;AlwaysShow&quot;]=value;&lt;BR&gt;}&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;&lt;BR&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置由AspNetPager服务器控件在客户端呈现的级联样式表(CSS)类。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Description(&quot;应用于控件的CSS类名&quot;),&lt;BR&gt;Category(&quot;Appearance&quot;),&lt;BR&gt;DefaultValue(null)]&lt;BR&gt;publicoverridestringCssClass&lt;BR&gt;{&lt;BR&gt;get{returnbase.CssClass;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;base.CssClass=value;&lt;BR&gt;cssClassName=value;&lt;BR&gt;}&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;&lt;BR&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置一个值，该值指示AspNetPager服务器控件是否向发出请求的客户端保持自己的视图状态，该属性经重写后不允许设为false。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;///&amp;lt;remarks&amp;gt;&amp;lt;seecref=&quot;AspNetPager&quot;/&amp;gt;服务器控件将一些重要的分页信息保存在ViewState中，当使用Url分页方式时，虽然视图状态在分页过程中没有任何作用，但若当前页需要回发，则必须启用视图状态以便分页控件能在页面回发后获取回发前的分页状态；当通过页面回发（PostBack）的方式来分页时，要使AspNetPager正常工作，必须启用视图状态。&lt;BR&gt;///&amp;lt;p&amp;gt;&amp;lt;note&amp;gt;该属性并不能禁止用户用&amp;lt;![CDATA[&amp;lt;@PageEnableViewState=false&amp;gt;]]&amp;gt;页指令来禁用整个页面的视图状态，当使用此指令并且设置AspNetPager通过页面回发来分页时，AspNetPager因为无法获取保存的信息而不能正常工作。&amp;lt;/note&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/remarks&amp;gt;&lt;BR&gt;[Browsable(false),&lt;BR&gt;Description(&quot;是否启用控件的视图状态，该属性的值必须为true，不允许用户设置。&quot;),&lt;BR&gt;DefaultValue(true),&lt;BR&gt;Category(&quot;Behavior&quot;)]&lt;BR&gt;publicoverrideboolEnableViewState&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;returnbase.EnableViewState;&lt;BR&gt;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;base.EnableViewState=true;&lt;BR&gt;}&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置当用户输入的页索引超出范围（大于最大页索引或小于最小页索引）时在客户端显示的错误信息。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Description(&quot;当用户输入的页索引超出范围（大于最大页索引或小于最小页索引）时在客户端显示的错误信息。&quot;),&lt;BR&gt;DefaultValue(&quot;页数超出范围！&quot;),&lt;BR&gt;Category(&quot;Data&quot;)]&lt;BR&gt;publicstringPageIndexOutOfRangeErrorString&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectobj=ViewState[&quot;PageIndexOutOfRangeErrorString&quot;];&lt;BR&gt;return(obj==null)?&quot;页数超出范围！&quot;:(string)obj;&lt;BR&gt;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;ViewState[&quot;PageIndexOutOfRangeErrorString&quot;]=value;&lt;BR&gt;}&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///获取或设置当用户输入无效的页索引（负值或非数字）时在客户端显示的错误信息。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;[Browsable(true),&lt;BR&gt;Description(&quot;当用户输入无效的页索引（负值或非数字）时在客户端显示的错误信息。&quot;),&lt;BR&gt;DefaultValue(&quot;页索引无效！&quot;),&lt;BR&gt;Category(&quot;Data&quot;)]&lt;BR&gt;publicstringInvalidPageIndexErrorString&lt;BR&gt;{&lt;BR&gt;get&lt;BR&gt;{&lt;BR&gt;objectobj=ViewState[&quot;InvalidPageIndexErrorString&quot;];&lt;BR&gt;return(obj==null)?&quot;页索引无效！&quot;:(string)obj;&lt;BR&gt;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;ViewState[&quot;InvalidPageIndexErrorString&quot;]=value;&lt;BR&gt;}&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;BR&gt;#endregion&lt;/P&gt;&lt;P&gt;#endregion&lt;/P&gt;&lt;P&gt;#regionControlRenderingLogic&lt;/P&gt;&lt;P&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///重写&amp;lt;seecref=&quot;System.Web.UI.Control.OnLoad&quot;/&amp;gt;方法。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;///&amp;lt;paramname=&quot;e&quot;&amp;gt;包含事件数据的&amp;lt;seecref=&quot;EventArgs&quot;/&amp;gt;对象。&amp;lt;/param&amp;gt;&lt;BR&gt;protectedoverridevoidOnLoad(EventArgse)&lt;BR&gt;{&lt;BR&gt;if(urlPaging)&lt;BR&gt;{&lt;BR&gt;currentUrl=Page.Request.Path;&lt;BR&gt;urlParams=Page.Request.QueryString;&lt;BR&gt;stringpageIndex=Page.Request.QueryString[urlPageIndexName];&lt;BR&gt;intindex=1;&lt;BR&gt;try&lt;BR&gt;{&lt;BR&gt;index=int.Parse(pageIndex);&lt;BR&gt;}&lt;BR&gt;catch{}&lt;BR&gt;OnPageChanged(newPageChangedEventArgs(index));&lt;BR&gt;}&lt;BR&gt;else&lt;BR&gt;{&lt;BR&gt;inputPageIndex=Page.Request.Form[this.UniqueID &quot;_input&quot;];&lt;BR&gt;}&lt;BR&gt;base.OnLoad(e);&lt;BR&gt;}&lt;BR&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///重写&amp;lt;seecref=&quot;System.Web.UI.Control.OnPreRender&quot;/&amp;gt;方法。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;///&amp;lt;paramname=&quot;e&quot;&amp;gt;包含事件数据的&amp;lt;seecref=&quot;EventArgs&quot;/&amp;gt;对象。&amp;lt;/param&amp;gt;&lt;BR&gt;protectedoverridevoidOnPreRender(EventArgse)&lt;BR&gt;{&lt;BR&gt;if(PageCount&amp;gt;1)&lt;BR&gt;{&lt;BR&gt;stringcheckscript=&quot;&amp;lt;scriptlanguage=&quot;Javascript&quot;&amp;gt;functiondoCheck(el){varr=newRegExp(&quot;^s*(d )s*$&quot;);if(r.test(el.value)){if(RegExp.$1&amp;lt;1||RegExp.$1&amp;gt;&quot; PageCount.ToString() &quot;){alert(&quot;&quot; PageIndexOutOfRangeErrorString &quot;&quot;);document.all['&quot; this.UniqueID &quot;_input'].select();returnfalse;}returntrue;}alert(&quot;&quot; InvalidPageIndexErrorString &quot;&quot;);document.all['&quot; this.UniqueID &quot;_input'].select();returnfalse;}&amp;lt;/script&amp;gt;&quot;;&lt;BR&gt;if((ShowInputBox==ShowInputBox.Always)||(ShowInputBox==ShowInputBox.Auto&amp;amp;&amp;amp;PageCount&amp;gt;=ShowBoxThreshold))&lt;BR&gt;{&lt;BR&gt;if(!Page.IsClientScriptBlockRegistered(&quot;checkinput&quot;))&lt;BR&gt;Page.RegisterClientScriptBlock(&quot;checkinput&quot;,checkscript);&lt;BR&gt;stringscript=&quot;&amp;lt;scriptlanguage=&quot;javascript&quot;&amp;gt;&amp;lt;!--nfunctionBuildUrlString(key,value){var_key=key.toLowerCase();varprms=location.search;if(prms.length==0)returnlocation.pathname &quot;?&quot; _key &quot;=&quot; value;varparams=prms.substring(1).split(&quot;&amp;amp;&quot;);varnewparam=&quot;&quot;;varfound=false;for(i=0;i&amp;lt;params.length;i  ){if(params[i].split(&quot;=&quot;)[0].toLowerCase()==_key){params[i]=_key &quot;=&quot; value;found=true;break;}}if(found)returnlocation.pathname &quot;?&quot; params.join(&quot;&amp;amp;&quot;);elsereturnlocation &quot;&amp;amp;&quot; _key &quot;=&quot; value;}n//--&amp;gt;&amp;lt;/script&amp;gt;&quot;;&lt;BR&gt;if(!Page.IsClientScriptBlockRegistered(&quot;BuildUrlScript&quot;))&lt;BR&gt;Page.RegisterClientScriptBlock(&quot;BuildUrlScript&quot;,script);&lt;BR&gt;}&lt;BR&gt;}&lt;BR&gt;base.OnPreRender(e);&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///重写&amp;lt;seecref=&quot;System.Web.UI.WebControls.WebControl.AddAttributesToRender&quot;/&amp;gt;方法，将需要呈现的HTML属性和样式添加到指定的&amp;lt;seecref=&quot;System.Web.UI.HtmlTextWriter&quot;/&amp;gt;中&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;///&amp;lt;paramname=&quot;writer&quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;BR&gt;protectedoverridevoidAddAttributesToRender(HtmlTextWriterwriter)&lt;BR&gt;{&lt;BR&gt;if(this.Page!=null)&lt;BR&gt;this.Page.VerifyRenderingInServerForm(this);&lt;BR&gt;base.AddAttributesToRender(writer);&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///重写&amp;lt;seecref=&quot;System.Web.UI.WebControls.WebControl.RenderBeginTag&quot;/&amp;gt;方法，将&amp;lt;seecref=&quot;AspNetPager&quot;/&amp;gt;控件的HTML开始标记输出到指定的&amp;lt;seecref=&quot;System.Web.UI.HtmlTextWriter&quot;/&amp;gt;编写器中。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;///&amp;lt;paramname=&quot;writer&quot;&amp;gt;&amp;lt;seecref=&quot;System.Web.UI.HtmlTextWriter&quot;/&amp;gt;，表示要在客户端呈现HTML内容的输出流。&amp;lt;/param&amp;gt;&lt;BR&gt;publicoverridevoidRenderBeginTag(HtmlTextWriterwriter)&lt;BR&gt;{&lt;BR&gt;boolshowPager=(PageCount&amp;gt;1||(PageCount&amp;lt;=1&amp;amp;&amp;amp;AlwaysShow));&lt;BR&gt;writer.WriteLine();&lt;BR&gt;writer.Write(&quot;&amp;lt;!------------------------------&quot;);&lt;BR&gt;writer.Write(&quot;AspNetPagerV4.3Start&quot;);&lt;BR&gt;writer.WriteLine(&quot;------------------------------&amp;gt;&quot;);&lt;BR&gt;writer.Write(&quot;&amp;lt;!--------------------&quot;);&lt;BR&gt;writer.Write(&quot;Copyright:2003Webdiyer(www.webdiyer.com)&quot;);&lt;BR&gt;writer.Write(&quot;---------------------&quot;);&lt;BR&gt;writer.WriteLine(&quot;&amp;gt;&quot;);&lt;BR&gt;base.RenderBeginTag(writer);&lt;BR&gt;if(!showPager)&lt;BR&gt;{&lt;BR&gt;writer.Write(&quot;&amp;lt;!-----因为总页数只有一页，并且AlwaysShow属性设为false，AspNetPager不显示任何内容，若要在总页数只有一页的情况下显示AspNetPager，请将AlwaysShow属性设为true！&quot;);&lt;BR&gt;writer.Write(&quot;-----&amp;gt;&quot;);&lt;BR&gt;}&lt;BR&gt;if((ShowCustomInfoSection==ShowCustomInfoSection.Left||ShowCustomInfoSection==ShowCustomInfoSection.Right)&amp;amp;&amp;amp;showPager)&lt;BR&gt;{&lt;BR&gt;writer.AddAttribute(HtmlTextWriterAttribute.Width,&quot;100&quot;);&lt;BR&gt;writer.AddAttribute(HtmlTextWriterAttribute.Style,GetStyleString());&lt;BR&gt;if(Height!=Unit.Empty)&lt;BR&gt;writer.AddStyleAttribute(HtmlTextWriterStyle.Height,Height.ToString());&lt;BR&gt;writer.AddAttribute(HtmlTextWriterAttribute.Border,&quot;0&quot;);&lt;BR&gt;writer.AddAttribute(HtmlTextWriterAttribute.Cellpadding,&quot;0&quot;);&lt;BR&gt;writer.AddAttribute(HtmlTextWriterAttribute.Cellspacing,&quot;0&quot;);&lt;BR&gt;writer.RenderBeginTag(HtmlTextWriterTag.Table);&lt;BR&gt;writer.RenderBeginTag(HtmlTextWriterTag.Tr);&lt;BR&gt;WriteCellAttributes(writer,true);&lt;BR&gt;writer.RenderBeginTag(HtmlTextWriterTag.Td);&lt;BR&gt;}&lt;BR&gt;}&lt;BR&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///重写&amp;lt;seecref=&quot;System.Web.UI.WebControls.WebControl.RenderEndTag&quot;/&amp;gt;方法，将&amp;lt;seecref=&quot;AspNetPager&quot;/&amp;gt;控件的HTML结束标记输出到指定的&amp;lt;seecref=&quot;System.Web.UI.HtmlTextWriter&quot;/&amp;gt;编写器中。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;///&amp;lt;paramname=&quot;writer&quot;&amp;gt;&amp;lt;seecref=&quot;System.Web.UI.HtmlTextWriter&quot;/&amp;gt;，表示要在客户端呈现HTML内容的输出流。&amp;lt;/param&amp;gt;&lt;BR&gt;publicoverridevoidRenderEndTag(HtmlTextWriterwriter)&lt;BR&gt;{&lt;BR&gt;if((ShowCustomInfoSection==ShowCustomInfoSection.Left||ShowCustomInfoSection==ShowCustomInfoSection.Right)&amp;amp;&amp;amp;(PageCount&amp;gt;1||(PageCount&amp;lt;=1&amp;amp;&amp;amp;AlwaysShow)))&lt;BR&gt;{&lt;BR&gt;writer.RenderEndTag();&lt;BR&gt;writer.RenderEndTag();&lt;BR&gt;writer.RenderEndTag();&lt;BR&gt;}&lt;BR&gt;base.RenderEndTag(writer);&lt;BR&gt;writer.WriteLine();&lt;BR&gt;writer.Write(&quot;&amp;lt;!-------------------------------&quot;);&lt;BR&gt;writer.Write(&quot;AspNetPagerV4.3End&quot;);&lt;BR&gt;writer.Write(&quot;--------------------------------&quot;);&lt;BR&gt;writer.WriteLine(&quot;&amp;gt;&quot;);&lt;BR&gt;writer.WriteLine();&lt;BR&gt;}&lt;BR&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///重写&amp;lt;seecref=&quot;System.Web.UI.WebControls.WebControl.RenderContents&quot;/&amp;gt;方法，将控件的内容呈现到指定&amp;lt;seecref=&quot;System.Web.UI.HtmlTextWriter&quot;/&amp;gt;的编写器中。&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;///&amp;lt;paramname=&quot;writer&quot;&amp;gt;&amp;lt;seecref=&quot;System.Web.UI.HtmlTextWriter&quot;/&amp;gt;，表示要在客户端呈现HTML内容的输出流。&amp;lt;/param&amp;gt;&lt;BR&gt;protectedoverridevoidRenderContents(HtmlTextWriterwriter)&lt;BR&gt;{&lt;BR&gt;if(PageCount&amp;lt;=1&amp;amp;&amp;amp;!AlwaysShow)&lt;BR&gt;return;&lt;/P&gt;&lt;P&gt;if(ShowCustomInfoSection==ShowCustomInfoSection.Left)&lt;BR&gt;{&lt;BR&gt;writer.Write(CustomInfoText);&lt;BR&gt;writer.RenderEndTag();&lt;BR&gt;WriteCellAttributes(writer,false);&lt;BR&gt;writer.AddAttribute(HtmlTextWriterAttribute.Class,CssClass);&lt;BR&gt;writer.RenderBeginTag(HtmlTextWriterTag.Td);&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;intmidpage=(int)((CurrentPageIndex-1)/NumericButtonCount);&lt;BR&gt;intpageoffset=midpage*NumericButtonCount;&lt;BR&gt;intendpage=((pageoffset NumericButtonCount)&amp;gt;PageCount)?PageCount:(pageoffset NumericButtonCount);&lt;BR&gt;this.CreateNavigationButton(writer,&quot;first&quot;);&lt;BR&gt;this.CreateNavigationButton(writer,&quot;prev&quot;);&lt;BR&gt;if(ShowPageIndex)&lt;BR&gt;{&lt;BR&gt;if(CurrentPageIndex&amp;gt;NumericButtonCount)&lt;BR&gt;CreateMoreButton(writer,pageoffset);&lt;BR&gt;for(inti=pageoffset 1;i&amp;lt;=endpage;i  )&lt;BR&gt;{&lt;BR&gt;CreateNumericButton(writer,i);&lt;BR&gt;}&lt;BR&gt;if(PageCount&amp;gt;NumericButtonCount&amp;amp;&amp;amp;endpage&amp;lt;PageCount)&lt;BR&gt;CreateMoreButton(writer,endpage 1);&lt;BR&gt;}&lt;BR&gt;this.CreateNavigationButton(writer,&quot;next&quot;);&lt;BR&gt;this.CreateNavigationButton(writer,&quot;last&quot;);&lt;BR&gt;if((ShowInputBox==ShowInputBox.Always)||(ShowInputBox==ShowInputBox.Auto&amp;amp;&amp;amp;PageCount&amp;gt;=ShowBoxThreshold))&lt;BR&gt;{&lt;BR&gt;writer.Write(&quot;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&quot;);&lt;BR&gt;if(TextBeforeInputBox!=null)&lt;BR&gt;writer.Write(TextBeforeInputBox);&lt;BR&gt;writer.AddAttribute(HtmlTextWriterAttribute.Type,&quot;text&quot;);&lt;BR&gt;writer.AddStyleAttribute(HtmlTextWriterStyle.Width,&quot;30px&quot;);&lt;BR&gt;writer.AddAttribute(HtmlTextWriterAttribute.Value,CurrentPageIndex.ToString());&lt;BR&gt;if(InputBoxStyle!=null&amp;amp;&amp;amp;InputBoxStyle.Trim().Length&amp;gt;0)&lt;BR&gt;writer.AddAttribute(HtmlTextWriterAttribute.Style,InputBoxStyle);&lt;BR&gt;if(InputBoxClass!=null&amp;amp;&amp;amp;InputBoxClass.Trim().Length&amp;gt;0)&lt;BR&gt;writer.AddAttribute(HtmlTextWriterAttribute.Class,InputBoxClass);&lt;BR&gt;if(PageCount&amp;lt;=1&amp;amp;&amp;amp;AlwaysShow)&lt;BR&gt;writer.AddAttribute(HtmlTextWriterAttribute.ReadOnly,&quot;true&quot;);&lt;BR&gt;writer.AddAttribute(HtmlTextWriterAttribute.Name,this.UniqueID &quot;_input&quot;);&lt;BR&gt;stringscriptRef=&quot;doCheck(document.all['&quot; this.UniqueID &quot;_input'])&quot;;&lt;BR&gt;stringpostRef=&quot;if(event.keyCode==13){if(&quot; scriptRef &quot;)__doPostBack('&quot; this.UniqueID &quot;',document.all['&quot; this.UniqueID &quot;_input'].value);else{event.returnValue=false;}}&quot;;&lt;BR&gt;stringkeydownScript=&quot;if(event.keyCode==13){if(&quot; scriptRef &quot;){even&lt;/P&gt;&lt;P&gt;&lt;BR&gt;csover发表于:2006.07.2108:46::分类:(asp.net)::阅读:(464次)::评论(0)::引用(0)&lt;BR&gt;2006年07月20日,星期四&lt;BR&gt;一个简单的分页控件&lt;BR&gt;采用Datagrid的默任的分页方式分页，后来发现对于大的数据量速度很慢，NET进程占用系统资源也很大，后来写了个分页的存储过程，每次取数据都只取当前页的，分页是分好了，但是发现翻页就没那么方便了，于是自己写了个简单的分页控件，代码如下(编译以后直接形成dll就可以用)。&lt;BR&gt;samplecode:&lt;BR&gt;usingSystem;&lt;BR&gt;usingSystem.Web.UI;&lt;BR&gt;usingSystem.Web.UI.WebControls;&lt;BR&gt;usingSystem.ComponentModel;&lt;BR&gt;namespacePageInfoControl&lt;BR&gt;{&lt;BR&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///WebCustomeControl1的摘要说明&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;[DefaultProperty('TotalRecord'),ToolboxData('&amp;lt;{0}:PageInforunat=server&amp;gt;&amp;lt;/{0}:PageInfo&amp;gt;')]&lt;BR&gt;publicclassPageInfo:System.Web.UI.WebControls.WebControl,IPostBackEventHandler&lt;BR&gt;{&lt;BR&gt;#regionConstructmethod&lt;BR&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///构造函数&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;publicPageInfo():base(HtmlTextWriterTag.Div)&lt;BR&gt;{&lt;BR&gt;}&lt;BR&gt;#endregion&lt;/P&gt;&lt;P&gt;#regionVariablesandConstants&lt;BR&gt;publiceventEventHandlerChangePageClick;&lt;BR&gt;privatestring_BarBackGroudColor='#F1F1F1';&lt;BR&gt;privatestring_BarLinkColor='Navy';&lt;BR&gt;privatestring_BarCurrentColor='#EEEEEE';&lt;BR&gt;privateint_TotalRecord=0;&lt;BR&gt;privateint_TotalPage=0;&lt;BR&gt;privateint_CurrentPageIndex=1;&lt;BR&gt;privateint_ItemSize=10;&lt;BR&gt;#endregion&lt;/P&gt;&lt;P&gt;#regionProperties&lt;/P&gt;&lt;P&gt;[Description('分页条背景色'),Bindable(true),Category('Appearance'),DefaultValue('#F1F1F1')]&lt;BR&gt;publicstringBarBackGroundColor&lt;BR&gt;{&lt;BR&gt;get{return_BarBackGroundColor;}&lt;BR&gt;set{_BarBackGroundColor=value;}&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;[Description('分页条带链接数字颜色'),Bindable(true),Category('Appearance'),DefaultValue('Navy')]&lt;BR&gt;publicstringBarLinkColor&lt;BR&gt;{&lt;BR&gt;get{return_BarLinkColor;}&lt;BR&gt;set{_BarLinkColor=value;}&lt;BR&gt;}[Description('分页条当前页数字颜色'),Bindable(true),Category('Appearance'),DefaultValue('#EEEEEE')]&lt;BR&gt;publicstringBarCurrentColor&lt;BR&gt;{&lt;BR&gt;get{return_BarCurrentColor;}&lt;BR&gt;set{_BarCurrentColor=value;}&lt;BR&gt;}[Description('总记录数'),Bindable(false),Category('Behavior'),DefaultValue(0)]&lt;BR&gt;publicintTotalRecord&lt;BR&gt;{&lt;BR&gt;get{return_TotalRecord;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;foreach(charcinSystem.Convert.ToString(value))&lt;BR&gt;{&lt;BR&gt;if(!Char.IsNumber(c)&lt;BR&gt;{&lt;BR&gt;_TotalRecord=0;&lt;BR&gt;break;&lt;BR&gt;}&lt;BR&gt;_TotalRecord=value;&lt;BR&gt;}&lt;BR&gt;}[Description('每页显示记录数'),Bindable(true),Category('Behavior'),DefaultValue(0)]&lt;BR&gt;publicintPageSize&lt;BR&gt;{&lt;BR&gt;get{return_PageSize;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;foreach(charcinSystem.Convert.ToString(value))&lt;BR&gt;{&lt;BR&gt;if(!Char.IsNumber(c))&lt;BR&gt;{&lt;BR&gt;_PageSize=0;&lt;BR&gt;break;&lt;BR&gt;}&lt;BR&gt;}&lt;BR&gt;_PageSize=value;&lt;BR&gt;}&lt;BR&gt;}[Description('总页数'),Bindable(true),Category('Behavior'),DefaultValue(0)]&lt;BR&gt;publicintTotalPage&lt;BR&gt;{&lt;BR&gt;get{return_TotalPage;}&lt;BR&gt;}[Description('数字规格'),Bindable(true),Category('Behavior'),DefaultValue(10)]&lt;BR&gt;publicintItemSize&lt;BR&gt;{&lt;BR&gt;get{return_ItemSize;}&lt;BR&gt;set&lt;BR&gt;{&lt;BR&gt;foreach(charcinSystem.Convert.ToString(value))&lt;BR&gt;{&lt;BR&gt;if(!Char.IsNumber(c))&lt;BR&gt;{&lt;BR&gt;_ItemSize=10;&lt;BR&gt;break;&lt;BR&gt;}&lt;BR&gt;}&lt;BR&gt;_ItemSize=value;&lt;BR&gt;}&lt;BR&gt;}[Description('当前页值'),Bindable(true),Category('Behavior'),DefaultValue(1)]&lt;BR&gt;publicintCurrentPageIndex&lt;BR&gt;{&lt;BR&gt;get{return_CurrentPageIndex;}&lt;BR&gt;set{_CurrentPageIndex=value;}&lt;BR&gt;}&lt;BR&gt;#endregion&lt;/P&gt;&lt;P&gt;//定义Div的样式&lt;BR&gt;protectedoverridevoidAddAttributesToRender(HtmlTextWriterwriter)&lt;BR&gt;{&lt;BR&gt;writer.AddStyleAttribute('White-space','nowrap');&lt;BR&gt;writer.AddStyleAttribute('Padding-Top','2px');&lt;BR&gt;writer.AddStyleAttribute('Padding-Bottom',2px');&lt;BR&gt;writer.AddStyleAttribute('Width',width.ToString());&lt;BR&gt;writer.AddStyleAttribute('Height',Height.ToString());&lt;BR&gt;base.AddAttributesToRender(writer);&lt;BR&gt;}&lt;BR&gt;protectedvirtualvoidOnPageChangeClick(EventArgse)&lt;BR&gt;{&lt;BR&gt;if(ChangePageClick!=null)&lt;BR&gt;{&lt;BR&gt;ChangePageClick(this,e);&lt;BR&gt;}&lt;BR&gt;}publicvoidRaisePostBackEvent(stringeventArgument)&lt;BR&gt;{&lt;BR&gt;intPageIndex=int.Parse(eventArgument);&lt;BR&gt;this._CurrentPageIndex=PageIndex;&lt;BR&gt;OnPageChangeClick(newEventArgs());&lt;BR&gt;}&lt;BR&gt;///&amp;lt;summary&amp;gt;&lt;BR&gt;///将此控件呈现给指定的输出参数&lt;BR&gt;///&amp;lt;/summary&amp;gt;&lt;BR&gt;///&amp;lt;paramname='output'&amp;gt;要写出到的HTML编写器&amp;lt;/param&amp;gt;&lt;BR&gt;protectedoverridevoidRenderContents(HtmlTextWriteroutput)&lt;BR&gt;{this._TotalPage=((this.TotalRecord/PageSize)*this.PageSize==this.TotalRecord)?(this.TotalRecord/this.PageSize):((this.TotalRecord/this.PageSize) 1);&lt;BR&gt;intBeginRecord=(this.CurrentPageIndex-1)*this.PageSize 1;&lt;BR&gt;intEndRecord=this.CurrentPageIndex*this.PageSize;&lt;BR&gt;StringPageInfo='[共&amp;lt;fontcolor=#CC0000&amp;gt;' this.TotalPage.ToString() '&amp;lt;/font&amp;gt;页/当前第&amp;lt;fontcolor=#CC0000&amp;gt;' this.CurrentPageIndex.ToString() '&amp;lt;/font&amp;gt;页共&amp;lt;fontcolor=#CC0000&amp;gt;' TotalRecord.ToString() '&amp;lt;/font&amp;gt;条记录,当前记录数&amp;lt;fontcolor=#CC0000&amp;gt;' BegingRecord.ToString() '&amp;lt;/font&amp;gt;到&amp;lt;fontcolor=#CC0000&amp;gt;' EndRecord.ToString() '&amp;lt;/font&amp;gt;]';&lt;BR&gt;stringPageListStr='';&lt;BR&gt;stringPageIndexColor='#0000C0';&lt;BR&gt;intSingleNumber=this.TotalPage-(TotalPage/ItemSize)*ItemSize;//得到分页后的尾数(比如:总共58页,按10页规格显示,则尾数为8)&lt;BR&gt;intIntPageForMax=(this.CurrentPageIndex-1)/ItemSize;&lt;BR&gt;intMinInt=(1 ItemSize*IntPageForMax);&lt;BR&gt;intMaxInt=((IntPageForMax 1)*ItemSize)&amp;gt;TotalPage?TotalPage:((IntPageForMax 1)*ItemSize);&lt;BR&gt;if(this.TotalRecord==0||this.TotalPage==0)&lt;BR&gt;{&lt;BR&gt;PageListStr='&amp;lt;fontcolor=' PageIndexColor '&amp;gt;0&amp;lt;/font&amp;gt;';&lt;BR&gt;PageListStr=PageListStr '[共&amp;lt;fontcolor=#CC0000&amp;gt;0&amp;lt;/font&amp;gt;页/当前第&amp;lt;fontcolor=#CC0000&amp;gt;0&amp;lt;/font&amp;gt;页共&amp;lt;fontcolor=#CC0000&amp;gt;0&amp;lt;/font&amp;gt;条记录,当前记录数&amp;lt;fontcolor=#CC0000&amp;gt;0&amp;lt;/font&amp;gt;到&amp;lt;fontcolor=#CC0000&amp;gt;0&amp;lt;/font&amp;gt;]';&lt;BR&gt;output.Write(PageListStr);&lt;BR&gt;}&lt;BR&gt;else&lt;BR&gt;{&lt;BR&gt;if(this.TotalPage&amp;lt;=this.ItemSize)&lt;BR&gt;{&lt;BR&gt;for(inti=1;i&amp;lt;=TotalPage;i  )&lt;BR&gt;{&lt;BR&gt;PageIndexColor=CurrentPageIndex==i?'#CC0000':'#0000C0';&lt;BR&gt;if(CurrentPageIndex==i)&lt;BR&gt;PageListStr=PageListStr '&amp;lt;atitle='当前为第[' i ']页'href='#'id='' this.UniqueID ''&amp;gt;&amp;lt;fontcolor=' PageIndexColor '&amp;gt;' i.ToString() '&amp;lt;/font&amp;gt;&amp;lt;/a&amp;gt;';&lt;BR&gt;else&lt;BR&gt;PageListStr=PageListStr '&amp;lt;atitle='点击转到第[' i ']页'id='' this.UniqueID ''href='javascript:' Page.GetPostBackEventReference(this,i.ToString()) ''&amp;gt;&amp;lt;fontcolor=' PageIndexColor '&amp;gt;' i.ToString() '&amp;lt;/font&amp;gt;&amp;lt;/a&amp;gt;';&lt;BR&gt;}&lt;BR&gt;PageListStr=PageListStr==''?'&amp;lt;fontcolor=' PageIndexColor '&amp;gt;0&amp;lt;/font&amp;gt;':PageListStr;&lt;BR&gt;PageListStr=PageListStr '' PageInfo;&lt;BR&gt;output.Write(PageListStr);&lt;BR&gt;}&lt;BR&gt;else&lt;BR&gt;{&lt;BR&gt;for(inti=MinInt;i&amp;lt;=MaxInt;i  )&lt;BR&gt;{&lt;BR&gt;PageIndexColor=CurrentPageIndex==i?'#CC0000':'#0000C0';&lt;BR&gt;if(CurrentPageIndex==i)&lt;BR&gt;PageListStr=PageListStr '&amp;lt;atitle='当前为第[' i ']页'href='#'id='' this.UniqueID ''&amp;gt;&amp;lt;fontcolor=' PageIndexColor '&amp;gt;' i.ToString() '&amp;lt;/font&amp;gt;&amp;lt;/a&amp;gt;';&lt;BR&gt;else&lt;BR&gt;PageListStr=PageListStr '&amp;lt;atitle='点击转到第[' i ']页'id='' this.UniqueID ''href='javascript:' Page.GetPostBackEventReference(this,i.ToString()) ''&amp;gt;&amp;lt;fontcolor=' PageIndexColor '&amp;gt;' i.ToString() '&amp;lt;/font&amp;gt;&amp;lt;/a&amp;gt;';&lt;BR&gt;}&lt;BR&gt;//当当前页数小于ItemSize且总的页数大于ItemSize时&lt;BR&gt;if(CurrentPageIndex&amp;lt;=ItemSize&amp;amp;&amp;amp;TotalPage&amp;gt;ItemSize)&lt;BR&gt;{&lt;BR&gt;PageListStr=PageListStr '&amp;lt;aid='' this.UniqueID ''title='点击转到第[' System.Convert.ToString(ItemSize 1) ']页'href='javascript:' Page.GetPostBackEventReference(this.System.Convert.ToString(ItemSize 1)) ''&amp;gt;&amp;gt;&amp;gt;&amp;lt;/a&amp;gt;';&lt;BR&gt;//当当前页数大于ItemSize,且总的页数减去当前页数大于等于尾数值页数时&lt;BR&gt;if(this.CurrentPageIndex&amp;gt;ItemSize&amp;amp;&amp;amp;(TotalPage-this.CurrentPageIndex)&amp;gt;=SingleNumber)&lt;BR&gt;{&lt;BR&gt;intMultiMinPageIndex=(IntPageForMax*ItemSize);&lt;BR&gt;intMultimaxPageIndex=((IntPageForMax 1)*ItemSize) 1;&lt;BR&gt;PageListStr='&amp;lt;aid='' this.UniqueID ''title='点击转到第[' MultiMinPageIndex ']页'href='javascrcipt:' Page.GetPostBackEventReference(this.MultiMinPageIndex.ToString()) ''&amp;gt;&amp;lt;&amp;lt;&amp;lt;/a&amp;gt;' PageListStr.Trim() '&amp;lt;aid='' this.UniqueID ''title='点击转到第[' MultiMaxPageIndex ']页'href='javascript:' Page.GetPostBackEventReference(this.MultiMaxPageIndex.ToString()) ''&amp;gt;&amp;gt;&amp;gt;&amp;lt;/a&amp;gt;';&lt;BR&gt;}&lt;BR&gt;//当当前页数大于ItemSize,且总的页数减去当前页数大于等于尾数值页数时&lt;BR&gt;if(CurrentPageIndex&amp;gt;10&amp;amp;&amp;amp;(TotalPage-CurrentPageIndex)&amp;lt;SingleNumber)&lt;BR&gt;{&lt;BR&gt;intMultiMinPageIndex=(IntPageForMax*ItemSize);&lt;BR&gt;PageListStr='&amp;lt;aid='' this.UniqueID ''title='点击转到第[' MultiMinPageIndex ']页'href='javascript:' Page.GetPostBackEventReference(this,MultiMinPageIndex.ToString()) ''&amp;gt;&amp;lt;&amp;lt;&amp;lt;/a&amp;gt;' PageListStr.Trim();&lt;BR&gt;}&lt;BR&gt;PageListStr=PageListStr==''?'&amp;lt;fontcolor=' PageIndexColor '&amp;gt;0&amp;lt;/font&amp;gt;':PageListStr;&lt;BR&gt;PageListStr=PageListStr '' PageInfo;&lt;BR&gt;Output.Write(PageListStr);&lt;BR&gt;}&lt;BR&gt;}&lt;BR&gt;base.RenderContents(output);&lt;BR&gt;}&lt;BR&gt;}&lt;BR&gt;}&lt;BR&gt;控件中有几个相关的属性，在使用的时候，只需要指定：TotalRecord(总记录数)、PageSize(每页的数据记录数)、CurrentPageIndex(当前页面值)、ItemSize(分页条显示页面值的规格)&lt;BR&gt;控件中有个ChangePageClick事件，可以利用“控件ID.CurrentPageIndex”属性来获取当前页面值。&lt;BR&gt;&lt;/P&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/wyangel/261840912/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/wyangel/261840912/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class=&quot;fsflare&quot;&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=d34880122cf7dff38d2abe6dde683bcf&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=d34880122cf7dff38d2abe6dde683bcf&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=7d524d72b5a952e2c6d5510304a8b4b0&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=7d524d72b5a952e2c6d5510304a8b4b0&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=5cdab45a84f31234ad05cddebc750e50&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=5cdab45a84f31234ad05cddebc750e50&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=d383375d786263dabd93fc2e20ee6953&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=d383375d786263dabd93fc2e20ee6953&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;</description><category>.NET学习</category><pubDate>Fri, 03 Oct 2008 18:39:17 +0800</pubDate><author>wy533@126.com(admin)</author><guid isPermaLink="false">http://blog.wyangel.com/default.asp?id=1156</guid><dc:creator>wy533@126.com(admin)</dc:creator><fs:srclink>http://blog.wyangel.com/default.asp?id=1156</fs:srclink><fs:srcfeed>http://blog.wyangel.com/feed.asp</fs:srcfeed><fs:itemid>feedsky/wyangel/~7058344/261840912/4070471</fs:itemid></item><item><title>ASP.NET的Session详解</title><link>http://blog.wyangel.com/default.asp?id=1155</link><description>&lt;P&gt;Session模型简介&lt;/P&gt;&lt;P&gt;Session是什么呢？简单来说就是服务器给客户端的一个编号。当一台WWW服务器运行时，可能有若干个用户浏览正在运正在这台服务器上的网站。当每个用户首次与这台WWW服务器建立连接时，他就与这个服务器建立了一个Session，同时服务器会自动为其分配一个SessionID，用以标识这个用户的唯一身份。这个SessionID是由WWW服务器随机产生的一个由24个字符组成的字符串，我们会在下面的实验中见到它的实际样子。&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;这个唯一的SessionID是有很大的实际意义的。当一个用户提交了表单时，浏览器会将用户的SessionID自动附加在HTTP头信息中，（这是浏览器的自动功能，用户不会察觉到），当服务器处理完这个表单后，将结果返回给SessionID所对应的用户。试想，如果没有SessionID，当有两个用户同时进行注册时，服务器怎样才能知道到底是哪个用户提交了哪个表单呢。当然，SessionID还有很多其他的作用，我们会在后面提及到。&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;除了SessionID，在每个Session中还包含很多其他信息。但是对于编写ASP或ASP.NET的程序与来说，最有用的还是可以通过访问ASP/ASP.NET的内置Session对象，为每个用户存储各自的信息。例如我们想了解一下访问我们网站的用户浏览了几个页面，我们可能在用户可能访问到每个的页面中加入：&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;lt;&lt;/P&gt;&lt;P&gt;IfSession(&quot;PageViewed&quot;)=&quot;&quot;Then&lt;/P&gt;&lt;P&gt;　Session(&quot;PageViewed&quot;)=1&lt;/P&gt;&lt;P&gt;Else&lt;/P&gt;&lt;P&gt;　Session(&quot;PageViewed&quot;)=Session(&quot;PageViewed&quot;) 1&lt;/P&gt;&lt;P&gt;EndIf&lt;/P&gt;&lt;P&gt;&amp;gt;&lt;/P&gt;&lt;P&gt;通过以下这句话可以让用户得知自己浏览了几个页面：&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;lt;&lt;/P&gt;&lt;P&gt;Response.Write(&quot;Youhaveviewed&quot;&amp;amp;Session(&quot;PageViewed&quot;)&amp;amp;&quot;pages&quot;)&lt;/P&gt;&lt;P&gt;&amp;gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;可能有些有些读者会问：这个看似像是数组的Session(“..”)是哪里来的？需要我定义吗？实际上，这个Session对象是具有ASP解释能力的的WWW服务器的内建对象。也就是说ASP的系统中已经给你定义好了这个对象，你只需要使用就行了。其中Session(“..”)中的..就好像变量名称，Session(“..”)=$$中的$$就是变量的值了。你只需要写上句话，在这个用户的每个页面中都可以访问..变量中的值了。&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;其实ASP一共内建了7个对象，有Session、Application、Cookie、Response、Request、Server等。在其他的服务器端脚本语言如JSP、PHP等中也有其类似的对象，只是叫法或者使用方法上不太一样。&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;ASPSession的功能的缺陷&lt;/P&gt;&lt;P&gt;目前ASP的开发人员都正在使用Session这一强大的功能，但是在他们使用的过程中却发现了ASPSession有以下缺陷：&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;进程依赖性：ASPSession状态存于IIS的进程中，也就是inetinfo.exe这个程序。所以当inetinfo.exe进程崩溃时，这些信息也就丢失。另外，重起或者关闭IIS服务都会造成信息的丢失。&lt;/P&gt;&lt;P&gt;Session状态使用范围的局限性：刚一个用户从一个网站访问到另外一个网站时，这些Session信息并不会随之迁移过去。例如：新浪网站的WWW服务器可能不止一个，一个用户登录之后要去各个频道浏览，但是每个频道都在不同的服务器上，如果想在这些WWW服务器共享Session信息怎么办呢？&lt;/P&gt;&lt;P&gt;Cookie的依赖性：实际上客户端的Session信息是存储与Cookie中的，如果客户端完全禁用掉了Cookie功能，他也就不能享受到了Session提供的功能了。&lt;/P&gt;&lt;P&gt;鉴于ASPSession的以上缺陷，微软的设计者们在设计开发ASP.NETSession时进行了相应的改进，完全克服了以上缺陷，使得ASP.NETSession成为了一个更加强大的功能。&lt;/P&gt;&lt;P&gt;Web.config文件简介&lt;/P&gt;&lt;P&gt;有的ASP.NET程序员说：Web.config文件？我从来没有听说过啊，可是我写的程序不是也能很正常的运转吗？是的，你说得没错，没有Web.config文件程序是可以正常运行的。但是，如果你做了一个大型的网站，需要对整个网站做一些整体配置，例如整个网站的页面使用何种语言编写的、网站的安全认证模式、Session信息存储方式等，这时你就需要使用Web.config文件了。虽然Web.config文件中的某些选项是可以通过IIS配置的，但是如果在Web.config中也有相应的设置就会覆盖掉IIS中的配置。而且，Web.config文件的最大的便利之处就是可以在ASP.NET页面中通过调用System.web名字空间访问Web.config中的设置。&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Web.config有两种，分别是服务器配置文件和Web应用程序配置文件，他们都名为Web.config。在这个配置文件中会保存当前IIS服务器中网页的使用哪种语言编写的、应用程序安全认证模式、Session信息存储方式的一系列信息。这些信息是使用XML语法保存的，如果想对其编辑，使用文本编辑器就行了。&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;其中服务器配置文件会对IIS服务器下所有的站点中的所有应用程序起作用。在.NETFramework1.0中，服务器的Web.config文件是存在：\WinNT\Microsoft.NET\Framework\v1.0.3705中的。&lt;/P&gt;&lt;P&gt;而Web应用程序配置文件Web.config则保存在各个Web应用程序中。例如：当前网站的根目录\Inetpub\wwwroot，而当前的Web应用程序为MyApplication，则Web应用程序根目录就应为：\Inetpub\wwwroot\MyApplication。如果你的网站有且只有一个Web应用程序，一般说来应用程序的根目录就是\Inetpub\wwwroot。如果想添加一个Web应用程序，在IIS中添加一个具有应用程序起始点的虚拟目录就行了。这个目录下的文件及目录将被视为一个Web应用程序。但是，这样通过IIS添加Web应用程序是不会为你生成Web.config文件的。如果想创建一个带有Web.config文件的Web应用程序，需要使用VisualStudio.NET，新建一个Web应用程序项目。&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Web应用程序的配置文件Web.config是可选的，可有可无。如果没有，每个Web应用程序会使用服务器的Web.config配置文件。如果有，则会覆盖服务器Web.config配置文件中相应的值。&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;在ASP.NET中，Web.config修改保存后会自动立刻成效，不用再像ASP中的配置文件修改后需要重新启动Web应用程序才能生效了。&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Web.config文件中的Session配置信息&lt;/P&gt;&lt;P&gt;打开某个应用程序的配置文件Web.config后，我们会发现以下这段：&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;lt;sessionState&lt;/P&gt;&lt;P&gt;mode=&quot;InProc&quot;&lt;/P&gt;&lt;P&gt;stateConnectionString=&quot;tcpip=127.0.0.1:42424&quot;&lt;/P&gt;&lt;P&gt;sqlConnectionString=&quot;datasource=127.0.0.1;Trusted_Connection=yes&quot;&lt;/P&gt;&lt;P&gt;cookieless=&quot;false&quot;&lt;/P&gt;&lt;P&gt;timeout=&quot;20&quot;&lt;/P&gt;&lt;P&gt;/&amp;gt;&lt;/P&gt;&lt;P&gt;这一段就是配置应用程序是如何存储Session信息的了。我们以下的各种操作主要是针对这一段配置展开。让我们先看看这一段配置中所包含的内容的意思。sessionState节点的语法是这样的：&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;lt;sessionStatemode=&quot;Off|InProc|StateServer|SQLServer&quot;&lt;/P&gt;&lt;P&gt;cookieless=&quot;true|false&quot;&lt;/P&gt;&lt;P&gt;timeout=&quot;numberofminutes&quot;&lt;/P&gt;&lt;P&gt;stateConnectionString=&quot;tcpip=server:port&quot;&lt;/P&gt;&lt;P&gt;sqlConnectionString=&quot;sqlconnectionstring&quot;&lt;/P&gt;&lt;P&gt;stateNetworkTimeout=&quot;numberofseconds&quot;&lt;/P&gt;&lt;P&gt;/&amp;gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;必须有的属性是&lt;/P&gt;&lt;P&gt;属性选项描述&lt;/P&gt;&lt;P&gt;mode设置将Session信息存储到哪里&lt;/P&gt;&lt;P&gt;Off设置为不使用Session功能&lt;/P&gt;&lt;P&gt;InProc设置为将Session存储在进程内，就是ASP中的存储方式，这是默认值。&lt;/P&gt;&lt;P&gt;StateServer设置为将Session存储在独立的状态服务中。&lt;/P&gt;&lt;P&gt;SQLServer设置将Session存储在SQLServer中。&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;可选的属性是：&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;属性选项描述&lt;/P&gt;&lt;P&gt;cookieless设置客户端的Session信息存储到哪里&lt;/P&gt;&lt;P&gt;ture使用Cookieless模式&lt;/P&gt;&lt;P&gt;false使用Cookie模式，这是默认值。&lt;/P&gt;&lt;P&gt;timeout设置经过多少分钟后服务器自动放弃Session信息。默认为20分钟&lt;/P&gt;&lt;P&gt;stateConnectionString设置将Session信息存储在状态服务中时使用的服务器名称和端口号，例如：&quot;tcpip=127.0.0.1:42424”。当mode的值是StateServer是，这个属性是必需的。&lt;/P&gt;&lt;P&gt;sqlConnectionString设置与SQLServer连接时的连接字符串。例如&quot;datasource=localhost;IntegratedSecurity=SSPI;InitialCatalog=northwind&quot;。当mode的值是SQLServer时，这个属性是必需的。&lt;/P&gt;&lt;P&gt;stateNetworkTimeout设置当使用StateServer模式存储Session状态时，经过多少秒空闲后，断开Web服务器与存储状态信息的服务器的TCP/IP连接的。默认值是10秒钟。&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;ASP.NET中客户端Session状态的存储&lt;/P&gt;&lt;P&gt;在我们上面的Session模型简介中，大家可以发现Session状态应该存储在两个地方，分别是客户端和服务器端。客户端只负责保存相应网站的SessionID，而其他的Session信息则保存在服务器端。在ASP中，客户端的SessionID实际是以Cookie的形式存储的。如果用户在浏览器的设置中选择了禁用Cookie，那末他也就无法享受Session的便利之处了，甚至造成不能访问某些网站。为了解决以上问题，在ASP.NET中客户端的Session信息存储方式分为：Cookie和Cookieless两种。&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;ASP.NET中，默认状态下，在客户端还是使用Cookie存储Session信息的。如果我们想在客户端使用Cookieless的方式存储Session信息的方法如下：&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;找到当前Web应用程序的根目录，打开Web.Config文件，找到如下段落：&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;lt;sessionState&lt;/P&gt;&lt;P&gt;mode=&quot;InProc&quot;&lt;/P&gt;&lt;P&gt;stateConnectionString=&quot;tcpip=127.0.0.1:42424&quot;&lt;/P&gt;&lt;P&gt;sqlConnectionString=&quot;datasource=127.0.0.1;Trusted_Connection=yes&quot;&lt;/P&gt;&lt;P&gt;cookieless=&quot;false&quot;&lt;/P&gt;&lt;P&gt;timeout=&quot;20&quot;&lt;/P&gt;&lt;P&gt;/&amp;gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;这段话中的cookieless=&quot;false&quot;改为：cookieless=&quot;true&quot;，这样，客户端的Session信息就不再使用Cookie存储了，而是将其通过URL存储。关闭当前的IE，打开一个新IE，重新访问刚才的Web应用程序，就会看到类似下面的样子：&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;其中，http://localhost/MyTestApplication/(ulqsek45heu3ic2a5zgdl245)/default.aspx中黑体标出的就是客户端的SessionID。注意，这段信息是由IIS自动加上的，不会影响以前正常的连接。&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;ASP.NET中服务器端Session状态的存储&lt;/P&gt;&lt;P&gt;准备工作&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;为了您能更好的体验到实验现象，您可以建立一个叫做SessionState.aspx的页面，然后把以下这些代码添加到&amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;中。&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;lt;scriptrunat=&quot;server&quot;&amp;gt;&lt;/P&gt;&lt;P&gt;SubSession_Add(senderAsObject,eAsEventArgs)&lt;/P&gt;&lt;P&gt;　Session(&quot;MySession&quot;)=text1.Value&lt;/P&gt;&lt;P&gt;　span1.InnerHtml=&quot;Sessiondataupdated!&amp;lt;P&amp;gt;Yoursessioncontains:&amp;lt;fontcolor=red&amp;gt;&quot;&amp;amp;\&lt;/P&gt;&lt;P&gt;Session(&quot;MySession&quot;).ToString()&amp;amp;&quot;&amp;lt;/font&amp;gt;&quot;&lt;/P&gt;&lt;P&gt;EndSub&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;SubCheckSession(senderAsObject,eAsEventArgs)&lt;/P&gt;&lt;P&gt;　If(Session(&quot;MySession&quot;)IsNothing)Then&lt;/P&gt;&lt;P&gt;　span1.InnerHtml=&quot;NOTHING,SESSIONDATALOST!&quot;&lt;/P&gt;&lt;P&gt;　Else&lt;/P&gt;&lt;P&gt;　span1.InnerHtml=&quot;Yoursessioncontains:&amp;lt;fontcolor=red&amp;gt;&quot;&amp;amp;\&lt;/P&gt;&lt;P&gt;Session(&quot;MySession&quot;).ToString()&amp;amp;&quot;&amp;lt;/font&amp;gt;&quot;&lt;/P&gt;&lt;P&gt;EndIf&lt;/P&gt;&lt;P&gt;EndSub&lt;/P&gt;&lt;P&gt;&amp;lt;/script&amp;gt;&lt;/P&gt;&lt;P&gt;&amp;lt;formrunat=&quot;server&quot;id=&quot;Form2&quot;&amp;gt;&lt;/P&gt;&lt;P&gt;　&amp;lt;inputid=&quot;text1&quot;type=&quot;text&quot;runat=&quot;server&quot;name=&quot;text1&quot;&amp;gt;&lt;/P&gt;&lt;P&gt;　&amp;lt;inputtype=&quot;submit&quot;runat=&quot;server&quot;OnServerClick=&quot;Session_Add&quot;&lt;/P&gt;&lt;P&gt;　value=&quot;AddtoSessionState&quot;id=&quot;Submit1&quot;name=&quot;Submit1&quot;&amp;gt;&lt;/P&gt;&lt;P&gt;　&amp;lt;inputtype=&quot;submit&quot;runat=&quot;server&quot;OnServerClick=&quot;CheckSession&quot;&lt;/P&gt;&lt;P&gt;　value=&quot;ViewSessionState&quot;id=&quot;Submit2&quot;name=&quot;Submit2&quot;&amp;gt;&lt;/P&gt;&lt;P&gt;&amp;lt;/form&amp;gt;&lt;/P&gt;&lt;P&gt;&amp;lt;hrsize=&quot;1&quot;&amp;gt;&lt;/P&gt;&lt;P&gt;&amp;lt;fontsize=&quot;6&quot;&amp;gt;&amp;lt;spanid=&quot;span1&quot;runat=&quot;server&quot;/&amp;gt;&amp;lt;/font&amp;gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;这个SessionState.aspx的页面可以用来测试在当前的服务器上是否丢失了Session信息。&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;将服务器Session信息存储在进程中&lt;/P&gt;&lt;P&gt;让我们来回到Web.config文件的刚才那段段落中：&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;lt;sessionState&lt;/P&gt;&lt;P&gt;mode=&quot;InProc&quot;&lt;/P&gt;&lt;P&gt;stateConnectionString=&quot;tcpip=127.0.0.1:42424&quot;&lt;/P&gt;&lt;P&gt;sqlConnectionString=&quot;datasource=127.0.0.1;Trusted_Connection=yes&quot;&lt;/P&gt;&lt;P&gt;cookieless=&quot;false&quot;&lt;/P&gt;&lt;P&gt;timeout=&quot;20&quot;&lt;/P&gt;&lt;P&gt;/&amp;gt;&lt;/P&gt;&lt;P&gt;当mode的值是InProc时，说明服务器正在使用这种模式。&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;这种方式和以前ASP中的模式一样，就是服务器将Session信息存储在IIS进程中。当IIS关闭、重起后，这些信息都会丢失。但是这种模式也有自己最大好处，就是性能最高。应为所有的Session信息都存储在了IIS的进程中，所以IIS能够很快的访问到这些信息，这种模式的性能比进程外存储Session信息或是在SQLServer中存储Session信息都要快上很多。这种模式也是ASP.NET的默认方式。&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;好了，现在让我们做个试验。打开刚才的SessionState.aspx页面，随便输入一些字符，使其存储在Session中。然后，让我们让IIS重起。注意，并不是使当前的站点停止再开始，而是在IIS中本机的机器名的节点上点击鼠标右键，选择重新启动IIS。(想当初使用NT4时，重新启动IIS必须要重新启动计算机才行，微软真是@#$^&amp;amp;)返回到SessionState.aspx页面中，检查刚才的Session信息，发现信息已经丢失了。&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;将服务器Session信息存储在进程外&lt;/P&gt;&lt;P&gt;首先，让我们来打开管理工具-&amp;gt;服务，找到名为：ASP.NETStateService的服务，启动它。实际上，这个服务就是启动一个要保存Session信息的进程。启动这个服务后，你可以从Windows任务管理器-&amp;gt;进程中看到一个名为aspnet_state.exe的进程，这个就是我们保存Session信息的进程。&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;然后，回到Web.config文件中上述的段落中，将mode的值改为StateServer。保存文件后的重新打开一个IE，打开SessionState.aspx页面，保存一些信息到Session中。这时，让我们重起IIS，再回到SessionState.aspx页面中查看刚才的Session信息，发现没有丢失。&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;实际上，这种将Session信息存储在进程外的方式不光指可以将信息存储在本机的进程外，还可以将Session信息存储在其他的服务器的进程中。这时，不光需要将mode的值改为StateServer，还需要在stateConnectionString中配置相应的参数。例如你的计算你是192.168.0.1，你想把Session存储在IP为192.168.0.2的计算机的进程中，就需要设置成这样：stateConnectionString=&quot;tcpip=192.168.0.2:42424&quot;。当然，不要忘记在192.168.0.2的计算机中装上.NETFramework，并且启动ASP.NETStateServices服务。&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;将服务器Session信息存储在SQLServer中&lt;/P&gt;&lt;P&gt;首先，还是让我们来做一些准备工作。启动SQLServer和SQLServer代理服务。在SQLServer中执行一个叫做InstallSqlState.sql的脚本文件。这个脚本文件将在SQLServer中创建一个用来专门存储Session信息的数据库，及一个维护Session信息数据库的SQLServer代理作业。我们可以在以下路径中找到那个文件：&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;[systemdrive]\winnt\Microsoft.NET\Framework\[version]\&lt;/P&gt;&lt;P&gt;然后打开查询分析器，连接到SQLServer服务器，打开刚才的那个文件并且执行。稍等片刻，数据库及作业就建立好了。这时，你可以打开企业管理器，看到新增了一个叫ASPState的数据库。但是这个数据库中只是些存储过程，没有用户表。实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中的，另外一个ASPStateTempApplications表存储了ASP中Application对象信息。这两个表也是刚才的那个脚本建立的。另外查看管理-&amp;gt;SQLServer代理-&amp;gt;作业，发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业，这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息的。&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;接着，我们返回到Web.config文件，修改mode的值改为SQLServer。注意，还要同时修改sqlConnectionString的值，格式为：&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;sqlConnectionString=&quot;datasource=localhost;IntegratedSecurity=SSPI;&quot;&lt;/P&gt;&lt;P&gt;其中datasource是指SQLServer服务器的IP地址，如果SQLServer与IIS是一台机子，写127.0.0.1就行了。IntegratedSecurity=SSPI的意思是使用Windows集成身份验证，这样，访问数据库将以ASP.NET的身份进行，通过如此配置，能够获得比使用userid=sa;password=口令的SQLServer验证方式更好的安全性。当然，如果SQLServer运行于另一台计算机上，你可能会需要通过ActiveDirectory域的方式来维护两边验证的一致性。&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;同样，让我们做个试验。向SessionState.aspx中添加Session信息，这时发现Session信息已经存在SQLServer中了，即使你重起计算机，刚才的Session信息也不会丢失。现在，你已经完全看见了Session信息到底是什么样子的了，而且又是存储在SQLServer中的，能干什么就看你的发挥了。&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;总结&lt;/P&gt;&lt;P&gt;通过这篇文章，你可以看到在Session的管理和维护上，ASP.NET比ASP有了很大的进步，我们可以更加随意的挑选适合的方法了。对于企业级的应用来说，这无疑对于服务器的同步、服务器的稳定性、可靠性都是有利的。相信在强大的微软支持下，新一代的电子商务平台将会搭建的更好！&lt;BR&gt;&lt;/P&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/wyangel/261840913/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/wyangel/261840913/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class=&quot;fsflare&quot;&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=d4a5eac82353b4a90c3ea5cb0cd125c2&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=d4a5eac82353b4a90c3ea5cb0cd125c2&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=b193d079af27a1123036312b703177f5&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=b193d079af27a1123036312b703177f5&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=f3001d417dc12e476afc77321ec00f55&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=f3001d417dc12e476afc77321ec00f55&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=8462a13c43fc63082c7e575e27f1f2a9&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=8462a13c43fc63082c7e575e27f1f2a9&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;</description><category>.NET学习</category><pubDate>Fri, 03 Oct 2008 18:39:16 +0800</pubDate><author>wy533@126.com(admin)</author><guid isPermaLink="false">http://blog.wyangel.com/default.asp?id=1155</guid><dc:creator>wy533@126.com(admin)</dc:creator><fs:srclink>http://blog.wyangel.com/default.asp?id=1155</fs:srclink><fs:srcfeed>http://blog.wyangel.com/feed.asp</fs:srcfeed><fs:itemid>feedsky/wyangel/~7058344/261840913/4070471</fs:itemid></item><item><title>Asp.netAjax1.0异步回调时,服务器端Render原理</title><link>http://blog.wyangel.com/default.asp?id=1154</link><description>&lt;P&gt;首冼回顾一下&lt;BR&gt;Page页的生命周期&lt;/P&gt;&lt;P&gt;PreInit&lt;BR&gt;Init&lt;BR&gt;InitComplete&lt;BR&gt;LoadState&lt;BR&gt;ProcessPostData&lt;BR&gt;PreLoad&lt;BR&gt;Load&lt;BR&gt;LoadComplete&lt;BR&gt;PreRender&lt;BR&gt;PrepareCallback//如果有回调&lt;BR&gt;PreRenderComplete&lt;BR&gt;SaveState&lt;BR&gt;SaveStateComplete&lt;BR&gt;Render&lt;/P&gt;&lt;P&gt;不论是Asp.net请求,还是Ajax请求,都要执行上面的页生命周期,&lt;/P&gt;&lt;P&gt;在Page页最后会调用Page.RenderControl()呈现Page所有子控件&lt;/P&gt;&lt;P&gt;流程如下&lt;/P&gt;&lt;P&gt;Page.RenderControl&lt;BR&gt;Control.RenderControl()&lt;BR&gt;Control.RenderControl(writer,this.Adapter)&lt;BR&gt;Control.RenderControlInternal()&lt;BR&gt;Control.Render()//此时Page.Render()将其重写&lt;BR&gt;Control.RenderChildren()&lt;BR&gt;Control.RenderControlInternal()&lt;/P&gt;&lt;P&gt;现在关键所在&lt;BR&gt;Control.RenderControlInternal()实现如下&lt;BR&gt;如果不是Asp.netAjax处理,肯定会执行foreach依次对所有的子控件进行遍历&lt;/P&gt;&lt;P&gt;internalvoidRenderChildrenInternal(HtmlTextWriterwriter,ICollectionchildren)&lt;BR&gt;{&lt;BR&gt;//正常情况如果不设置RareFields,进行默认的流程依次对所有子控件进行处理,&lt;BR&gt;//如果设置RareFields,意思就是以自定义的方式改写RenderChildren&lt;BR&gt;if((this.RareFields!=null)&amp;amp;&amp;amp;(this.RareFields.RenderMethod!=null))//当您SetRenderMethodDelegate时,RareFieldsEnsured就有值啦&lt;BR&gt;{&lt;BR&gt;writer.BeginRender();&lt;BR&gt;&lt;BR&gt;//调用RenderMethod委托,Asp.netAjax1.0在使用Control.SetRenderMethodDelegate时,对应的回调函数就是在此时处理的&lt;BR&gt;this.RareFields.RenderMethod(writer,this);&lt;BR&gt;writer.EndRender();&lt;BR&gt;}&lt;BR&gt;elseif(children!=null)&lt;BR&gt;{&lt;BR&gt;//如果不设置这个RareFieldsEnsured,会把Page里所有的控件呈现&lt;BR&gt;//依次调用Control里所有子控件的RenderControl&lt;BR&gt;foreach(Controlcontrolinchildren)&lt;BR&gt;{&lt;BR&gt;control.RenderControl(writer);&lt;BR&gt;}&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;以上是Asp.net的Render处理&lt;BR&gt;肯定有人要问上面的if是干吗的,这个可是微软流的接口呀,整个asp.netajax全靠这个接口进行处理&lt;/P&gt;&lt;P&gt;在Asp.netAjax1.0上,你肯定要放一个ScriptManager吧&lt;BR&gt;它也是Control的子类,&lt;BR&gt;在Page生命周期的OnPreRender时,它会调用&lt;/P&gt;&lt;P&gt;PageRequestManager.OnPreRender();&lt;/P&gt;&lt;P&gt;&lt;BR&gt;问题就在这，PageRequestManager.OnPreRender()实现如下&lt;/P&gt;&lt;P&gt;_owner.IPage.SetRenderMethodDelegate(RenderPageCallback);&lt;/P&gt;&lt;P&gt;SetRenderMethodDelegate()方法是干什么用的&lt;/P&gt;&lt;P&gt;在Control中,当您调用了SetRenderMethodDelegate会给Control.RareFieldsEnsured设置值&lt;BR&gt;publicvoidSetRenderMethodDelegate(RenderMethodrenderMethod)&lt;BR&gt;{&lt;BR&gt;//使用OccasionalFields.RareField&lt;BR&gt;this.RareFieldsEnsured.RenderMethod=renderMethod;&lt;BR&gt;this.Controls.SetCollectionReadOnly(&quot;Collection_readonly_Codeblocks&quot;);&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;到这一切就清晰了,当您设置了RenderPageCallback,正常的Asp.net流程就不会再走了,所有的子控件就不会被Render&lt;BR&gt;在Asp.netAjax1.0中使用&lt;/P&gt;&lt;P&gt;privatevoidRenderPageCallback(HtmlTextWriterwriter,ControlpageControl)&lt;BR&gt;{&lt;BR&gt;...&lt;BR&gt;//取出当前的HtmlForm&lt;BR&gt;IHtmlFormformControl=_owner.IPage.Form;&lt;BR&gt;&lt;BR&gt;//手动设置当FormControl.RenderControl时()回调方法,因为这个时候Page.Controls里有子控件不会被Render啦,怎么办&lt;BR&gt;//手动处理一个呗&lt;BR&gt;formControl.SetRenderMethodDelegate(RenderFormCallback);&lt;BR&gt;&lt;BR&gt;//同样,HtmlForm.RenderControl不会在Page.Controls里自动触发的&lt;BR&gt;//这个时候您需要手动的RenderCtronl一下,这样才能调用RenderFormCallback&lt;BR&gt;formControl.RenderControl(formWriter);&lt;BR&gt;&lt;BR&gt;//生成客户端回调信息|asyncPostBackControlIDs&lt;BR&gt;EncodeString(writer,AsyncPostBackControlIDsToken,String.Empty,GetAsyncPostBackControlIDs(false));&lt;BR&gt;//生成客户端回调信息|postBackControlIDs&lt;BR&gt;EncodeString(writer,PostBackControlIDsToken,String.Empty,GetPostBackControlIDs(false));&lt;BR&gt;//生成客户端回调信息|updatePanelIDs|tUpdatePanel&lt;BR&gt;EncodeString(writer,UpdatePanelIDsToken,String.Empty,GetAllUpdatePanelIDs());&lt;BR&gt;//生成客户端回调信息|childUpdatePanelIDs&lt;BR&gt;EncodeString(writer,ChildUpdatePanelIDsToken,String.Empty,GetChildUpdatePanelIDs());&lt;BR&gt;//生成客户端回调信息|panelsToRefreshIDs&lt;BR&gt;EncodeString(writer,UpdatePanelsToRefreshToken,String.Empty,GetRefreshingUpdatePanelIDs());&lt;BR&gt;//生成客户端回调信息|asyncPostBackTimeout&lt;BR&gt;EncodeString(writer,AsyncPostBackTimeoutToken,String.Empty,_owner.AsyncPostBackTimeout.ToString(CultureInfo.InvariantCulture));&lt;BR&gt;&lt;BR&gt;........&lt;BR&gt;&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;privatevoidRenderFormCallback(HtmlTextWriterwriter,ControlcontainerControl)&lt;BR&gt;{&lt;BR&gt;....&lt;BR&gt;//呈现所有的UpdatePanel&lt;BR&gt;if(_updatePanelsToRefresh!=null)&lt;BR&gt;{&lt;BR&gt;foreach(UpdatePanelpanelin_updatePanelsToRefresh)&lt;BR&gt;{&lt;BR&gt;if(panel.Visible)&lt;BR&gt;{&lt;BR&gt;panel.RenderControl(_updatePanelWriter);&lt;BR&gt;//会生成如何的客户端回调信息&lt;BR&gt;//169|updatePanel|UpdatePanel1|\r\n&lt;BR&gt;}&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;}&lt;BR&gt;...&lt;BR&gt;//依次将页面上所有控件的RenderControl,写入dummyWriter&lt;BR&gt;foreach(ControlcontrolincontainerControl.Controls)&lt;BR&gt;{&lt;BR&gt;control.RenderControl(dummyWriter);&lt;BR&gt;//生成一部分信息&lt;BR&gt;&amp;lt;inputtype=\&quot;submit\&quot;name=\&quot;Button1\&quot;value=\&quot;Button\&quot;id=\&quot;Button1\&quot;/&amp;gt;\r\n&lt;BR&gt;&amp;lt;inputname=\&quot;txt\&quot;type=\&quot;text\&quot;value=\&quot;wxy\&quot;id=\&quot;txt\&quot;/&amp;gt;\r\n&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;注意,在RenderFormCallback时,HttpRequest会手动的Flush()将上面的信息刷加IIS&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;至于Ctronl.Render时,是如何写入HtmlTextWriter,再写入HttpWriter,&lt;BR&gt;再写回HttpWorkRequest,最终刷回内核,或使用socket发送回服务器,不在本文讨论范围.......&lt;/P&gt;&lt;P&gt;&lt;BR&gt;由上可见,Asp.netAjax,必没有使用传统的HttpRequest.Filter来处理回发信息,而是使用了Asp.net2.0内置的方式和回调的&lt;/P&gt;&lt;P&gt;&lt;BR&gt;Asp.netAjax回调后呈现到客户端有二个部分,一部分是由RenderFormCallback生成的如下&lt;/P&gt;&lt;P&gt;RenderFormCallback部分会生成如下的客户端脚本&lt;BR&gt;169|updatePanel|UpdatePanel1|\r\n&lt;BR&gt;&lt;BR&gt;&amp;lt;inputtype=\&quot;submit\&quot;name=\&quot;Button1\&quot;value=\&quot;Button\&quot;id=\&quot;Button1\&quot;/&amp;gt;\r\n&lt;BR&gt;&amp;lt;inputname=\&quot;txt\&quot;type=\&quot;text\&quot;value=\&quot;wxy\&quot;id=\&quot;txt\&quot;/&amp;gt;\r\n&lt;/P&gt;&lt;P&gt;一部分是RenderPageCallback生成的&lt;/P&gt;&lt;P&gt;52|hiddenField&lt;BR&gt;|__VIEWSTATE|/wEPDwUJNjg1NjA3NDcxZGRCX32AH2I/NEq gCFrVr49kQDECw==|56&lt;BR&gt;|hiddenField|__EVENTVALIDATION|/wEWAwKf344xAoznisYGApKGsMIJOfjKisKPYP0O2NXUpNjnA29hMlA=|0&lt;BR&gt;|asyncPostBackControlIDs|||0|postBackControlIDs|||13|updatePanelIDs||tUpdatePanel1|0&lt;BR&gt;|childUpdatePanelIDs|||12|panelsToRefreshIDs||UpdatePanel1|2|asyncPostBackTimeout||90|12&lt;BR&gt;|formAction||Default.aspx|13|pageTitle||UntitledPage|&lt;/P&gt;&lt;P&gt;&lt;BR&gt;在客户端的部分Sys.WebForm._onFormSubmitCompleted()会对所有的信息以Jsontype:type,id:id,content:content进行封装&lt;BR&gt;取出UpdatePanel,设置其innerhtml,客户端详细部分见赵老大的blogs&lt;BR&gt;http://www.cnblogs.com/liuxu-wxy/archive/2007/04/25/727346.html&lt;/P&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/wyangel/261840914/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/wyangel/261840914/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class=&quot;fsflare&quot;&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=e54d76e6c33b953bb37621f56d5e7655&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=e54d76e6c33b953bb37621f56d5e7655&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=e0d86963c8dc366f9a433bb4ecf0f84f&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=e0d86963c8dc366f9a433bb4ecf0f84f&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=6206e7568a8f3497afac864fefe0f85d&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=6206e7568a8f3497afac864fefe0f85d&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=890f9cd6edf2843fd1c174ccd8bee8b4&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=890f9cd6edf2843fd1c174ccd8bee8b4&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;</description><category>.NET学习</category><pubDate>Sat, 27 Sep 2008 12:03:20 +0800</pubDate><author>wy533@126.com(admin)</author><guid isPermaLink="false">http://blog.wyangel.com/default.asp?id=1154</guid><dc:creator>wy533@126.com(admin)</dc:creator><fs:srclink>http://blog.wyangel.com/default.asp?id=1154</fs:srclink><fs:srcfeed>http://blog.wyangel.com/feed.asp</fs:srcfeed><fs:itemid>feedsky/wyangel/~7058344/261840914/4070471</fs:itemid></item><item><title>动态创建MSSQL数据库表存储过程</title><link>http://blog.wyangel.com/default.asp?id=1153</link><description>&lt;P&gt;　　下面是利用SQL语句创建数据库、表、存储过程、视图、索引、规则、修改表、查看数据等的方法。所要增加的控件如下：&lt;/P&gt;&lt;P&gt;以下是引用片段：&lt;BR&gt;ImportsSystem.Data&lt;BR&gt;ImportsSystem.Data.SqlClient&lt;/P&gt;&lt;P&gt;PublicClassForm1&lt;BR&gt;InheritsSystem.Windows.Forms.Form&lt;BR&gt;PrivateConnectionStringAsString=&quot;DataSource=.;InitialCatalog=;UserId=sa;Password=;&quot;&lt;BR&gt;PrivatereaderAsSqlDataReader=Nothing&lt;BR&gt;PrivateconnAsSqlConnection=Nothing&lt;BR&gt;PrivatecmdAsSqlCommand=Nothing&lt;BR&gt;PrivateAlterTableBtnAsSystem.Windows.Forms.Button&lt;BR&gt;PrivatesqlAsString=Nothing&lt;BR&gt;PrivateCreateOthersBtnAsSystem.Windows.Forms.Button&lt;/P&gt;&lt;P&gt;#Region&quot;Windows窗体设计器生成的代码&quot;&lt;BR&gt;'窗体重写处置以清理组件列表。&lt;BR&gt;ProtectedOverloadsOverridesSubDispose(ByValdisposingAsBoolean)&lt;BR&gt;IfdisposingThen&lt;BR&gt;IfNot(componentsIsNothing)Then&lt;BR&gt;components.Dispose()&lt;BR&gt;EndIf&lt;BR&gt;EndIf&lt;BR&gt;MyBase.Dispose(disposing)&lt;BR&gt;EndSub&lt;BR&gt;PublicSubNew()&lt;BR&gt;MyBase.New()&lt;BR&gt;InitializeComponent()&lt;BR&gt;EndSub&lt;BR&gt;PrivatecomponentsAsSystem.ComponentModel.IContainer&lt;BR&gt;FriendWithEventsDataGrid1AsSystem.Windows.Forms.DataGrid&lt;BR&gt;FriendWithEventsCreateDBBtnAsSystem.Windows.Forms.Button&lt;BR&gt;FriendWithEventsCreateTableBtnAsSystem.Windows.Forms.Button&lt;BR&gt;FriendWithEventsCreateSPBtnAsSystem.Windows.Forms.Button&lt;BR&gt;FriendWithEventsCreateViewBtnAsSystem.Windows.Forms.Button&lt;BR&gt;FriendWithEventsbtnAlterTableAsSystem.Windows.Forms.Button&lt;BR&gt;FriendWithEventsbtnCreateOthersAsSystem.Windows.Forms.Button&lt;BR&gt;FriendWithEventsbtnDropTableAsSystem.Windows.Forms.Button&lt;BR&gt;FriendWithEventsbtnViewDataAsSystem.Windows.Forms.Button&lt;BR&gt;FriendWithEventsbtnViewSPAsSystem.Windows.Forms.Button&lt;BR&gt;FriendWithEventsbtnViewViewAsSystem.Windows.Forms.Button&lt;BR&gt;&amp;lt;System.Diagnostics.DebuggerStepThrough()&amp;gt;PrivateSubInitializeComponent()&lt;BR&gt;Me.CreateDBBtn=NewSystem.Windows.Forms.Button()&lt;BR&gt;Me.CreateTableBtn=NewSystem.Windows.Forms.Button()&lt;BR&gt;Me.CreateSPBtn=NewSystem.Windows.Forms.Button()&lt;BR&gt;Me.CreateViewBtn=NewSystem.Windows.Forms.Button()&lt;BR&gt;Me.btnAlterTable=NewSystem.Windows.Forms.Button()&lt;BR&gt;Me.btnCreateOthers=NewSystem.Windows.Forms.Button()&lt;BR&gt;Me.btnDropTable=NewSystem.Windows.Forms.Button()&lt;BR&gt;Me.btnViewData=NewSystem.Windows.Forms.Button()&lt;BR&gt;Me.btnViewSP=NewSystem.Windows.Forms.Button()&lt;BR&gt;Me.btnViewView=NewSystem.Windows.Forms.Button()&lt;BR&gt;Me.DataGrid1=NewSystem.Windows.Forms.DataGrid()&lt;BR&gt;CType(Me.DataGrid1,System.ComponentModel.ISupportInitialize).BeginInit()&lt;BR&gt;Me.SuspendLayout()&lt;BR&gt;'&lt;BR&gt;'CreateDBBtn&lt;BR&gt;'&lt;BR&gt;Me.CreateDBBtn.Location=NewSystem.Drawing.Point(19,9)&lt;BR&gt;Me.CreateDBBtn.Name=&quot;CreateDBBtn&quot;&lt;BR&gt;Me.CreateDBBtn.Size=NewSystem.Drawing.Size(104,23)&lt;BR&gt;Me.CreateDBBtn.TabIndex=0&lt;BR&gt;Me.CreateDBBtn.Text=&quot;创建数据库&quot;&lt;BR&gt;'&lt;BR&gt;'CreateTableBtn&lt;BR&gt;'&lt;BR&gt;Me.CreateTableBtn.Location=NewSystem.Drawing.Point(139,9)&lt;BR&gt;Me.CreateTableBtn.Name=&quot;CreateTableBtn&quot;&lt;BR&gt;Me.CreateTableBtn.TabIndex=1&lt;BR&gt;Me.CreateTableBtn.Text=&quot;创建表&quot;&lt;BR&gt;'&lt;BR&gt;'CreateSPBtn&lt;BR&gt;'&lt;BR&gt;Me.CreateSPBtn.Location=NewSystem.Drawing.Point(230,9)&lt;BR&gt;Me.CreateSPBtn.Name=&quot;CreateSPBtn&quot;&lt;BR&gt;Me.CreateSPBtn.Size=NewSystem.Drawing.Size(104,23)&lt;BR&gt;Me.CreateSPBtn.TabIndex=2&lt;BR&gt;Me.CreateSPBtn.Text=&quot;创建存储过程&quot;&lt;BR&gt;'&lt;BR&gt;'CreateViewBtn&lt;BR&gt;'&lt;BR&gt;Me.CreateViewBtn.Location=NewSystem.Drawing.Point(350,9)&lt;BR&gt;Me.CreateViewBtn.Name=&quot;CreateViewBtn&quot;&lt;BR&gt;Me.CreateViewBtn.TabIndex=3&lt;BR&gt;Me.CreateViewBtn.Text=&quot;创建视图&quot;&lt;BR&gt;'&lt;BR&gt;'btnAlterTable&lt;BR&gt;'&lt;BR&gt;Me.btnAlterTable.Location=NewSystem.Drawing.Point(441,9)&lt;BR&gt;Me.btnAlterTable.Name=&quot;btnAlterTable&quot;&lt;BR&gt;Me.btnAlterTable.TabIndex=4&lt;BR&gt;Me.btnAlterTable.Text=&quot;修改表&quot;&lt;BR&gt;'&lt;BR&gt;'btnCreateOthers&lt;BR&gt;'&lt;BR&gt;Me.btnCreateOthers.Location=NewSystem.Drawing.Point(17,43)&lt;BR&gt;Me.btnCreateOthers.Name=&quot;btnCreateOthers&quot;&lt;BR&gt;Me.btnCreateOthers.Size=NewSystem.Drawing.Size(104,23)&lt;BR&gt;Me.btnCreateOthers.TabIndex=5&lt;BR&gt;Me.btnCreateOthers.Text=&quot;创建规则和索引&quot;&lt;BR&gt;'&lt;BR&gt;'btnDropTable&lt;BR&gt;'&lt;BR&gt;Me.btnDropTable.Location=NewSystem.Drawing.Point(138,43)&lt;BR&gt;Me.btnDropTable.Name=&quot;btnDropTable&quot;&lt;BR&gt;Me.btnDropTable.TabIndex=6&lt;BR&gt;Me.btnDropTable.Text=&quot;删除表&quot;&lt;BR&gt;'&lt;BR&gt;'btnViewData&lt;BR&gt;'&lt;BR&gt;Me.btnViewData.Location=NewSystem.Drawing.Point(351,43)&lt;BR&gt;Me.btnViewData.Name=&quot;btnViewData&quot;&lt;BR&gt;Me.btnViewData.TabIndex=7&lt;BR&gt;Me.btnViewData.Text=&quot;查看数据&quot;&lt;BR&gt;'&lt;BR&gt;'btnViewSP&lt;BR&gt;'&lt;BR&gt;Me.btnViewSP.Location=NewSystem.Drawing.Point(230,43)&lt;BR&gt;Me.btnViewSP.Name=&quot;btnViewSP&quot;&lt;BR&gt;Me.btnViewSP.Size=NewSystem.Drawing.Size(104,23)&lt;BR&gt;Me.btnViewSP.TabIndex=8&lt;BR&gt;Me.btnViewSP.Text=&quot;查看存储过程&quot;&lt;BR&gt;'&lt;BR&gt;'btnViewView&lt;BR&gt;'&lt;BR&gt;Me.btnViewView.Location=NewSystem.Drawing.Point(443,43)&lt;BR&gt;Me.btnViewView.Name=&quot;btnViewView&quot;&lt;BR&gt;Me.btnViewView.TabIndex=9&lt;BR&gt;Me.btnViewView.Text=&quot;查看视图&quot;&lt;BR&gt;'&lt;BR&gt;'DataGrid1&lt;BR&gt;'&lt;BR&gt;Me.DataGrid1.DataMember=&quot;&quot;&lt;BR&gt;Me.DataGrid1.HeaderForeColor=System.Drawing.SystemColors.ControlText&lt;BR&gt;Me.DataGrid1.Location=NewSystem.Drawing.Point(20,76)&lt;BR&gt;Me.DataGrid1.Name=&quot;DataGrid1&quot;&lt;BR&gt;Me.DataGrid1.Size=NewSystem.Drawing.Size(500,183)&lt;BR&gt;Me.DataGrid1.TabIndex=10&lt;BR&gt;'&lt;BR&gt;'Form1&lt;BR&gt;'&lt;BR&gt;Me.AutoScaleBaseSize=NewSystem.Drawing.Size(5,13)&lt;BR&gt;Me.ClientSize=NewSystem.Drawing.Size(538,281)&lt;BR&gt;Me.Controls.AddRange(NewSystem.Windows.Forms.Control(){Me.DataGrid1,Me.btnViewView,_&lt;BR&gt;Me.btnViewSP,Me.btnViewData,Me.btnDropTable,Me.btnCreateOthers,Me.btnAlterTable,_&lt;BR&gt;Me.CreateViewBtn,Me.CreateSPBtn,Me.CreateTableBtn,Me.CreateDBBtn})&lt;BR&gt;Me.Name=&quot;Form1&quot;&lt;BR&gt;Me.Text=&quot;动态创建SQLServer数据库、表、存储过程等架构信息&quot;&lt;BR&gt;CType(Me.DataGrid1,System.ComponentModel.ISupportInitialize).EndInit()&lt;BR&gt;Me.ResumeLayout(False)&lt;/P&gt;&lt;P&gt;EndSub&lt;/P&gt;&lt;P&gt;#EndRegion&lt;/P&gt;&lt;P&gt;'创建数据库&lt;BR&gt;PrivateSubCreateDBBtn_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)_&lt;BR&gt;HandlesCreateDBBtn.Click&lt;BR&gt;conn=NewSqlConnection(ConnectionString)&lt;BR&gt;'打开连接&lt;BR&gt;Ifconn.State&amp;lt;&amp;gt;ConnectionState.OpenThen&lt;BR&gt;conn.Open()&lt;BR&gt;EndIf&lt;BR&gt;'MyDataBase为数据库名称&lt;BR&gt;DimsqlAsString=&quot;CreateDATABASEMyDataBaseONPRIMARY(Name=MyDataBase_data,filename=&quot; _&lt;BR&gt;&quot;'D:\MyDataBase.mdf',size=3,&quot; &quot;maxsize=5,filegrowth=10)logon&quot; &quot;(name=MyDataBase_log,&quot; _&lt;BR&gt;&quot;filename='D:\MyDataBase.ldf',size=3,&quot; &quot;maxsize=20,filegrowth=1)&quot;&lt;BR&gt;cmd=NewSqlCommand(sql,conn)&lt;BR&gt;Try&lt;BR&gt;cmd.ExecuteNonQuery()&lt;BR&gt;CatchaeAsSqlException&lt;BR&gt;MessageBox.Show(ae.Message.ToString())&lt;BR&gt;EndTry&lt;BR&gt;EndSub&lt;BR&gt;'创建表&lt;BR&gt;PrivateSubCreateTableBtn_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)_&lt;BR&gt;HandlesCreateTableBtn.Click&lt;BR&gt;conn=NewSqlConnection(ConnectionString)&lt;BR&gt;'打开连接&lt;BR&gt;Ifconn.State=ConnectionState.OpenThen&lt;BR&gt;conn.Close()&lt;BR&gt;EndIf&lt;BR&gt;ConnectionString=&quot;DataSource=.;InitialCatalog=MyDataBase;UserId=sa;Password=;&quot;&lt;BR&gt;conn.ConnectionString=ConnectionString&lt;BR&gt;conn.Open()&lt;BR&gt;sql=&quot;CreateTABLEmyTable&quot; &quot;(myIdINTEGERCONSTRAINTPKeyMyIdPRIMARYKEY,&quot; _&lt;BR&gt;&quot;myNameCHAR(50)NOTNull,myAddressCHAR(255),myValuesFLOAT)&quot;&lt;BR&gt;cmd=NewSqlCommand(sql,conn)&lt;BR&gt;Try&lt;BR&gt;cmd.ExecuteNonQuery()&lt;BR&gt;'添加纪录&lt;BR&gt;sql=&quot;InsertINTOmyTable(myId,myName,myAddress,myValues)&quot; _&lt;BR&gt;&quot;VALUES(1001,_'【孟宪会之精彩世界】之一','http://xml.sz.luohuedu.net/',100)&quot;&lt;BR&gt;cmd=NewSqlCommand(sql,conn)&lt;BR&gt;cmd.ExecuteNonQuery()&lt;BR&gt;sql=&quot;InsertINTOmyTable(myId,myName,myAddress,myValues)&quot; _&lt;BR&gt;&quot;VALUES(1002,'【孟宪会之精彩世界】之二','http://www.erp800.com/net_lover/',99)&quot;&lt;BR&gt;cmd=NewSqlCommand(sql,conn)&lt;BR&gt;cmd.ExecuteNonQuery()&lt;BR&gt;sql=&quot;InsertINTOmyTable(myId,myName,myAddress,myValues)&quot; _&lt;BR&gt;&quot;VALUES(1003,'【孟宪会之精彩世界】之三','http://xml.sz.luohuedu.net/',99)&quot;&lt;BR&gt;cmd=NewSqlCommand(sql,conn)&lt;BR&gt;cmd.ExecuteNonQuery()&lt;BR&gt;sql=&quot;InsertINTOmyTable(myId,myName,myAddress,myValues)&quot; _&lt;BR&gt;&quot;VALUES(1004,'【孟宪会之精彩世界】之四','http://www.erp800.com/net_lover/',100)&quot;&lt;BR&gt;cmd=NewSqlCommand(sql,conn)&lt;BR&gt;cmd.ExecuteNonQuery()&lt;BR&gt;CatchaeAsSqlException&lt;BR&gt;MessageBox.Show(ae.Message.ToString())&lt;BR&gt;EndTry&lt;/P&gt;&lt;P&gt;EndSub&lt;BR&gt;'创建存储过程&lt;BR&gt;PrivateSubCreateSPBtn_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)_&lt;BR&gt;HandlesCreateSPBtn.Click&lt;BR&gt;sql=&quot;CreatePROCEDUREmyProcAS&quot; &quot;SelectmyName,myAddressFROMmyTableGO&quot;&lt;BR&gt;ExecuteSQLStmt(sql)&lt;BR&gt;EndSub&lt;BR&gt;'创建视图&lt;BR&gt;PrivateSubCreateViewBtn_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)_&lt;BR&gt;HandlesCreateViewBtn.Click&lt;BR&gt;sql=&quot;CreateVIEWmyViewASSelectmyNameFROMmyTable&quot;&lt;BR&gt;ExecuteSQLStmt(sql)&lt;/P&gt;&lt;P&gt;EndSub&lt;BR&gt;'修改表&lt;BR&gt;PrivateSubbtnAlterTable_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)_&lt;BR&gt;HandlesbtnAlterTable.Click&lt;BR&gt;sql=&quot;AlterTABLEMyTableADDnewColdatetimeNOTNULLDEFAULT(getdate())&quot;&lt;BR&gt;ExecuteSQLStmt(sql)&lt;BR&gt;EndSub&lt;BR&gt;'创建规则和索引&lt;BR&gt;PrivateSubbtnCreateOthers_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)_&lt;BR&gt;HandlesbtnCreateOthers.Click&lt;BR&gt;sql=&quot;CreateUNIQUEINDEX&quot; &quot;myIdxONmyTable(myName)&quot;&lt;BR&gt;ExecuteSQLStmt(sql)&lt;/P&gt;&lt;P&gt;sql=&quot;CreateRULEmyRule&quot; &quot;AS@myValues&amp;gt;=90AND@myValues&amp;lt;9999&quot;&lt;BR&gt;ExecuteSQLStmt(sql)&lt;BR&gt;EndSub&lt;/P&gt;&lt;P&gt;'删除表&lt;BR&gt;PrivateSubbtnDropTable_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)_&lt;BR&gt;HandlesbtnDropTable.Click&lt;BR&gt;DimsqlAsString=&quot;DropTABLEMyTable&quot;&lt;BR&gt;ExecuteSQLStmt(sql)&lt;BR&gt;EndSub&lt;BR&gt;'浏览表数据&lt;BR&gt;PrivateSubbtnViewData_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)_&lt;BR&gt;HandlesbtnViewData.Click&lt;BR&gt;conn=NewSqlConnection(ConnectionString)&lt;BR&gt;Ifconn.State=ConnectionState.OpenThen&lt;BR&gt;conn.Close()&lt;BR&gt;EndIf&lt;BR&gt;ConnectionString=&quot;DataSource=.;InitialCatalog=MyDataBase;UserId=sa;Password=;&quot;&lt;BR&gt;conn.ConnectionString=ConnectionString&lt;BR&gt;conn.Open()&lt;BR&gt;DimdaAsNewSqlDataAdapter(&quot;Select*FROMmyTable&quot;,conn)&lt;BR&gt;DimdsAsNewDataSet(&quot;myTable&quot;)&lt;BR&gt;da.Fill(ds,&quot;myTable&quot;)&lt;BR&gt;DataGrid1.DataSource=ds.Tables(&quot;myTable&quot;).DefaultView&lt;BR&gt;EndSub&lt;BR&gt;'浏览存储过程&lt;BR&gt;PrivateSubbtnViewSP_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)_&lt;BR&gt;HandlesbtnViewSP.Click&lt;BR&gt;conn=NewSqlConnection(ConnectionString)&lt;BR&gt;Ifconn.State=ConnectionState.OpenThen&lt;BR&gt;conn.Close()&lt;BR&gt;EndIf&lt;BR&gt;ConnectionString=&quot;DataSource=.;InitialCatalog=MyDataBase;UserId=sa;Password=;&quot;&lt;BR&gt;conn.ConnectionString=ConnectionString&lt;BR&gt;conn.Open()&lt;BR&gt;DimdaAsNewSqlDataAdapter(&quot;myProc&quot;,conn)&lt;BR&gt;DimdsAsNewDataSet(&quot;SP&quot;)&lt;BR&gt;da.Fill(ds,&quot;SP&quot;)&lt;BR&gt;DataGrid1.DataSource=ds.DefaultViewManager&lt;BR&gt;EndSub&lt;BR&gt;'浏览视图&lt;BR&gt;PrivateSubbtnViewView_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)_&lt;BR&gt;HandlesbtnViewView.Click&lt;BR&gt;conn=NewSqlConnection(ConnectionString)&lt;BR&gt;Ifconn.State=ConnectionState.OpenThen&lt;BR&gt;conn.Close()&lt;BR&gt;EndIf&lt;BR&gt;ConnectionString=&quot;DataSource=.;InitialCatalog=MyDataBase;UserId=sa;Password=;&quot;&lt;BR&gt;conn.ConnectionString=ConnectionString&lt;BR&gt;conn.Open()&lt;BR&gt;DimdaAsNewSqlDataAdapter(&quot;Select*FROMmyView&quot;,conn)&lt;BR&gt;DimdsAsNewDataSet()&lt;BR&gt;da.Fill(ds)&lt;BR&gt;DataGrid1.DataSource=ds.DefaultViewManager&lt;BR&gt;EndSub&lt;/P&gt;&lt;P&gt;PrivateSubExecuteSQLStmt(ByValsqlAsString)&lt;BR&gt;conn=NewSqlConnection(ConnectionString)&lt;BR&gt;'打开连接&lt;BR&gt;Ifconn.State=ConnectionState.OpenThen&lt;BR&gt;conn.Close()&lt;BR&gt;EndIf&lt;BR&gt;ConnectionString=&quot;DataSource=.;InitialCatalog=MyDataBase;UserId=sa;Password=;&quot;&lt;BR&gt;conn.ConnectionString=ConnectionString&lt;BR&gt;conn.Open()&lt;BR&gt;cmd=NewSqlCommand(sql,conn)&lt;BR&gt;Try&lt;BR&gt;cmd.ExecuteNonQuery()&lt;BR&gt;CatchaeAsSqlException&lt;BR&gt;MessageBox.Show(ae.Message.ToString())&lt;BR&gt;EndTry&lt;BR&gt;EndSub&lt;BR&gt;EndClass&lt;/P&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/wyangel/261840915/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/wyangel/261840915/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class=&quot;fsflare&quot;&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=559e055bbd3b21de501bc32016f18652&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=559e055bbd3b21de501bc32016f18652&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=a64bf46ee06d7a537bae44c412348485&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=a64bf46ee06d7a537bae44c412348485&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=5ad783f7dfd182c368193efe50a2d675&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=5ad783f7dfd182c368193efe50a2d675&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=0955d2c4ae86b37827a1cdfd272db362&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=0955d2c4ae86b37827a1cdfd272db362&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;</description><category>.NET学习</category><pubDate>Sat, 27 Sep 2008 12:03:20 +0800</pubDate><author>wy533@126.com(admin)</author><guid isPermaLink="false">http://blog.wyangel.com/default.asp?id=1153</guid><dc:creator>wy533@126.com(admin)</dc:creator><fs:srclink>http://blog.wyangel.com/default.asp?id=1153</fs:srclink><fs:srcfeed>http://blog.wyangel.com/feed.asp</fs:srcfeed><fs:itemid>feedsky/wyangel/~7058344/261840915/4070471</fs:itemid></item><item><title>讲解用.NET编写串口程序的一点心得</title><link>http://blog.wyangel.com/default.asp?id=1150</link><description>&lt;P&gt;　　虽然在大学的时候学的是计算机专业，但现在的本科生的计算机水平我想大家心里都有数。到单位后闲了很长一段时间。但后来就慢慢开始有了些项目，一开始就是有关串口通信的。难度大了点，但我在的地方是一个不可以轻易说“不”的地方，只好硬着头皮开始干了，为了与时俱进我选择了VS.net2003虽然事实证明成熟的通信协议用成熟的语言(VC6,VB6)可能效果更好些.但为了和新一代编程语言更好的接触。&lt;/P&gt;&lt;P&gt;　　说起串口通信，无非是createfile开串口,writefile向串口写数据,readfile从串口读数据。再结合具体设备的相关数据格式就可以编程了。我建立的是VC.NET,Windows窗体工程。于是麻烦就开始出现了。在.NET的窗体工程里我很喜欢像在VB里编程那样，直接双击按钮之类的控件，然后在Form1.h里直接写程序，能不用函数的就不用函数。很快，createfile函数无法识别，但在编程窗口里系统能认识并给出相应的函数参数提示。&lt;/P&gt;&lt;P&gt;　　查MSDN发现需要#include，虽然form1.cpp里有，但也只有在form1.h里再include一遍了，结果就是命名空间里的有些东西出现错误无法使用了，虽然麻烦些，但还是把函数写在.cpp文件里吧!然后，有些串口设备会自带一些实现本身功能的.dll，不用说了，又不能用，尤其是用C/C  写的，尤其是底层的数据格式和数组，VB的模块兼容性好些，可以用VB.net二次封装一下。对串口本身的操作并不复杂，但问题是连接迎硬件后需要花费大量的心思去面对保护的问题，硬件不会完全按照说明书那样去工作的!&lt;/P&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/wyangel/261840916/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/wyangel/261840916/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class=&quot;fsflare&quot;&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=9b4cf2f45c0c979f0697c9f983a9f4fe&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=9b4cf2f45c0c979f0697c9f983a9f4fe&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=0296264568ea4e8c0e1b37209cd3ce6a&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=0296264568ea4e8c0e1b37209cd3ce6a&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=8b79c1c23b57bbd6d469c741513af86a&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=8b79c1c23b57bbd6d469c741513af86a&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/wyangel?a=2754ea2007c9910da974c9f327d5075d&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/wyangel?i=2754ea2007c9910da974c9f327d5075d&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;</description><category>.NET学习</category><pubDate>Sat, 27 Sep 2008 12:03:17 +0800</pubDate><author>wy533@126.com(admin)</author><guid isPermaLink="false">http://blog.wyangel.com/default.asp?id=1150</guid><dc:creator>wy533@126.com(admin)</dc:creator><fs:srclink>http://blog.wyangel.com/default.asp?id=1150</fs:srclink><fs:srcfeed>http://blog.wyangel.com/feed.asp</fs:srcfeed><fs:itemid>feedsky/wyangel/~7058344/261840916/4070471</fs:itemid></item></channel></rss>