webForumDet fria alternativet

Paging

7 svar · 302 visningar · startad av juventus1

juventus1Medlem sedan dec. 2000399 inlägg
#1

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?

------------------
mvh André

juventus1Medlem sedan dec. 2000399 inlägg
#2

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?

------------------
mvh André

spangoMedlem sedan juni 20008 205 inlägg
#3

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).

------------------
You can be a coward for a few minutes, or dead forever. /Rincewind

juventus1Medlem sedan dec. 2000399 inlägg
#4

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?

------------------
mvh André

spangoMedlem sedan juni 20008 205 inlägg
#5

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]

LarsGMedlem sedan dec. 200012 464 inlägg
#6

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

Nej, limit finns i Progres och Mysql

------------------
essentitia preter non sans multiplicandum

spangoMedlem sedan juni 20008 205 inlägg
#7

Trist för resten av världen.

juventus1Medlem sedan dec. 2000399 inlägg
#8

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 :)

------------------
mvh André

139 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)