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.