Ha egy GridView valamelyik oszlopába gombokat teszünk, akkor a RowCommand esemény nagyon praktikus, mert az eseménykezelő CommandName és CommandArgument tulajdonságai segítségével könnyen meg tudjuk vizsgálni, hogy melyik sorban, melyik gombra kattintott a felhasználó. A CommandArgument tulajdonságot általában az adott rekord kulcs oszlopához szoktuk kötni, hogy az adott rekordra könnyen tudjunk hivatkozni. De mi van akkor, ha a GridView adott sorára is hivatkozni szeretnénk?
Sajnos az eseménykezelő nem tartalmaz ilyen paramétert és ha teljesen egyedi eseményünk van, akkor ezt a GridViewból sem tudjuk kinyerni. Választhatjuk azt a megoldást, hogy a hagyományos Buttonból származtatunk egy saját osztályt, amit kibővítünk egy egyszerű RowIndex tulajdonsággal:
public int RowIndex { get { object obj = this.ViewState[ "RowIndex" ]; return obj != null ? (int) obj : -1; } set { this.ViewState[ "RowIndex" ] = value; } }
A következő lépés, hogy a GridViewban saját template oszlopot használunk és ott adatkötéssel beállítjuk ezt a tulajdonságot:
<asp:TemplateField> <ItemTemplate> <Demo:MyButton runat="server" Text="Csináld!" CommandArgument='<%# Eval("ID") %>' RowIndex='<%# Container.DataItemIndex %>' /> </ItemTemplate> </asp:TemplateField>
A gridhez tartozó RowCommand eseménykezelőben így már könnyen megkaphatjuk a sor indexét:
private void OnRowCommand( object sender, GridViewCommandEventArgs e ) { int rowIndex = ( e.CommandSource as MyButton ).RowIndex;
// GridView.Rows[ rowIndex ] ...
}
Innen kezdve a GridView.Rows gyűjteményt megindexelve könnyen el tudjuk érni a kívánt sort és például megváltoztathatjuk a háttérszínét, hogy visszajelzést adjunk a felhasználónak.