自定义DataPager的问题

时间:2014-02-17 07:56:45

标签: c# asp.net custom-controls datapager

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

enter image description here

问题

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

    ObjectDataSource

    这就是我的页面:

    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 = "<<";
            nextPreviousField.NextPageText = ">>";
            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
    {
        /// <summary>
        /// Insert an instance of text and controls into the specified container.
        /// </summary>
        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按预期工作?提前致谢! :)

1 个答案:

答案 0 :(得分:2)

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

此外,您的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 | "));
    }
}