Я думаю, что у вас есть заполненный DataGridView, и вы сравниваете его с DataTable из другого источника. Ваш подход к циклу по DataTable и сетке правильный. Сравнение значения DataTable с
Dgv.DataSource.Columns(0).Items.ToString()
не имеет смысла. Вы возвращаетесь к исходному объекту DataTable со свойством DataSource, затем к столбцу 0, затем к коллекции элементов, но столбец не имеет коллекции элементов.
Глядя на ваш DataGridView, кажется, что столбец, который вы хотите сравнить, - это ячейки (1), а не ячейки (0).
If ds.Tables(0).Rows.Count() > 0 Then
For Each fon As DataRow In ds.Tables(0).Rows
For Each row As DataGridViewRow In Dgv.Rows
If fon(0).ToString = row.Cells(1).ToString() Then
row.Cells("col_check").Value = True
End If
Next
Next
End If
У меня нет сетки с удобными флажками, поэтому я не могу проверить код.