SQL does not do things without good reason: and your WHERE clause specifically limits the rows that are updated to only those where the ID column matches the given value.
Having said that, there are some things I don't like about this query:
1) You obviously know about parameterised queries, so why are you mixing them in with string concatenation? Just use parameterised queries throughout - it's a lot safer and it makes the query more readable.
2) Why are you doing this at all:
cmd.Parameters.AddWithValue("('" + label5.Text + "')", dataGridView1.Rows[i].Cells[14].Value);
cmd.Parameters.AddWithValue("('" + dateTimePicker3.Value + "')", dataGridView1.Rows[i].Cells[15].Value);
Those aren't parameters at all!
3) Why are you setting the ID value to the value it already is? Since you only modify rows where the value is already equal to @ID, why set it to @ID again?
I'd start by finding out what - exactly - is in your label, and finding a way to pass that via a parameter: it's entirely possible that is what is causing the problem you have noticed. Use the debugger to make absolutely certain!
Get rid of the last two "parameters", clean up your query, and see what is in the label.