Paging creates extra page

I am performing “semi”-custom paging for my dynamic LINQ query. However, if the number of results returned exactly fill the page, then I wind up with one extra page that’s empty and I can’t figure out why. i.e. if I have a page size of 15 and 14, 21, 101, etc. items then everything is fine. However, if I have 15, 30, 45, 60, etc. then I get one extra blank page and I’ve been unable to make it stop. Anyone have some ideas except to add a new record when I see we’re sitting on a multiple of the page size?

I write out the paging control like this and it loops through one time too many if the last page is full…

[FONT=“Courier New”] protected void WritePagingControlHtml(int inputNumberOfPages, int inputCurrentPageNumber)
{
// testing.Text += “<br /> Starting WritePagingControlHtml(int inputNumberOfPages)”;

    string outputLiteralPageControlHTML = "";
    int displayNumberOfPages = inputNumberOfPages + 1;
    int displayCurrentPageNumber = inputCurrentPageNumber + 1;
    // testing.Text += "&lt;br /&gt; displayNumberOfPages = " + displayNumberOfPages;
    // testing.Text += "&lt;br /&gt; displayCurrentPageNumber = " + displayCurrentPageNumber;
    for (int loopDisplayPageNumber = 1; loopDisplayPageNumber &lt; displayNumberOfPages + 1; loopDisplayPageNumber++)
    {
        string outputPagingLinkClass = "";
        if (loopDisplayPageNumber == displayCurrentPageNumber)
        {
            outputPagingLinkClass = " class=\\"currentPage\\"";
        }

        // testing.Text += "&lt;br /&gt; Before GetAppLink call: classFilterQueryStringParameter = " + classFilterQueryStringParameter;

        outputLiteralPageControlHTML += " &lt;a href=\\"" + GetAppLink(classSortQueryStringParameter, classFilterQueryStringParameter, loopDisplayPageNumber) + "\\"" + outputPagingLinkClass + "&gt;" + loopDisplayPageNumber.ToString() + "&lt;/a&gt;";
    }

    litPagingControl.Text = outputLiteralPageControlHTML;
}[/FONT]

And I calculate the number of pages as part of the query code…

    [FONT="Courier New"]cmschangeTestDataContext db = new cmschangeTestDataContext();
    IQueryable&lt;cmschangesTest&gt; query = db.cmschangesTests;
    int newRowCount = 0;

    if (inputFilterValue == "")
    {
        query = db.cmschangesTests
            .OrderBy(inputOrderValue)
            .Skip(skip)
            .Take(take);

        newRowCount = db.cmschangesTests.Count();
    }
    else
    {
        query = db.cmschangesTests
            .Where(inputFilterValue, System.DateTime.Now)
            //.Where(a =&gt; a.dontpublishbeforedate &lt; System.DateTime.Now) // using lambda expression
            .OrderBy(inputOrderValue)
            .Skip(skip)
            .Take(take);

        newRowCount = db.cmschangesTests.Where(inputFilterValue, System.DateTime.Now).Count();
    }

    testing.Text += " &lt;br /&gt; inputFilterValue = \\"" + inputFilterValue + "\\"";
    testing.Text += " &lt;br /&gt; newRowCount = " + newRowCount.ToString();

    int inputNumberOfPages = newRowCount / numberOfContactsPerPage;

    WritePagingControlHtml(inputNumberOfPages, currentPageNumber);

[/FONT]


for (int loopDisplayPageNumber = 0; loopDisplayPageNumber < displayNumberOfPages + 1; loopDisplayPageNumber++)

Start with “0”?

Just a guess.

EDIT: Might want to take the “+1” out of the “displayNumberOfPages” also.

Try this

if(newRowCount % numberOfContactsPerPage == 0)
inputNumberofPages = newRowCount / numberOfContactsPerPage;
Else
inputNumberofPages = newRowCount / numberOfContactsPerPage + 1;

This was basically it. I needed…

if(newRowCount % numberOfContactsPerPage == 0)
inputNumberofPages = newRowCount / numberOfContactsPerPage -1;
Else
inputNumberofPages = newRowCount / numberOfContactsPerPage;

The integer division rounds at the wrong mark for my code, and I needed to manually adjust it.

Thanks for the help.
:slight_smile:

You welcome