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.

protected void Page_Load(object sender, EventArgs e)
{
    if(this.IsPostBack)
        return;

    gdvList.CurrentPageIndex = 15;
    gdvList.DataSource = GetRows();
    gdvList.DataBind();
}

Tulemuseks on viga Invalid CurrentPageIndex value nagu alltoodud pildid.

currentpageindex.png

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.

public static void CorrectCurrentPage(Int32 count, GridView gdv)
{   
    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.

protected void Page_Load(object sender, EventArgs e)
{
    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.

Kommenteeri

sulge
Saada link e-postiga

© DT 2012 | Creative Commons Attribution-Noncommercial 3.0 License | WordPress