Проблемы с пользовательским DataPager

Я пытаюсь продлить asp.net DataPager контроль в пользовательский элемент управления с предопределенными шаблонами. Это желаемый результат

Проблемы:

  1. Когда я загружаю страницу, содержащую пользовательский DataPager в первый раз, SelectMethod из моего ObjectDataSource называется 3 раза.
  2. Когда я пытаюсь загрузить другую страницу данных с помощью DataPager, метод SelectMethod вызывается дважды.
  3. Когда я пытаюсь загрузить другую страницу данных, используя кнопки Next/Previous или DropDownList, страница не изменяется. Я выполнил некоторую отладку и обнаружил, что он не передает правильное значение StartRowIndexParameter в SelectMethod (он просто передает 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 = "<<";
        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 | "));
    }
}

И вот как выглядит моя страница:

<asp:ListView ID="ListView1" DataSourceID="ods1" ... >
...
</asp:ListView>

<custom:DataPagerDDL ID="CustomDataPager" runat="server" PagedControlID="ListView1" 
        PageSize="25">
</custom:DataPagerDDL>    

<asp:ObjectDataSource ID="ods1" ... >
</asp:ObjectDataSource>

Что я должен сделать, чтобы мой пользовательский DataPager работал как положено? Заранее спасибо!:)

1 ответ

Решение

Я подозреваю, что вы создаете поля пейджера слишком поздно в жизненном цикле страницы. Попробуйте создать их из 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 | "));
    }
}
Другие вопросы по тегам