【发布时间】:2014-12-10 17:23:02
【问题描述】:
来自 GridView 控件的 PagerTemplate 的 MSDN 页面(重点是我的):
通常,按钮控件会添加到分页器模板中以执行分页操作。当单击其 CommandName 属性设置为“Page”的按钮控件时,GridView 控件执行分页操作。按钮的 CommandArgument 属性确定要执行的分页操作的类型。
- “下一页”:导航到下一页。
- “上一页”:导航到上一页。
- “第一页”:导航到第一页。
- “Last”:导航到最后一页。
- 整数值:导航到指定的页码。
对于下一个/上一个/第一个/最后一个按钮来说,这些东西非常简单,因为它们是静态的。
<PagerTemplate>
<table>
<tr>
<td>
<asp:Button CommandName="Page" CommandArgument="First" Enabled="<%# Model.PageContext.HasPrevious %>" Text="First" runat="server" />
</td>
<td>
<asp:Button CommandName="Page" CommandArgument="Prev" Enabled="<%# Model.PageContext.HasPrevious %>" Text="Previous" runat="server" />
</td>
<td>
<asp:Button CommandName="Page" CommandArgument="Next" Enabled="<%# Model.PageContext.HasNext %>" Text="Next" runat="server" />
</td>
<td>
<asp:Button CommandName="Page" CommandArgument="Last" Enabled="<%# Model.PageContext.HasNext %>" Text="Last" runat="server" />
</td>
</tr>
</table>
</PagerTemplate>
另一方面,数字按钮的CommandArgument 必须是动态的,并且对于可以导航到的每个页面都是唯一的。我猜我需要for-loop 或转发器控件来在用户的显示屏上获得正确数量的页面链接。
我尝试过的一切似乎都只是有效。我的 for 循环代码甚至无法编译。
<% for (int pageIndex = 0; pageIndex < Model.PageContext.PageCount; pageIndex++) { %>
<asp:LinkButton CommandName="Page" CommandArgument="<%= pageIndex %>" Text="<%= pageIndex + 1 %>" runat="server"/>
<% } %>
我的替代方法使用Repeatercontrol 并且确实编译,但Repeatercontrol 本身为每个按钮处理ItemCommand,防止“页面”ItemCommand 事件冒泡直到GridView。
<asp:Repeater ItemType="System.Int32" SelectMethod="GetPages" runat="server">
<ItemTemplate>
<asp:LinkButton CommandName="Page" CommandArgument="<%# Item %>" Text="<%# Item + 1 %>" runat="server" />
</ItemTemplate>
</asp:Repeater>
每个按钮都会引发正确的事件,但这些事件永远不会到达GridView,因为它们是由Repeater 控件在较低级别处理的。我必须附加一个监听RepeaterCommandEventArgs 的事件处理程序,然后我自己在GridView 上设置新的页面索引。
*深呼吸*
我可以添加数字页面按钮无需自己连接事件吗?
我试图达到的结果,基于上面的代码:
【问题讨论】:
标签: c# asp.net .net gridview asp.net-4.5