Я не знаю, как это заставить DataGridView вызывать событие, когда его DataSource изменен программным образом - это сделано специально.
Лучший способ удовлетворить ваши требования - представитьa BindingSource в микс - источники привязки вызывают события, когда их DataSource изменяется.
Нечто подобное работает (вам, очевидно, нужно будет настроить его под свои нужды):
bindingSource1.DataSource = tbData;
dataGridView1.DataSource = bindingSource1;
bindingSource1.ListChanged += new ListChangedEventHandler(bindingSource1_ListChanged);
public void bindingSource1_ListChanged(object sender, ListChangedEventArgs e)
{
DataGridViewCellStyle cellStyle = new DataGridViewCellStyle();
cellStyle.ForeColor = Color.Red;
dataGridView1.Rows[e.NewIndex].Cells[e.PropertyDescriptor.Name].Style = cellStyle;
}
Другоевозможность сделать это, подписавшись непосредственно на данные - если это BindingList, он распространит события NotifyPropertyChanged, используя свое собственное событие ListChanged.В более сценарии MVVM, который, возможно, будет чище, но в WinForms BindingSource, вероятно, лучше.