نقل قول نوشته شده توسط mazoolagh مشاهده تاپیک
3- برای ساختن لیست ID ها و گذاشتن اون در commandtext هم باز نیازی به حلقه نیست:

        dim ids=from row as datagridviewrow in DataGridView1.rows where row.cells("id").value isnot nothing select row.cells("id").value
With DataGridView1
Using connection As New SqlConnection(connectionString)
connection.Open()
Using command As New SqlCommand
command.CommandText = "DELETE FROM [YourTable] WHERE [Id] IN (@ids)".replace("@ids",join(ids.toarray,","))
command.ExecuteNonQuery()
End Using
End Using
.DataSource = Nothing
.Rows.Clear()
End With

مثالی که زدید ظاهر خوبی داره. اما یک ایراد بزرگ هم داره. مستعد SQL Injection ئه.
اگر کاربر ستون id رو ببینه و بتونه داحلش مقدار دلخواهش رو وارد کنه میتونه کد SQL ای رو اجرا کنه که مطلوب نیست. انتخاب Parameters بخاطر همینه که از SQL Injection جلوگیری بشه.