The problem is because you have started at the "beginning" of the gridview's rows with
for (int i = 0; i < GridViewPays.Rows.Count; i++)
Say your DGV has 4 rows :
0 Row 1
1 Row 2
2 Row 3
3 Row 4
If you delete the first row (index = 0) the DGV will have to "shuffle" the remaining rows upwards - like this:
0 Row 2
1 Row 3
2 Row 4
So your loop moves onto its next value (index = 1) and deletes what was Row 3 and the rest get shuffled up.
0 Row 2
1 Row 4
When deleting from lists / grids / etc, if you are going to use the index of an item in a loop, always start at the bottom of the list and work upwards (or backwards). That way the rows do not get shuffled upwards, they stay where they were originally. E.g.
for (int i = GridViewPays.Rows.Count; i >= 0; i--)