Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为GridView的PagerTemplate动态生成页面链接按钮_C#_Asp.net_.net_Gridview_Asp.net 4.5 - Fatal编程技术网

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”:导航到最后一页
  • 整数值:导航到指定的页码
资料来源:

对于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>
我的另一种方法是使用
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>&laquo;</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>&raquo;</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>&laquo;</span>"
    
                    'set up next link
                    lnkNext.CommandArgument = "Next"
                    lnkNext.CommandName = "Page"
                    lnkNext.Text = "<span>&raquo;</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