---
title: "Paging"
type: "forum-thread"
url: "https://www.webforum.nu/amne/dotnet/20279-paging"
topic: ".NET"
topic_url: "https://www.webforum.nu/amne/dotnet"
author: "juventus1"
published: "2001-10-31T11:45:00.000Z"
updated: "2001-11-01T11:26:00.000Z"
replies: 7
views: 323
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/dotnet/20279-paging"
---

# Paging

## #1 — juventus1, 2001-10-31T11:45Z

Hej!

Jag har stött på lite problem. Det är så att jag gör en e-handelssite och jag vill visa 6 produkter / sida i 2 kolumner. Jag vill även att man skall kunna välja hur många produkter man köpa och har därför ett litet formulär under varje produkt. Det här gör att jag inte kan använda en DataGrid. För det första kan man inte ha 2 kolumner i en DataGrid(den räknar fel) och vill man använda den inbyggda pagingen krävs ett förmulär. Då får jag nästlade formulär vilket inte fungerar. Det enda återstående alternativet är därför att använda en DataList. Men nu till det verkliga problemet: hur ska man kombinera en DataList med paging?

Permalänk: https://www.webforum.nu/p/20279

## #2 — juventus1, 2001-10-31T15:01Z

Nu har jag fixat en lösning som fungerar som paging. Enda problemet är att alla poster ändå hämtas från databasen, vilket ju inte är meningen...

Koden ser ut så här:

```
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using DatabaseUtilities;

namespace eShop
{
	/// <summary>
	/// Summary description for products.
	/// </summary>
	
	public class Products : System.Web.UI.Page
	{
		protected DataList ShowProducts;
		protected Label pageLinks;
		private const int pageSize = 6;
		private int categoryId;

		public Products()
		{
			Page.Init += new System.EventHandler(Page_Init);
		}

		private void Page_Init(object sender, EventArgs e)
		{
			//
			// CODEGEN: This call is required by the ASP.NET Web Form Designer.
			//
			InitializeComponent();
		}

		private void Page_Load(object sender, System.EventArgs e)
		{
			if(Request.QueryString["categoryid"] != null)
			{
				categoryId = Convert.ToUInt16(Request.QueryString["categoryid"]);
				BindData();
			}
			else
			{
				//Felhantering
			}
		}
		
		private void BindData()
		{
			DbUtil db = new DbUtil();
			DataSet ds = new DataSet();
			string sql = "SELECT * FROM Products WHERE CategoryID = " + Request.QueryString["categoryid"];
			
			db.getRecords(ds,sql,"Products");

			ShowProducts.DataSource = PageRecords(ref ds);
			ShowProducts.DataBind();
		}
		
		private DataView PageRecords(ref DataSet orgDs)
		{			
			int productCount = orgDs.Tables["Products"].Rows.Count;
			int pages = (productCount - (productCount % 6)) / 6;
			int pageNumber = 1;
			
			if (productCount % 6 > 0)
				pages++;
			
			if (Request.QueryString["page"] != null)
			{
				pageNumber = Convert.ToInt32(Request.QueryString["page"]);
			}

			//Skapar länkarna
			pageLinks.Text = "[&nbsp;&nbsp;&nbsp;";

			for (uint j = 0;j < pages;j++)
			{
				pageLinks.Text += "<a href=products.aspx?categoryid="+categoryId+"&page="+(j+1)+">"+(j+1)+"</a>&nbsp;&nbsp;";
			}

			pageLinks.Text += "&nbsp;]";

			//Bygger upp den data som ska visas
			DataTable dt = new DataTable();

			dt.Columns.Add(new DataColumn("ID", typeof(Int32))); //ID
			dt.Columns.Add(new DataColumn("CategoryID", typeof(Int32))); //CategoryID
			dt.Columns.Add(new DataColumn("Name", typeof(string))); //Name
			dt.Columns.Add(new DataColumn("Description", typeof(string))); //Description
			dt.Columns.Add(new DataColumn("Thumbnail", typeof(string))); //Thumbnail
			dt.Columns.Add(new DataColumn("3D", typeof(bool))); //3D
			dt.Columns.Add(new DataColumn("Price", typeof(string))); //Price
		
			DataRow dr;
			int recordNumber = 0; //Den position man ska börja räkna ifrån

			if(pageNumber > 1)
			{
				recordNumber = (pageNumber * pageSize) - pageSize;
			}

			for (int i = recordNumber;i < pageSize * pageNumber;i++)
			{
				if (i > productCount - 1) //Ser till att det finns data 
					break;
				
				dr = dt.NewRow();
				dr[0] = orgDs.Tables["Products"].Rows[i]["ID"]; //ID
				dr[1] = orgDs.Tables["Products"].Rows[i]["CategoryID"]; //CategoryID
				dr[2] = orgDs.Tables["Products"].Rows[i]["Name"]; //Name
				dr[3] = orgDs.Tables["Products"].Rows[i]["Description"]; //Description
				dr[4] = orgDs.Tables["Products"].Rows[i]["Thumbnail"]; //Thumbnail
				dr[5] = orgDs.Tables["Products"].Rows[i]["3D"]; //3D
				dr[6] = orgDs.Tables["Products"].Rows[i]["Price"]; //Price
		
				dt.Rows.Add(dr);
			}

			return new DataView(dt);
		}

	#region Web Form Designer generated code
		/// <summary>
		/// Required method for Designer support - do not modify
		/// the contents of this method with the code editor.
		/// </summary>
		private void InitializeComponent()
		{    
			this.Load += new System.EventHandler(this.Page_Load);

		}
		#endregion
	}
}
```

