The datagrid has a collection called DataKeys. You set a data table field to the datagrid's DataKeyField and the grid will populate this collection with the values from that field. This is how you can get at the key field for a given datagrid row.
So, in your for each you need only access that data key value. Also, you probably should avoid refreshing the grid on each iteration becase A) it's redundant and wastes cycles and B) it could cause things to break, particularly when you are doing a Enumerator loop of the grid's items collection.
For Each oDataGridItem In dgReCart.Items
chkRemove = oDataGridItem.FindControl("chkDelete")
If chkRemove.Checked Then
bl.DeleteItemFrCart(dgReCart.DataKeys(oDataGridIte m.ItemIndex))
End If
Next
RefreshGrid()
Peter
-------------------------
Work smarter, not harder