自定义页面模板

fre*_*hie 3 asp.net

默认的分页器机制在最后一行中插入一个表,然后该表包含一行,其中包含所需的包含页码的单元格(我将页面模式设置为数字).我没有拥有这个嵌套表,而是想创建一个pagertemplate,它由浮动到彼此左边的小方形div组成,每个框内都有页码.

你如何创建这样的寻呼机模板?

谢谢

mar*_*uka 7

将Repeater控件放在PagerTemplate中,如下所示:

   <PagerTemplate>
        <asp:Repeater ID="repFooter" OnItemCommand="repFooter_ItemCommand" runat="server">
            <HeaderTemplate>
                <div class="pager">
            </HeaderTemplate>
            <ItemTemplate>
                <div class="page">
                    <asp:LinkButton ID="lnkPage" Text='<%# Container.DataItem %>' CommandName="ChangePage" CommandArgument="<%# Container.DataItem %>" runat="server" />
                </div>
            </ItemTemplate>
            <FooterTemplate>
                    <div class="clear"></div>
                </div>
            </FooterTemplate>
        </asp:Repeater>
    </PagerTemplate>
Run Code Online (Sandbox Code Playgroud)

然后为Grid的DataBound事件添加一个事件处理程序,它为转发器设置数据源,如下所示:

protected void GridView1_DataBound(object sender, EventArgs e)
{

    GridViewRow pagerRow = GridView1.BottomPagerRow;

    if (pagerRow != null)
    {

        Repeater repFooter = (Repeater)pagerRow.Cells[0].FindControl("repFooter");

        List<int> pages = new List<int>();

        for (int i = 0; i < GridView1.PageCount; i++)
        {
            pages.Add(i + 1);
        }

        repFooter.DataSource = pages;
        repFooter.DataBind();
    }
}
Run Code Online (Sandbox Code Playgroud)

添加事件处理程序以处理转发器的ItemCommand事件,如下所示:

protected void repFooter_ItemCommand(object source, RepeaterCommandEventArgs e)
{
    if (e.CommandName == "ChangePage")
    {
        GridView1.PageIndex = Convert.ToInt32(e.CommandArgument) - 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是MSDN上的另一个示例,它使用下拉列表替换默认的分页器:http: //msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.pagertemplate.aspx


mar*_*uka 6

这是另一种使用gridview的内置分页命令的方法.这也将在网格的当前页面上呈现Label而不是LinkBut​​ton.

创建一个继承自ITemplate的类,如下所示:

public class PagerTemplate: ITemplate
{
    private const string PAGE_COMMAND_NAME = "Page";

    public GridView AssociatedGridView { get; private set; }

    public PagerTemplate(GridView associatedGridView)
    {
        this.AssociatedGridView = associatedGridView;
    }

    public void InstantiateIn(Control container)
    {
        for (int i = 0; i < this.AssociatedGridView.PageCount; i++)
        {
            Panel pnlBox = new Panel();

            if (this.AssociatedGridView.PageIndex != i)
            {
                LinkButton lnkPage = new LinkButton();
                lnkPage.Text = (i + 1).ToString();
                lnkPage.CommandName = PAGE_COMMAND_NAME;
                lnkPage.CommandArgument = (i + 1).ToString();
                pnlBox.Controls.Add(lnkPage);
            }
            else
            {
                Label lblPage = new Label();
                lblPage.Text = (i + 1).ToString();
                pnlBox.Controls.Add(lblPage);
            }

            container.Controls.Add(pnlBox);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在页面Init事件中执行以下操作:

protected void Page_Init(object sender, EventArgs e)
{
    GridView1.PagerTemplate = new PagerTemplate(GridView1);
}
Run Code Online (Sandbox Code Playgroud)

使用这种方法,您还可以通过设置加上一页,下一页,第一页和最后一页按钮,他们的CommandName为"上一页","下一页","第一","最后".