2011-02-07 34 views
3

默認的pager機制在最後一行插入一個表格,然後這個表格包含一行所需的包含頁碼的單元格(我將頁面模式設置爲數字)。我不想創建這個嵌套表格,而是創建一個由小方塊組成的頁面模板,這些小方塊浮動到彼此的左側,每個框中都有頁碼。定製pagertemplate

你如何創建一個類似的傳呼機模板?

謝謝

回答

7

放置PagerTemplate內Repeater控件如下:

<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> 

然後添加一個事件處理程序網格的數據綁定事件,設置數據源的轉發如下:

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

哇,這看起來像它會工作!謝謝;所有其他尋呼機模板是關於添加一個下拉菜單,但你的站點!還有一件事:你如何處理gridview頁面的變化? – frenchie 2011-02-08 18:08:31

0

我會使用中繼器,並採取好的控制。每個人都會達到曲線在方便和精細控制之間翻轉的點,而且看起來您已經擊中了它。

如果你真的想模仿尋呼機,你可以將中繼器包裝在自己的用戶控件中,然後引發相同的事件。

+0

我正在使用gridview來處理排序。如何在stackoverflow上完成尋呼機,digg ....帶頁碼的方框列表?我可以做所有這些,但我堅持如何把網址,以便更改頁面事件正確觸發。 – frenchie 2011-02-08 00:29:35

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; 
} 
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); 
     } 
    } 
} 

然後在頁面初始化事件中執行以下操作:

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

使用這種方法,你也可以添加上一頁,下一頁通過將它們的CommandName設置爲「上一個」,「下一個」,「第一個」和「最後一個」來設置第一個和最後一個頁面按鈕。

0

短除了marzouka的回答是:

使用這種方法,你也可以添加上一頁,下一頁,通過設置他們的CommandName的第一頁和最後一頁按鈕「上一頁」,「下一頁」,「第一」, 「持續」。

要實現上一頁,下一頁,第一頁和最後一頁按鈕,你必須改變CommandArgument ...的的CommandName仍必須「頁面」

例如

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