C# 为GridView的PagerTemplate动态生成页面链接按钮
从C# 为GridView的PagerTemplate动态生成页面链接按钮,c#,asp.net,.net,gridview,asp.net-4.5,C#,Asp.net,.net,Gridview,Asp.net 4.5,从GridView控件(emphasis mine)的PagerTemplate的MSDN页面: 通常,按钮控件被添加到寻呼机模板以执行寻呼操作。当单击CommandName属性设置为“Page”的button控件时,GridView控件执行分页操作。按钮的CommandArgument属性确定要执行的分页操作的类型 “下一页”:导航到下一页 “Prev”:导航到上一页 “第一”:导航到第一页 “Last”:导航到最后一页 整数值:导航到指定的页码 资料来源: 对于next/prev/fir
GridView
控件(emphasis mine)的PagerTemplate
的MSDN页面:
通常,按钮控件被添加到寻呼机模板以执行寻呼操作。当单击CommandName属性设置为“Page”的button控件时,GridView控件执行分页操作。按钮的CommandArgument属性确定要执行的分页操作的类型
- “下一页”:导航到下一页
- “Prev”:导航到上一页
- “第一”:导航到第一页
- “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>
我的另一种方法是使用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>
每个按钮都会引发正确的事件,但事件永远不会到达网格视图
,因为它们是由中继器
控件在较低级别处理的。我必须附加一个事件处理程序来侦听RepeaterCommandEventArgs
,然后在GridView
上设置新的页面索引
*深呼吸*
我可以添加数字页面按钮而不必自己连接事件吗
根据上面的代码,我试图实现的结果是:
我找到了一种方法,可以使用
中继器
控件来完成
首先,使用每个页面索引的链接按钮(基于1)填充中继器,并为OnItemCommand
事件附加一个事件处理程序
<asp:Repeater runat="server" ItemType="System.Int32" SelectMethod="GetPages" OnItemCommand="OnRepeaterCommand">
<ItemTemplate>
<asp:LinkButton CommandName="Page" CommandArgument="<%# Item %>" Text="<%# Item %>" runat="server" />
</ItemTemplate>
</asp:Repeater>
最后,在事件处理程序中,使用一些反射函数将CommandEventArgs
重新插入事件管道
protected void OnRepeaterCommand(object source, RepeaterCommandEventArgs e)
{
source.GetType()
.GetMethod("RaiseBubbleEvent", BindingFlags.NonPublic | BindingFlags.Instance)
.Invoke(source, new[]
{
e.CommandSource,
new CommandEventArgs(e.CommandName, e.CommandArgument)
});
}
就这样。你不必做任何其他事情。
GridView
将处理ItemCommand
并将页面索引设置为新值。我发现了一种更简单的方法,即与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();
}
上
下一个
受保护的无效rptPagesHistory_ItemDataBound(对象发送方、RepeaterItemEventArgs e)
{
LinkButton LNKPagenNumber=新建LinkButton();
System.Int32 pageNumber=(System.Int32)e.Item.DataItem;
如果(e.Item.ItemType==ListItemType.Item | | e.Item.ItemType==ListItemType.AlternatingItem)
{
LNKPagenNumber=(LinkButton)e.Item.FindControl(“LNKPagenNumber”);
LNKPagenNumber.Text=页码;
LnkPagenNumber.CommandArgument=pageNumber-1;
}
}
受保护的无效rptPagesHistory_加载(对象发送方,事件参数e)
{
中继器rpt=(中继器)发送器;
rpt.DataSource=Enumerable.Range(1,GridView_History.PageCount);
rpt.DataBind();
}
受保护的无效lnkPageNumberHistory_单击(对象发送方,事件参数e)
{
LinkButton btn=(LinkButton)发送方;
GridView_History.PageIndex=btn.CommandArgument;
GridView_History.DataBind();
}
这是代码,从页面上取下
-
&拉阔李>
-
&拉阔李>
子pGrid(sql作为字符串)'
grdUsage.DataSource=G_GetDataTable(sql)
grdUsage.DataBind()
如果grdUsage.Rows.Count>0,则
grdUsage.HeaderRow.Cells(1).Text=String.Format(“与之关联的活动:{0}”,txtEMailTitle.Text)
如果结束
端接头
受保护的子rptPagesUsage_加载(发送方作为对象,e作为事件参数)
Dim rpt As中继器=直接广播(发送器、中继器)
rpt.DataSource=Enumerable.Range(1,grdUsage.PageCount)
rpt.DataBind()
端接头
受保护的子rptPagesUsage_ItemDataBound(发送方作为对象,e作为RepeaterItemEventArgs)
Dim-LiteTim作为新文本()
将LNKPagenNumber设置为新链接按钮()
Dim页码为System.Int32=DirectCast(e.Item.DataItem,System.Int32)
如果e.Item.ItemType=ListItemType.Item或LSE e.Item.ItemType=ListItemType.AlternatingItem,则
lListItem=DirectCast(例如Item.FindControl(“lListItem”),Literal)
LNKPagenNumber=DirectCast(e.Item.FindControl(“LNKPagenNumber”),链接按钮)
LnkPagenNumber.Text=页码
LNKPagenNumber.CommandArgument=页码-1
如果e.Item.ItemIndex=grdUsage.PageIndex,则
lListItem.Text=“”
如果结束
如果结束
端接头
受保护的子grdUsage_PageIndexchange(发送方作为对象,e作为GridViewPageEventArgs)
hSelectedTab.值=5
如果e.NewPageIndex>=0,则
grdUsage.PageIndex=e.NewPageIndex
pGrid(sql)
如果结束
端接头
受保护的子grdUsage_行数据绑定(发送方作为对象,e作为GridViewRowEventArgs)
Dim drview作为DataRowView=DirectCast(e.Row.DataItem,DataRowView)
如果e.Row.RowType=DataControlRowType.DataRow,则
Dim lnkCampaign As HyperLink=DirectCast(e.Row.FindControl(“lnkCampaign”),HyperLink)
Dim lCampaignID As Literal=DirectCast(e.Row.FindControl(“lCampaignID”),Literal)
lnkCampaign.Text=drview(“活动标题”).ToString()
lCampaignID.Text=drview(“EmailCampaignID”).ToString()
lnkCampaign.NavigateUrl=String.Format(“/Admin/WF_Admin_campaiu电子邮件_Detail.aspx?ID={0}”,drvi
protected void OnRepeaterCommand(object source, RepeaterCommandEventArgs e)
{
source.GetType()
.GetMethod("RaiseBubbleEvent", BindingFlags.NonPublic | BindingFlags.Instance)
.Invoke(source, new[]
{
e.CommandSource,
new CommandEventArgs(e.CommandName, e.CommandArgument)
});
}
<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();
}
<asp:GridView ID="grdUsage" PageSize="20" Width="100%" runat="server" AllowPaging="True" AllowSorting="False" CellPadding="4" ForeColor="#333333" GridLines="None" Font-Size="14px" Font-Bold="false" OnPageIndexChanging="grdUsage_PageIndexChanging" OnRowDataBound="grdUsage_RowDataBound" AutoGenerateColumns="False">
<Columns>
<asp:TemplateField HeaderText="ID" HeaderStyle-HorizontalAlign="Center" ItemStyle-Width="100px" ItemStyle-Font-Size="12px">
<ItemTemplate>
<asp:Literal ID="lCampaignID" runat="server"></asp:Literal>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderStyle-HorizontalAlign="Left">
<ItemTemplate>
<asp:HyperLink ID="lnkCampaign" runat="server" Target="_blank" Font-Size="12px"></asp:HyperLink>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<EditRowStyle BackColor="#2461BF" />
<FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
<HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" HorizontalAlign="Left" />
<PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
<RowStyle BackColor="#EFF3FB" />
<SelectedRowStyle BackColor="#D1DDF1" ForeColor="#333333" />
<SortedAscendingCellStyle BackColor="#F5F7FB" />
<SortedAscendingHeaderStyle BackColor="#6D95E1" />
<SortedDescendingCellStyle BackColor="#E9EBEF" />
<SortedDescendingHeaderStyle BackColor="#4870BE" />
<AlternatingRowStyle BackColor="White" />
<PagerStyle HorizontalAlign="Center" BackColor="white" />
<PagerTemplate>
<ul class="pagination">
<li>
<asp:LinkButton ID="lnkPrev" runat="server" CommandName="Page" CommandArgument="Prev"><span>«</span></asp:LinkButton></li>
<asp:Repeater ID="rptPagesUsage" OnItemDataBound="rptPagesUsage_ItemDataBound" runat="server" OnLoad="rptPagesUsage_Load">
<ItemTemplate>
<asp:Literal ID="lListItem" runat="server"><li></asp:Literal><asp:LinkButton ID="lnkPageNumber" CommandName="Page" runat="server" OnClick="lnkPageNumberUsage_Click" /></li>
</ItemTemplate>
</asp:Repeater>
<li>
<asp:LinkButton ID="lnkNext" runat="server" CommandName="Page" CommandArgument="Next"> <span>»</span></asp:LinkButton></li>
</ul>
</PagerTemplate>
</asp:GridView>
Sub pGrid(sql as string) '
grdUsage.DataSource = G_GetDataTable(sql)
grdUsage.DataBind()
If grdUsage.Rows.Count > 0 Then
grdUsage.HeaderRow.Cells(1).Text = String.Format("Associated Campaigns for: <i>{0}</i>", txtEMailTitle.Text)
End If
End Sub
Protected Sub rptPagesUsage_Load(sender As Object, e As EventArgs)
Dim rpt As Repeater = DirectCast(sender, Repeater)
rpt.DataSource = Enumerable.Range(1, grdUsage.PageCount)
rpt.DataBind()
End Sub
Protected Sub rptPagesUsage_ItemDataBound(sender As Object, e As RepeaterItemEventArgs)
Dim lListItem As New Literal()
Dim lnkPageNumber As New LinkButton()
Dim pageNumber As System.Int32 = DirectCast(e.Item.DataItem, System.Int32)
If e.Item.ItemType = ListItemType.Item OrElse e.Item.ItemType = ListItemType.AlternatingItem Then
lListItem = DirectCast(e.Item.FindControl("lListItem"), Literal)
lnkPageNumber = DirectCast(e.Item.FindControl("lnkPageNumber"), LinkButton)
lnkPageNumber.Text = pageNumber
lnkPageNumber.CommandArgument = pageNumber - 1
If e.Item.ItemIndex = grdUsage.PageIndex Then
lListItem.Text = "<li class=""active"">"
End If
End If
End Sub
Protected Sub grdUsage_PageIndexChanging(sender As Object, e As GridViewPageEventArgs)
hSelectedTab.Value = 5
If e.NewPageIndex >= 0 Then
grdUsage.PageIndex = e.NewPageIndex
pGrid(sql)
End If
End Sub
Protected Sub grdUsage_RowDataBound(sender As Object, e As GridViewRowEventArgs)
Dim drview As DataRowView = DirectCast(e.Row.DataItem, DataRowView)
If e.Row.RowType = DataControlRowType.DataRow Then
Dim lnkCampaign As HyperLink = DirectCast(e.Row.FindControl("lnkCampaign"), HyperLink)
Dim lCampaignID As Literal = DirectCast(e.Row.FindControl("lCampaignID"), Literal)
lnkCampaign.Text = drview("CampaignTitle").ToString()
lCampaignID.Text = drview("EmailCampaignID").ToString()
lnkCampaign.NavigateUrl = String.Format("/Admin/WF_Admin_Campaign_Email_Detail.aspx?ID={0}", drview("EmailCampaignID").ToString())
End If
End Sub
Protected Sub lnkPageNumberUsage_Click(sender As Object, e As EventArgs)
Dim btn As LinkButton = DirectCast(sender, LinkButton)
grdUsage.PageIndex = btn.CommandArgument
pGrid(sql)
End Sub
Public Module ControlUtilities
<Extension()>
Public Sub CustomPager(ByRef grd As GridView)
Dim cp As New clsCustomPager(grd)
End Sub
Public Class clsCustomPager
Public _grd As GridView
Public Property rpt() As GridView
Get
Return _grd
End Get
Set(value As GridView)
_grd = value
End Set
End Property
Public Sub New(ActiveGridView As GridView)
_grd = ActiveGridView
Me.CustomPages()
End Sub
''' <summary>
''' create the objects needed for a bootstrap driven navigation for a gridview
''' </summary>
Sub CustomPages()
If Not _grd Is Nothing And Not _grd.BottomPagerRow Is Nothing Then
'hook event handler to grid
AddHandler _grd.PageIndexChanging, AddressOf Me.Grid_PageIndexChanging
'declare variables
Dim pagerRow As GridViewRow = _grd.BottomPagerRow
Dim lnkPrev As LinkButton = New LinkButton()
Dim lnkNext As LinkButton = New LinkButton()
'set up previous link
lnkPrev.CommandArgument = "Prev"
lnkPrev.CommandName = "Page"
lnkPrev.Text = "<span>«</span>"
'set up next link
lnkNext.CommandArgument = "Next"
lnkNext.CommandName = "Page"
lnkNext.Text = "<span>»</span>"
'create html unordered list
pagerRow.Cells(0).Controls.Add(New LiteralControl("<ul class=""pagination"">"))
'add previous link
pagerRow.Cells(0).Controls.Add(New LiteralControl("<li>"))
pagerRow.Cells(0).Controls.Add(lnkPrev)
pagerRow.Cells(0).Controls.Add(New LiteralControl("</li>"))
Dim pageNumber As Integer
For Each pageNumber In Enumerable.Range(1, _grd.PageCount)
'create page link object
Dim lnkPage As LinkButton = New LinkButton()
lnkPage.CommandName = "Page"
lnkPage.Text = pageNumber
lnkPage.CommandArgument = (pageNumber - 1)
AddHandler lnkPage.Click, AddressOf Me.lnkPageNumber_Click 'event handler
'set css class if selected or not
If (pageNumber - 1) = _grd.PageIndex Then
pagerRow.Cells(0).Controls.Add(New LiteralControl("<li class=""active"">"))
Else
pagerRow.Cells(0).Controls.Add(New LiteralControl("<li>"))
End If
'add lnk and close html listitem
pagerRow.Cells(0).Controls.Add(lnkPage)
pagerRow.Cells(0).Controls.Add(New LiteralControl("</li>"))
Next
'add next link
pagerRow.Cells(0).Controls.Add(New LiteralControl("<li>"))
pagerRow.Cells(0).Controls.Add(lnkNext)
pagerRow.Cells(0).Controls.Add(New LiteralControl("</li>"))
'close up unordered list
pagerRow.Cells(0).Controls.Add(New LiteralControl("</ul>"))
End If
End Sub
''' <summary>
''' event handler for previous/next buttons
''' </summary>
Protected Sub Grid_PageIndexChanging(sender As Object, e As GridViewPageEventArgs)
If e.NewPageIndex >= 0 Then
_grd.PageIndex = e.NewPageIndex
_grd.DataBind()
Me.CustomPages()
End If
End Sub
''' <summary>
''' event handler for numeric link buttons
''' </summary>
Protected Sub lnkPageNumber_Click(sender As Object, e As EventArgs)
Dim btn As LinkButton = DirectCast(sender, LinkButton)
_grd.PageIndex = btn.CommandArgument
_grd.DataBind()
Me.CustomPages()
End Sub
End Class
End Module