Firstly, I don't see your code that passes data to your datagrid's datasource and databinds it. Just make sure it's wrapped inside an "If not Page.IsPostBack then" block, same way you did with BindService() call in page_load :-)
and make the following changes :
Public Sub dgServiceDetail_EditCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles dgServiceDetail.EditCommand
'IMPORTANT: pass the itemindex of the current ROW, not datakey!
dgServiceDetail.EditItemIndex = e.Item.ItemIndex
'IMPORTANT pass the datasource :
dgServiceDetails.DataSource = pass_your_datasource_here_again
'IMPORTANT: then call databind on it
dgServiceDetails.DataBind()
End Sub
also with your cancelCommand, do the same as above :
Public Sub dgServiceDetail_CancelCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles dgServiceDetail.CancelCommand
dgServiceDetail.EditItemIndex = -1
'IMPORTANT pass the datasource :
dgServiceDetails.DataSource = pass_your_datasource_here_again
'IMPORTANT: then call databind on it
dgServiceDetails.DataBind()
End Sub
As for the readonly change on your bound columns as i suggested in the previous post are already in place, so on that end you are good.
This should practically fix the issues you described. Unless I missed something. Report back if it's still not working while also stating "exactly" what is still not working 