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é
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 = "[ ";
for (uint j = 0;j < pages;j++)
{
pageLinks.Text += "<a href=products.aspx?categoryid="+categoryId+"&page="+(j+1)+">"+(j+1)+"</a> ";
}
pageLinks.Text += " ]";
//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 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
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 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
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 Trist för resten av världen.
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 = "[ ";
for (uint j = 0;j < pages;j++)
{
pageLinks.Text += "<a href=products.aspx?categoryid="+categoryId+"&page="+(j+1)+">"+(j+1)+"</a> ";
}
pageLinks.Text += " ]";
}
Tack så mycket för hjälpen :)
------------------
mvh André