Ad una prima prova (molto superficiale perché non ho tempo) mi sembra che RowsAdded non faccia al caso mio perché "spara" dopo che uno inizia ad editare la riga.
Per cui, nel caso limite in cui tutte le colonne sono chiavi, non verrebbe mai generato.
Una soluzione che invece sembra funzionare è utilizzare l'evento CellEnter; però non ne sono soddisfattisismo, per cui se qualcuno ha altri suggerimenti è il benvenuto.
In ogni caso qui c'è il mio codice (isChiave mi dice semplicemente se la colonna fa parte delle chiavi della tabella).
private void dataGridView_CellEnter(object sender, DataGridViewCellEventArgs e)
{
if(isChiave(e.ColumnIndex))
{
DataGridViewRow dr = dataGridView.Rows[e.RowIndex];
dataGridView.CurrentCell.ReadOnly = !dr.IsNewRow;
}
}