gpt4 book ai didi

c# - 为 GridView 的 PagerTemplate 动态生成页面链接按钮

转载 作者:行者123 更新时间:2023-11-30 15:28:05 26 4
gpt4 key购买 nike

来自 GridView 控件的 PagerTemplate 的 MSDN 页面(强调我的):

Typically, button controls are added to the pager template to perform the paging operations. The GridView control performs a paging operation when a button control with its CommandName property set to "Page" is clicked. The button's CommandArgument property determines the type of paging operation to perform.

  • "Next": Navigates to the next page.
  • "Prev": Navigates to the previous page.
  • "First": Navigates to the first page.
  • "Last": Navigates to the last page.
  • Integer value: Navigates to the specified page number.

来源:http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.pagertemplate(v=vs.110).aspx

由于它们的静态性质,这些东西对于 next/prev/first/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 循环或转发器控件来在用户的显示器上获得正确数量的页面链接。

我尝试过的任何东西似乎都有效。我的 for 循环代码甚至无法编译。

<% for (int pageIndex = 0; pageIndex < Model.PageContext.PageCount; pageIndex++) { %>
<asp:LinkButton CommandName="Page" CommandArgument="<%= pageIndex %>" Text="<%= pageIndex + 1 %>" runat="server"/>
<% } %>

我的替代方法使用 Repeater 控件并执行编译,但 Repeater 控件本身处理 ItemCommand对于每个按钮,防止“Page”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 上设置新的页面索引。

*深呼吸*

我可以添加数字页面按钮而不必自己连接事件吗?

基于上面的代码,我试图实现的结果:

linkbuttons

最佳答案

我找到了一种更简单的方法,一种兼容 framework 4.0 的方法

<asp:GridView ID="GridView_History" runat="server">
<PagerTemplate>
<asp:LinkButton ID="lnkPrev" runat="server" CommandName="Page" CommandArgument="Prev">Prev</asp:LinkButton>
<asp:Repeater ID="rptPagesHistory" OnItemDataBound="rptPagesHistory_ItemDataBound" runat="server" OnLoad="rptPagesHistory_Load">
<ItemTemplate>
<asp:LinkButton ID="lnkPageNumber" CommandName="Page" runat="server" OnClick="lnkPageNumberHistory_Click" />
</ItemTemplate>
</asp:Repeater>
<asp:LinkButton ID="lnkNext" runat="server" CommandName="Page" CommandArgument="Next">Next</asp:LinkButton>
</PagerTemplate>
</asp:GridView>


protected void rptPagesHistory_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
LinkButton lnkPageNumber = new LinkButton();
System.Int32 pageNumber = (System.Int32)e.Item.DataItem;

if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
lnkPageNumber = (LinkButton)e.Item.FindControl("lnkPageNumber");
lnkPageNumber.Text = pageNumber;
lnkPageNumber.CommandArgument = pageNumber - 1;
}
}

protected void rptPagesHistory_Load(object sender, EventArgs e)
{
Repeater rpt = (Repeater)sender;
rpt.DataSource = Enumerable.Range(1, GridView_History.PageCount);
rpt.DataBind();
}

protected void lnkPageNumberHistory_Click(object sender, EventArgs e)
{
LinkButton btn = (LinkButton)sender;
GridView_History.PageIndex = btn.CommandArgument;
GridView_History.DataBind();
}

关于c# - 为 GridView 的 PagerTemplate 动态生成页面链接按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26385838/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com