e certo che ho ragione!  
 
ma si può fare pure così, uomo di poca fede  
 
	codice:
	    Protected Sub miaFunzione(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.CommandEventArgs)
        PrintLn(e.CommandArgument, "miaFunzione: " & e.CommandName)
    End Sub
    Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound
        Dim r As GridViewRow = e.Row
        Dim b As ImageButton = TryCast(r.FindControl("ImageButton1"), ImageButton)
        If b IsNot Nothing Then
            AddHandler b.Command, AddressOf miaFunzione
        End If
    End Sub
 
ma che vantaggio c'è? è conveniente usarlo, secondo me, solo in gridview annidate 