per quel che devi fare sarebbe opportuno mettere come command name del buttonfield il comando "delete" e gestire l'evento
GridView_RowDeleting
nella e della GridViewDeleteEventArgs trovi ben bene il e.Values e.Keys e.RowIndex etc etc
provi li la cancellazione e se non va a buon fine fai un bel e.Cancel = true impedendo la cancellazione stessa dalla gridview
quindi ricapitolando
<asp:ButtonField ButtonType="Image" CommandName="delete" DataTextField="id"
ImageUrl="~/images/delete_16x16.gif"
HeaderImageUrl="~/images/delete_16x16.gif" />
e poi in vb_ese elabora l'evento deleting della grigli. lavoro in c# e non sono familiare con VB ma dovrebbe essere simile a
Protected Sub GridView1_RowDeleting(ByVal sender As Object, ByVal e As GridViewDeleteEventArgs) Handles GridView1.RowDeleting
Dim id_Categoria As Integer = e.Values(0)
Dim cmdElim As New SqlCommand("Elim_Categoria", CnConn)
cmdElim.CommandType = Data.CommandType.StoredProcedure
cmdElim.Parameters.Add("@id_Categoria", Data.SqlDbType.Int, 10).Value = id_Categoria
Try
CnConn.Open()
cmdElim.ExecuteReader()
CnConn.Close()
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical = MsgBoxStyle.Critical, "Attenzione")
e.Cancel = true
Finally
If (CnConn.State = Data.ConnectionState.Connecting) Then CnConn.Close()
End Try
End Sub