Repeater
- Repeater(foreach)用于对绑定数据源中的数据进行遍历并按格式显示,每条数据以什么格式显示是由Repeater的来决定的,模板会多次显示,就像foreach, ItemTemplate 中相当于{}中的语句。姓名:<%#Eval(“Name”)%>年龄:<%#Eval(“Age”)%>
。注意:%和#中间不能有空格。 - <%#Eval(“Name”)%>表示在这个位置显示当前实体对象的Name属性,注意调用Eval、Bind这些数据绑定方法的时候要用#。
- 因为Eval就是将属性显示到指定的位置,因此也可以显示到文本框中姓名:<asp:TextBox runat=“server” Text=’<%#Eval(“Name”) %>’ >
- 注意不要写成Text="<%#Eval(‘Name’) %>" 因为<%%>中的是C#代码,’'是字符,而不是字符串
- 还可以用在服务器控件中<asp:TextBox Text=’<%#Eval(“Name”) %>’ runat=“server”></asp:TextBox>
1.1Repeater其他模板
- 设置隔行的不同显示风格,如果设定,则奇数行用模板,偶数行用模板
- <asp:TextBox BackColor=“Red” ID=“TextBox2” Text=’<%#Eval(“Name”) %>’ runat=“server”/>。设置隔行变色是为了防止数据太多看串行。
- HeaderTemplate、FooterTemplate:头部、尾部的模板,分别显示在所有数据的前面和后面。
- SeparatorTemplate :两项数据之间的分隔符,比如换行符
1.2ItemCommand
- 可以在模板中放置Button控件(Button、LinkButton、ImageButton),模板中的按钮一般不写OnClick事件响应,而是响应Repeater的ItemCommand事件。
- 为Button控件设定CommandName、CommandArgument属性,然后在ItemDataBound事件读取e的CommandName、CommandArgument属性就可以获得发生事件的命令和行参数了。如果对数据进行了操作,则需要Repeater1.DataBind()来重新绑定,从数据库中刷新最新的数据。
1.3ListView
- LayoutTemplate:指定用来定义ListView控件布局的根模板。它包括占位符对象,例如:table row (tr), div, 或 span 元素. 这个元素将被定义在ItemTemple模板或GroupTemple模板中的内容替换。也可以包含一个DataPager对象。
- ItemTemplate:为 TemplateField 对象中的项指定要显示的内容。
- ItemSeparatorTemplate:在 TemplateField 对象中的项之间指定要显示的内容。
- GroupTemplate:为分组布局指定内容。它包括占位符对象,例如:table row (tr), div, 或 span 元素.这个元素将被定义在ItemTemple模板或EmptyItemTemplate模板中的内容替换。
- GroupSeparatorTemplate:为分组项之间指定要显示的内容。
- EmptyItemTemplate:指定使用GroupTemplate时的空项内容。例如,如果GroupItemCount属性设置为5,并且数据源返回的总数为8,ListView控件最后一行将有3项根据ItemTemple显示,两项根据EmptyTemplate显示。
- EmptyDataTemplate:指定数据源为空时的内容。
- SelectedItemTemplate:为选中项指定显示内容。
- AlternatingItemTemplate:为交替项指定要显示的内容。
- EditItemTemplate:为编辑项指定要显示的内容。当数据进行编辑时EditItemTemplate将替换ItemTemple的数据。
- InsertItemTemplate:为插入项指定要显示的内容。当数据进行编辑时InsertItemTemplate将替换ItemTemple的数据。
- Repeater一般只用来展示数据,如果要增删改查(CRUD)则用ListView更方便。使用向导来使ListView会自动生成很多模板,免去手写模板代码的麻烦,再进行手工调整即可。
- 首先设定数据源,然后点击智能提示中的“配置ListView”,选择一种布局和样式,然后根据需要勾选“启用编辑”、“启用删除”、“启用插入”、“启用分页”,就会自动生成常用的模板。注意这只是提高开发效率的一个快捷方式,不是唯一的途径。
- LayoutTemplate为布局模板,布局模板中必须有一个ID为itemPlaceholder的服务端控件,项占位符(4.0以后不需要),什么类型无所谓,不会被显示,itemPlaceholder前面就是相当于Repeater中的HeaderTemplate,itemPlaceholder后面就是相当于Repeater中的FooterTemplate,因此ListView中没有这两个模板。
- ItemTemplate是每一项的模板,AlternatingItemTemplate是隔行显示的模板,和Repeater一样。EmptyDataTemplate为数据源没有数据的时候显示的内容(Insert也算数据),这样的话可以实现“没有查找结果”、“对不起,找不到您要找的数据”等,InsertItemTemplate为插入数据界面的模板,EditItemTemplate为编辑数据的模板,InsertItemTemplate,为插入数据的模板,SelectedItemTemplate为标记为Selected的行的模板。 +生成的样式要提到style中,不要内联样式。
- ItemTemplate里面一般也没必要用<asp:Label展示只读数据,所以直接输出<%# Eval(“Name”) %>
- LayoutTemplate中必须有一个id为itemPlaceholder的服务端控件,之上为头,之下为尾。
- LayoutTemplate表头内容要汉化,所有Template中的不需要显示的字段,比如Id,都要删掉。
- EditItemTemplate、InsertItemTemplate中控件的绑定表达式为Text=’<%# Bind(“Age”),因为Eval只是计算表达式的值输出,而Bind不仅可以计算表达式的值输出,还可以将用户填入的值更新到数据中,因此Eval是单向绑定,Bind是双向绑定。
- AlternatingItemTemplate形同鸡肋,因为一般都是把ItemTemplate赋值一份过去。一般奇偶行的需求就是“不同颜色”,那么用JQuery在客户端处理就可以了。
- Eval()把数据库中的数据显示到这个位置。所以在ItemTemplate这种只是显示的场合用Eval。
- Bind()双向绑定!数据的变化可以反映到页面上,页面上控件的变化可以反映到数据上。所以在EditTemplete、InsertTemplete中需要将用户填写的内容反映到数据库中用Bind
1.4 DataPager
- ListView搭配DataPager控件实现分页。有两种使用方式,一种是将DataPager声明到ListView中;一种是DataPager、ListView没有嵌套关系,然后将DataPager的PagedControlID设定为要分页的ListView。没有什么区别,一般用“配置ListView”自动生成的内置方式即可。 DataPager的PageSize属性为一页的条数。
- (*)实现IPageableItemContainer 接口的控件都可以使用DataPager进行分页,但是ASP.Net内置的控件目前只有ListView实现了这个接口。
- DataPager中按钮显示风格由Fields中的字段设置,可以放置多个字段,分为“NextPreviousPagerField”(下一页、下一页、首页、末页等)、“NumericPagerField”(数字页号)、“TemplatePagerField”用模板自定义。代码中选择相应的Field,在属性视图中就可以快速修改它们的属性。
1.4.1高效率分页
微软不是神仙!ListView默认的分页是先从数据源取得所有数据,然后再截取当前页面的部分,在数据量非常大的情况下效率非常低,因此默认分页基本不能用。应该是只从数据源取得要显示的数据。
SQL中语句中取得分页数据。SQL语句中获得每一行序号的方法:
SELECT Id, SiteName, LogoURL,Row_Number() over(order by Id) rownum FROM T_Links,
Row_Number()函数是SQL2005之后提供的一个计算结果集行号的函数(不是表的行号),over中指定排序规则, Row_Number()从1开始。取得第11条至20数据(条数从0开始)的方法,使用子查询用行号进行再次处理
1、每页10条 1,10 11,20
2、N页,每页10条 10(n-1)+1,10n
3、N页,每页Count条 Count(n-1) +1,countn
- 增加取得所有数据条数的方法QueryCount,增加取得指定行数范围数据的方法GetPagedData:select * from (SELECT …,Row_Number() over(order by …) rownum FROM T_Links) t where t.rownum>@startRowIndex and t.rownum<=@startRowIndex+@maximumRows。
- 注意:1、不要用Id做分页的字段,断号,“不要让主键参与逻辑运算”。2、一定要有一个排序规则。
- 由于数据集编辑器不支持(不是运行时不支持,只是设计器不会自动帮我们生成一些东西) Row_Number() ,所以创建完成后需要手动在GetPagedData属性的Parameters中增加两个参数:startRowIndex、maximumRows(参数名必须是这两个,这是由ObjectDataSource的StartRowIndexParamterName、 MaximumRowsParamterName确定的,一般不需要改。),都是Int32类型。
- 也可以自己写BLL进行封装。
- select top @PageSize from t where id not in (select top @pagesize*1. (page-1)) from t)
- ObjectDataSource中EnablePaging属性设置为true,SelectCountMethod()设置(获得总行数的方法)SelectMethod(int startIndex,int pageSize)设置(获得分页数据的方法):注意要在数据源控件配置参数名称一致
- 如果出错的话看看是不是没有放置内置的DataPager或者外置的DataPager的PagedControlID没有指向ListView。
- 修改ObjectDataSource的EnablePaging=“True”,SelectCountMethod设置为取得行数的方法。
- DataPager默认是用PostBack机制,显示不到地址中,不利于网友间共享,只要指定QueryStringField属性(比如pagenum)就可以实现超链接形式的分页链接。
1.4.1.1 高效率分页步骤总结
- 增加一个返回总条数的方法GetCount。目的是告诉一共有多少条数据,这样才知道显示到第几条为止。。
- 增加一个返回指定页数的方法:提供这个方法才能知道怎么取特定的区间。 select t.* from (SELECT Id, Name,Row_Number() over(order by Id) rownum FROM dbo.T_Persons) t where t.rownum>@startRowIndex and t.rownum<=@startRowIndex+@maximumRows 手工添加这两个参数startRowIndex、maximumRows参数
- 配置ObjectDataSource的时候SElect方法选择“GetpagedData”,才知道调用哪个方法取区间的数据
- 将ObjectDataSource的设置EnablePaging=“true”,表示启用自定义分页。才知道使用自定义的分页策略(经常容易忘了设置)。设定 SelectCountMethod="GetCount"属性,指向总条数的方法。才知道调用哪个方法取总条数。
- 因为ObjectDataSource会自动传这两个参数的值,所以SelectParameters中的<asp:Parameter Name=“startRowIndex” Type=“Int32” /> <asp:Parameter Name=“maximumRows” Type=“Int32” /> 两个参数删掉。
- 配置ListView的时候不要忘了启用分页。如果是使用外置DataPager的话不要忘了设置PagedControlId属性。
- 分析执行过程,参数是怎么传过去的。
浙公网安备 33010602011771号