Modifica programmabile della modalità ReadOnly su righe DataGridView

Senza spiegare l’intero contesto, il mio problema è fondamentalmente questo:

Ho un datagridview su un Windows Form che è associato a un Entity Framework DbSet: dbSet.Local.ToBindingList() .

Se imposto la proprietà ReadOnly di datagridview su true (in visualizzazione struttura), e quindi ho questa dichiarazione nel mio codice:

  myDataGridView.Rows[rowIndex].ReadOnly = false; 

Passa attraverso senza cambiare il valore! (E no, la mia origine dati non è in sola lettura).

Effettuare il looping delle celle nella riga e impostare individualmente la proprietà ReadOnly di ciascuna cella non funziona:

  foreach (DataGridViewCell cell in myDataGridView.Rows[rowIndex].Cells) { cell.ReadOnly = false; } 

.ReadOnly – Gets or sets a value indicating whether the user can edit the cells of the DataGridView control. Ma si comporta come se non potesse essere impostato per qualche motivo.

C’è una ragione per cui ciò potrebbe accadere? Stavo pensando che forse la proprietà ReadOnly di datagridview sovrascriverebbe qualsiasi modifica apportata a righe / celle specifiche (cioè l’ intero modulo deve essere in lettura o meno), ma a quanto pare questo ha funzionato per qualcuno …

Ci sono altri modi per raggiungere il mio objective finale, ma mi piacerebbe sapere perché non posso cambiare questa proprietà, in quanto questa sarebbe la soluzione più semplice per la mia situazione.


MODIFICARE:

Lasciatemi provare a chiarire la mia domanda:

Ancora una volta, sono consapevole che ci sono altri modi per raggiungere il mio objective finale, ma vorrei una risposta a questo problema:

Scusa per l’esempio primitivo, ma per replicare facilmente il problema, creare un’applicazione WinForm, lanciare una vista datagrid su di esso e incollare questo codice nel tuo progetto:

 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { dataGridView1.ReadOnly = true; string[] row1 = new string[] { "test", "test1" }; string[] row2 = new string[] { "test2", "test3" }; string[] row3 = new string[] { "test4", "test5" }; dataGridView1.Columns.Add("1", "1"); dataGridView1.Columns.Add("2", "2"); dataGridView1.Rows.Add(row1); dataGridView1.Rows.Add(row2); dataGridView1.Rows.Add(row3); dataGridView1.Rows[1].ReadOnly = false; } } 

Se metti un breakpoint sull’ultima riga e lo passi attraverso, vedrai che la proprietà ReadOnly NON CAMBIA! Perché??

Quindi ho trovato una soluzione / soluzione per la mia domanda, anche se sono ancora insicuro delle ragioni PERCHÉ …

Apparentemente, se si desidera modificare la proprietà ReadOnly di un object DataGridView riga per riga, non è ansible impostare la proprietà DataGridView.ReadOnly principale , poiché evidentemente questo sostituisce eventuali modifiche successive.

Per riutilizzare il mio esempio precedente, la soluzione alternativa sarebbe quella di scorrere ciclicamente le righe e impostare ogni proprietà ReadOnly di ROW (anziché impostare la proprietà ReadOnly di datagridview ), POI è ansible modificare singolarmente la proprietà ReadOnly di ciascuna riga:

 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { //dataGridView1.ReadOnly = true; string[] row1 = new string[] { "test", "test1" }; string[] row2 = new string[] { "test2", "test3" }; string[] row3 = new string[] { "test4", "test5" }; dataGridView1.Columns.Add("1", "1"); dataGridView1.Columns.Add("2", "2"); dataGridView1.Rows.Add(row1); dataGridView1.Rows.Add(row2); dataGridView1.Rows.Add(row3); foreach (DataGridViewRow row in dataGridView1.Rows) { row.ReadOnly = true; } dataGridView1.Rows[1].ReadOnly = false; } } 

Questo funziona benissimo per me, comunque qualsiasi apprezzamento sul motivo per cui il codice nella mia domanda originale non funziona correttamente sarebbe apprezzato!