GridView lehekülje indeksi korrigeerimine
11.06.2007 | GunnarÜks pisivigu GridView kasutamisel, mida tihti kiputakse tegema, on see, et ei kontrollita enne andmete külge haakimist käesoleva lehekülje indeksit. Juhul, kui vaadatavaid andmeid on vahepeal vähemaks kustutatud (näiteks mõne teise kasutaja poolt), võib GridView käesoleva lehekülje indeks olla liiga suur ning GridView andmetega sidumisel tekib viga.
Küllaltki loogiline, et viga tekib. Kui andmebaasist loeti n rida ning GridView-le on öeldud, et vaja on näidata ridu alates n+1 kuni n+1+lehekülje suurus, siis on seda tingimust võimatu täita.
Vea produtseerimine
Kõige lihtsam viis vea produtseerimiseks GridView-ga, mis nätab andmeid lehekülgedena, on määrata piisavalt suur lehekülje indeks. Kui on teada, et leheküljele näidatakse korraga 25 rida ning ridu pole tabelis rohkem kui 250, siis on 15 kindlasti piisavalt suur lehekülje indeks, et korrutatuna ridade arvuga saaksime suurema tulemuse kui tabelis olev ridade arv.
{
if(this.IsPostBack)
return;
gdvList.CurrentPageIndex = 15;
gdvList.DataSource = GetRows();
gdvList.DataBind();
}
Tulemuseks on viga Invalid CurrentPageIndex value nagu alltoodud pildid.

Lehekülje indeksi korrigeerimine
Kes on ise GridView laiendamise teel loonud endale klassi, võib lisada kutse alltoodud funktsioonile GridView DataBind-meetodisse. Kes kasutab aga GridView-d ennast võib selle meetodi välja kutsuda enne DataBind-meetodi kutsumist. Antud meetod leiab suurima lubatud lehekülje indeksi ning omistab selle GridView-le. Funktsioonile tuleb argumentidena kaasa anda GridView andmeallika ridade arv ning GridView, millele antud andmed külge on haagitud.
{
Int32 newIndex = gdv.CurrentPageIndex;
if(gdv.PageSize> 0)
if((Int32)Math.Ceiling(count / gdv.PageSize) <newIndex)
newIndex = (Int32)Math.Ceiling(count / gdv.PageSize);
if(newIndex <0)
newIndex = 0;
gdv.CurrentPageIndex = newIndex;
}
Antud meetod on küllaltki universaalne, sest ei eelda, et me tunneksime kollektsiooni, mille andmeid GridView näitab. Ühesõnaga, me ei tea, kas kollektsioon kasutab pikkuse jaoks Length või Count omadust. Samuti on võimalik, et count leitakse parema jõudluse saavutamiseks hoopis serveri protseduuri abil.
Kordame nüüd vea produtseerimisel toodud näidet koos väikese täiendusega.
{
if(this.IsPostBack)
return;
DataTable dt = GetRows();
gdvList.CurrentPageIndex = 15;
gdvList.DataSource = dt;
CorrectCurrentPage(dt.Rows.Count, gdvList);
gdvList.DataBind();
}
Kui probleeme ei tekkinud, siis nüüd enam käesoleva lehekülje indeksi suuruse kohta viga ei teki ning GridView-s on käesolevaks leheküljeks viimane lehekülg.
