自定义页面模板

时间:2011-02-07 23:38:50

标签: asp.net

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

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

谢谢

5 个答案:

答案 0 :(得分: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>

然后为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();
    }
}

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

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

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

答案 1 :(得分: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);
        }
    }
}

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

protected void Page_Init(object sender, EventArgs e)
{
    GridView1.PagerTemplate = new PagerTemplate(GridView1);
}

使用这种方法,您还可以通过将其CommandName设置为“Prev”,“Next”,“First”和“Last”来添加上一页,下一页,第一页和最后一页按钮。

答案 2 :(得分:2)

另一种方法是为寻呼机表本身设置样式。

将CSS类添加到寻呼机,如下所示:

<asp:GridView ... >
   <PagerStyle CssClass="pager" />
</asp:GridView>

这会将一个类添加到寻呼机表行。

现在设置CSS样式以选择包含页码的TD,如下所示:

tr.pager td table td
{
    margin: 2px;
    width: 10px;
    padding: 0px 3px 0px 3px;
    background-color: #FBFBFB;
    text-align: center;
    border: solid 1px #CACACA;
}

答案 3 :(得分:0)

我会使用转发器并对其进行精细控制。每个人都达到曲线在方便和精细控制之间翻转的程度,看起来你已经击中了它。

如果您真的想模仿寻呼机,可以将转发器包装在您自己的用户控件中,然后引发相同的事件。

答案 4 :(得分:0)

对marzouka的回答简短补充:

  

使用这种方法,您还可以通过将其CommandName设置为&#34; Prev&#34;,&#34; Next&#34;,&#34; First&#34来添加上一页,下一页,第一页和最后一页按钮;和&#34;最后&#34;。

要实现上一页,下一页,第一页和最后一页按钮,您必须更改CommandArgument ... CommandName必须仍然是&#34; Page&#34;

e.G。

        LinkButton firstButton = new LinkButton();
        firstButton.CommandName = "Page";
        firstButton.CommandArgument = "First";
        firstButton.Text = "First";
        container.Controls.Add(firstButton);
相关问题