默认的分页器机制在最后一行中插入一个表,然后该表包含一行,其中包含所需的包含页码的单元格(我将页面模式设置为数字)。我没有拥有这个嵌套的表,而是想创建一个pagertemplate,它包含浮动到彼此左边的小方块div,每个框内都有页码。
如何创建这样的寻呼机模板?
谢谢
答案 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而不是LinkButton。
创建一个继承自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);