Yes OnRowCommnad is fired for any event that is started in a gridview row. when sorting and paging is enabled I make sure that the button Command arg is bound to the key of the data item. so that I can re-fetch the item from my backing cache or DB for manipulation (if not using some data tracking object such as ObjectDataSource). The edit index and delete index values that are typically in the edit/delete event for example will not always work in instance where sorting and paging are enabled.
When using OnRowCommand for multiple button clicks within a row interrogate the CommandName of the event sender to see what you are getting for the command action. This also means that if you are not using the predefined buttons.you will have to populate the CommandName on your button (Template column definition).
Here is an example of select command button I have used in a project that has an ajax popup window to display the full details of the of the row being selected (the gridview only show the snapshot of the data). I populate the popup window by re-calling the backing data object from cache using the commandArg that is bound to the system assigned key (sak) of the object. All of this is going whilst paging is enable.
HTML Code:
<asp:TemplateField ShowHeader="False" ItemStyle-Width="50px">
<ItemTemplate>
<asp:LinkButton runat="server" Text="Select" CommandName="Select" CausesValidation="False" ID="lnkSelect" CommandArgument='<%# Bind("SAK") %>' />
</ItemTemplate>
</asp:TemplateField>