Är det någon har ett tips?

Permalänk: https://www.webforum.nu/p/349091

## #3 — spango, 2001-10-31T15:18Z

Mmm. Använd dig av ett trix i SQL. Byt ut ProductID mot primärnyckeln för Products.

```
SELECT TOP 6 * FROM Products WHERE CategoryID = någonting AND ProductID NOT IN (SELECT TOP (sidnummer - 1) * 6 FROM Products WHERE CategoryID = någonting)
```

Kör du SQL Server har jag för mig att man kan använda LIMIT, som är något smidigare (och som borde ge bättre prestanda eftersom det inte krävs en subquery).

Permalänk: https://www.webforum.nu/p/349092

## #4 — juventus1, 2001-10-31T16:42Z

Hej!

Verkar vara precis det jag är ute efter. Dock får jag det inte att fungera...

```
			string sql = "SELECT TOP " + pageSize + "* FROM Products WHERE CategoryID = " + categoryId;
			sql += " AND ID NOT IN (SELECT TOP " + (pageNumber - 1) * pageSize;
			sql += " FROM Products WHERE CategoryID = " + categoryId + ")";
```

Utskrift ger (på första sidan, pageNumber = 1): SELECT TOP 6\* FROM Products WHERE CategoryID = 1 AND ID NOT IN (SELECT TOP 0 FROM Products WHERE CategoryID = 1)

Felmeddelande: The SELECT statement includes a reserved word or an argument name that is misspelled or missing, or the punctuation is incorrect.

Ser du vad jag har missat?

Permalänk: https://www.webforum.nu/p/349093

## #5 — spango, 2001-10-31T20:09Z

Vad sägs om ett mellanslag mellan 6\*? ;) 

**\\r** Dvs:

```
string sql = "SELECT TOP " + pageSize + " * FROM Products WHERE CategoryID = " + categoryId;
// etc
```

\[Redigerat av spango den 31 okt 2001\]

Permalänk: https://www.webforum.nu/p/349094

## #6 — LarsG, 2001-10-31T20:15Z

> Kör du SQL Server har jag för mig att man kan använda LIMIT

Nej, limit finns i Progres och Mysql

Permalänk: https://www.webforum.nu/p/349095

## #7 — spango, 2001-10-31T21:13Z

Trist för resten av världen.

Permalänk: https://www.webforum.nu/p/349096

## #8 — juventus1, 2001-11-01T11:26Z

Hej!

Nu tror jag problemet är löst! Koden ser ut så här:

```
		private void BindData()
		{
			DbUtil db = new DbUtil();
			DataSet ds = new DataSet();

			string sql = "SELECT TOP " + pageSize + " * FROM Products WHERE CategoryID = " + categoryId;
			sql += " AND ID NOT IN (SELECT TOP " + (1 + (pageNumber - 1) * (pageSize - 1)) + " ID";
			sql += " FROM Products WHERE CategoryID = " + categoryId + ")";

			Trace.Warn("sql=",sql);

			//Räknar produkter för att skriva ut rätt länkar...
			db.getRecords(ds,"SELECT ID FROM Products WHERE CategoryID = " + categoryId,"ProductCount");
			CreateLinks(ds.Tables["ProductCount"].Rows.Count);

			ShowProducts.DataSource = db.getRecords(sql,"Products");
			ShowProducts.DataBind();
		}

		private void CreateLinks(int productCount)
		{			
			int pages = (productCount - (productCount % 6)) / 6;
			
			if (productCount % 6 > 0)
				pages++;

			//Skapar länkarna
			pageLinks.Text = "[&nbsp;&nbsp;&nbsp;";

			for (uint j = 0;j < pages;j++)
			{
				pageLinks.Text += "<a href=products.aspx?categoryid="+categoryId+"&page="+(j+1)+">"+(j+1)+"</a>&nbsp;&nbsp;";
			}

			pageLinks.Text += "&nbsp;]";
		}
```

Tack så mycket för hjälpen :)

Permalänk: https://www.webforum.nu/p/349097

---

Tråden på webben: https://www.webforum.nu/amne/dotnet/20279-paging
