自定义DataPager的问题

我试图将asp.net DataPager控件扩展为具有预定义模板的自定义控件。 这是所需的输出

在此处输入图像描述

问题

  1. 当我第一次加载包含自定义DataPager的页面时,我的ObjectDataSourceSelectMethod被调用了3次。
  2. 当我尝试使用DataPager加载另一页数据时,SelectMethod被调用两次。
  3. 当我尝试通过使用Next / Previous按钮或DropDownList加载另一页数据时,页面不会更改。 我运行了一些调试,发现它没有将正确的值传递给SelectMethod的StartRowIndexParameter(它每次调用方法时都传递0)。

这是我的自定义控件的代码。

 public class DataPagerDDL : DataPager { protected override void RenderContents(HtmlTextWriter writer) { //add custom template TemplatePagerField templateField = new TemplatePagerField(); templateField.PagerTemplate = new CustomTemplate(); Fields.Add(templateField); //add previous/next page template NextPreviousPagerField nextPreviousField = new NextPreviousPagerField(); nextPreviousField.ShowFirstPageButton = false; nextPreviousField.ShowLastPageButton = false; nextPreviousField.PreviousPageText = "<>"; Fields.Add(nextPreviousField); base.RenderContents(writer); } public void cmbPage_SelectedIndexChanged(object sender, EventArgs e) { DropDownList cmbPage = (DropDownList)sender; this.SetPageProperties(cmbPage.SelectedIndex * MaximumRows, MaximumRows, true); } } public class CustomTemplate : ITemplate { ///  /// Insert an instance of text and controls into the specified container. ///  public void InstantiateIn(Control container) { DataPagerFieldItem caller = (DataPagerFieldItem)container; DataPagerDDL pager = (DataPagerDDL)caller.Parent; int totalPages = pager.TotalRowCount / pager.MaximumRows; if (pager.TotalRowCount % pager.MaximumRows > 0) totalPages += 1; int currentPage = (pager.StartRowIndex / pager.MaximumRows) + 1; DropDownList cmbPage = new DropDownList(); cmbPage.ID = "cmbPage"; cmbPage.AutoPostBack = true; cmbPage.SelectedIndexChanged += new EventHandler(pager.cmbPage_SelectedIndexChanged); for (int i = 1; i <= totalPages; i++) { ListItem item = new ListItem(i.ToString(), i.ToString()); if (i == currentPage) item.Selected = true; cmbPage.Items.Add(item); } pager.Controls.Add(new LiteralControl("Page ")); pager.Controls.Add(cmbPage); pager.Controls.Add(new LiteralControl(" of " + totalPages.ToString() + " pages | ")); } } 

这就是我的页面看起来像:

  ...      

我该怎么做才能使我的自定义DataPager按预期工作? 提前致谢! 🙂

我怀疑你在页面生命周期中太晚创建了寻呼机字段。 尝试从DataPagerDDL类的Init事件创建它们。

此外,您的CustomTemplate应该将控件添加到container ,而不是pager

 public class DataPagerDDL : DataPager { protected override void OnInit(EventArgs e) { CreateDefaultPagerFields(); base.OnInit(e); } protected virtual void CreateDefaultPagerFields() { //add custom template TemplatePagerField templateField = new TemplatePagerField(); templateField.PagerTemplate = new CustomTemplate(); Fields.Add(templateField); //add previous/next page template NextPreviousPagerField nextPreviousField = new NextPreviousPagerField(); nextPreviousField.ShowFirstPageButton = false; nextPreviousField.ShowLastPageButton = false; nextPreviousField.PreviousPageText = "<<"; nextPreviousField.NextPageText = ">>"; Fields.Add(nextPreviousField); } public void cmbPage_SelectedIndexChanged(object sender, EventArgs e) { DropDownList cmbPage = (DropDownList)sender; SetPageProperties(cmbPage.SelectedIndex * MaximumRows, MaximumRows, true); } } public class CustomTemplate : ITemplate { public void InstantiateIn(Control container) { DataPagerFieldItem caller = (DataPagerFieldItem)container; DataPagerDDL pager = (DataPagerDDL)caller.Parent; int totalPages = pager.TotalRowCount / pager.MaximumRows; if (pager.TotalRowCount % pager.MaximumRows > 0) totalPages += 1; int currentPage = (pager.StartRowIndex / pager.MaximumRows) + 1; DropDownList cmbPage = new DropDownList(); cmbPage.ID = "cmbPage"; cmbPage.AutoPostBack = true; cmbPage.SelectedIndexChanged += pager.cmbPage_SelectedIndexChanged; for (int i = 1; i <= totalPages; i++) { ListItem item = new ListItem(i.ToString(), i.ToString()); if (i == currentPage) item.Selected = true; cmbPage.Items.Add(item); } container.Controls.Add(new LiteralControl("Page ")); container.Controls.Add(cmbPage); container.Controls.Add(new LiteralControl(" of " + totalPages + " pages | ")); } }