Ennek megvalósításához ún. virtuális darabszámot adunk meg a DataGrid részére, hogy hány sort kell megjelenítenie. A megjelenítéshez természetesen használjuk a múlt héten ismertetett lapozás technikát, hiszen több száz soros táblázat megjelenítésének meg nem sok értelme lenne egy web oldalon.
Azt mondjuk tehát a DataGrid-nek, hogy van ezer sora, de ebből mindig csak annyival kell foglalkoznunk, mely ténylegesen meg is jelenik az adott lapon. Így ha adataink mondjuk egy adatbázisból történő lekérdezés során jutnának el a DataGrid-hez, akkor is csak elegendő lenne egy lapnyi sorokat mozgatni és nem a teljes adathalmazt. Ennek ellenére a felhasználó a DataGrid viselkedése alapján észre sem veszi, hogy most más módon jut az egyes lapokhoz és ezáltal az adatokhoz.
Hasonlóan a múlt héten bemutatott megoldáshoz, most is készítünk tehát egy olyan DataGrid-et, melyben az adat sorok több lapra osztva jelennek meg. Újdonság most annyi lesz, hogy az AllowCustomPaging property-t is igazra állítjuk. Ezzel engedélyezzük annak lehetőségét, hogy virtuális sorokat használjunk, melyeket valójában nem kell megadnunk a DataGrid-nek az adatforrásban.
private void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack)
{
Hogy virtuálisan hány sora legyen a DataGrid-nek, azt a VirtualItemCount property-ben adhatjuk meg. Ettől kezdve a DataGrid úgy viselkedik, mintha ennyi sor lenne a számára megadott adatforrásban. Ennek ellenére persze elegendő lesz mindig annyi sort megadni, amennyi valójában megjelenik a DataGrid egy oldalán.
DataGrid1.VirtualItemCount=1000;
DataGrid1.DataSource = CreateDataView(1);
DataGrid1.DataBind();
}
}
Az adatok generálását a CreateDataView függvényünkre bízzuk. Ennek paraméterként át kell majd mindig adni, hogy a DataGrid-ben megjelenő első sor valójában hányadik adat sort kell hogy tartalmazza.
private DataView CreateDataView(int start)
{
...
Így az adatok generálásakor elegendő a ciklusmagnak annyiszor futnia, ahány elem egyszerre elfér a DataGrid egy lapján.
for (int i=0; i<DataGrid1.PageSize; i++)
{
row = dt.NewRow();
Hogy ez valójában hányadik sora lesz az adathalmaznak, azt a ciklus változó, illetve a kiindulási érték együtt határozza meg.
row[0] = i + start;
...
}
Ha a felhasználó lapozza a DataGrid-et, akkor épp úgy a PageIndexChanged eseményt kell felhasználnunk, mint a múltkori cikkben.
private void DataGrid1_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
{
DataGrid1.CurrentPageIndex = e.NewPageIndex;
Itt az új adathalmaz generálásához meg kell határoznunk, hogy melyik lesz az adathalmaz első sora. Ezt egy egyszerű számítással megtehetjük:
DataGrid1.DataSource = CreateDataView(e.NewPageIndex * DataGrid1.PageSize + 1);
DataGrid1.DataBind();
}