webForumDet fria alternativet

problem med paging i datalist

.NET

7 svar · 373 visningar · startad av Mc Fetto

Medlem sedan nov. 20022 355 inlägg
Frågan#1

Jag har en datalist som jag försöker koppla en pagingfunktion till.. Jag har denna funktion för att skapa detta och den kallas på, i Page_Load och under de två linkbuttons jag har.

		public void ItemsGet() 
		{
			PagedDataSource objPds = new PagedDataSource();
			DataSet dataset = new DataSet();
			dataset = db.getCategorys();
			objPds.AllowPaging = true;
			objPds.DataSource = dataset.Tables[0].DefaultView;
			objPds.PageSize = 3;

			objPds.CurrentPageIndex = CurrentPage; 
			
			// Disable Prev or Next buttons if necessary
			cmdPrev.Enabled = !objPds.IsFirstPage;
			cmdNext.Enabled = !objPds.IsLastPage;
			DataList1.DataSource = objPds;
			DataList1.DataBind();
		}

När man klickar på linkbuttons för pagingen så körs följande:

		public void cmdPrev_Click(object sender, System.EventArgs e)
		{
			CurrentPage -= 1;
			ItemsGet();		
		}

Eller en annan metod som räknar upp CurrentPage...

		public int CurrentPage
		{
			get
			{
				// look for current page in ViewState
				object o = this.ViewState["_CurrentPage"];
				if (o == null)
					return 0;	// default to showing the first page
				else
					return (int) o;
			}

			set
			{
				this.ViewState["_CurrentPage"] = value;
			}
		}

Den första sidan visas, men när jag klickar på nästa (linkbutton) så blir listan tom.. :( (ja, där finns mer data i dataset:et)

Medlem sedan nov. 20022 355 inlägg
#2

hm, CurrentPage har värdet 0 första gången men när jag klickar och den (enligt mig ska räknas upp) så blir värdet två (hade endast 6 tupler innan och lade till en och då visas den sista).

Medlem sedan maj 2003151 inlägg
#3
DataSet DS = new DataSet();
DS.ReadXml(file);
		
PagedDataSource objPds = new PagedDataSource();
objPds.DataSource = DS.Tables[0].DefaultView;
objPds.AllowPaging = true;
objPds.PageSize = 6;
		
if (Request.QueryString["Page"] != null)
{CurPage=Convert.ToInt32(Request.QueryString["Page"]);}
else{ CurPage=1; }

objPds.CurrentPageIndex = CurPage-1;
if (!objPds.IsFirstPage){lnkPrev.NavigateUrl=Request.CurrentExecutionFilePath + "?Page=" + Convert.ToString(CurPage-1); }
else{ lnkPrev.Text = ""; }
if (!objPds.IsLastPage){lnkNext.NavigateUrl=Request.CurrentExecutionFilePath+ "?Page=" + Convert.ToString(CurPage+1); }
else{ lnkNext.Text = "";}
		
dg.DataSource = objPds;
dg.DataBind(); 
CurrentPage.Text = CurPage.ToString() + "/" + objPds.PageCount.ToString() + "(" +objPds.DataSourceCount.ToString() + ")";

Så ser min ut och den funkar skitbra. Det enda jag kan se som du har annorlunda är if satserna och ordningen.

OBS! dg är en repeater, CurrentPage, lnkNext och lnkPrev är labels.

Medlem sedan nov. 2003569 inlägg
#4

Ni försöker verkligen göra allt så svårt som möjligt. Är det nån slags dygd i att krångla till allt? hä hä hä :e

1. i page_load isPostBack==false, lägg upp hela datatable i en cache såhär:

SqlDataAdapter theAdapter=new SqlDataAdapter("SELECT * FROM tabellen WHERE nånting","din connectionstring");
DataTable theTable=new DataTable();
theAdapter.Fill(theTable);
DataGrid1.DataSource=theTable;
DataGrid1.DataBind();
Cache["tabellen"]=theTable;

2. vid händelsen page_indexchanged anropar ni följande:

DataGrid1.DataSource=(DataTable)Cache["tabellen"];
DataGrid1.CurrentPageIndex=e.NewPageIndex;
DataGrid1.DataBind();

Mer än så behöver man inte skriva. Och att "rebinda" DataGrid:et vid varje newpage sliter på databasen vilket resulterar i en dödlig overhead, tänk om ni har ett par miljoner rader i databasen?? va va va?? §e . Lägg tabellen i cachen istället som jag, så blir det bara 1 SELECT oavsett hur många gånger surfaren bläddrar, eftersom ni vet att surfaren kommer klicka igenom pageindex i snabb takt.

Medlem sedan nov. 20022 355 inlägg
#5

tack jazzil, ska ta en titt på din kod snarast :bire
Nöff, det rör sig om en datalist nu och inte en datagrid, du du du :e

Medlem sedan nov. 2003569 inlägg
#6

Använd DataGrid:s istället, vill du bygga egna ItemTemplates går det bra där också. :p

Medlem sedan jan. 2004678 inlägg
#7

jo jag tycker att det låter lättast att bara köra på datagrid.. men visst vill man vara mer avancerad än så så kan man ju skapa en egen till datagrid. ;P

Medlem sedan maj 2003151 inlägg
#8

Mc Fetto skrev:

tack jazzil, ska ta en titt på din kod snarast :bire
Nöff, det rör sig om en datalist nu och inte en datagrid, du du du :e

De va inget ;)

271 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
129 ms — deklarationer (db)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)
120 ms — ändringar (db)