DataGridView leggere solo le celle

Ho un DataGridView vincolato che contiene una grande quantità di dati. Il problema è che alcune celle devono essere ReadOnly e anche quando l’utente naviga con TAB o INVIO tra le celle, le celle di ReadOnly devono essere ignorate. Qual è il modo migliore per creare immediatamente alcune celle specifiche in modo immediato dopo il caricamento?

Effettuare il looping delle celle dopo aver impostato DataSource non è una buona idea, considerando che la griglia ha una grande quantità di dati. Inoltre, rendere la cella ReadOnly su CellEnter non funziona perché quando si naviga con il tasto TAB devo già sapere se la cella successiva è ReadOnly o no.

Prova a rendere la colonna anziché le singole celle in sola lettura prima di bind i dati:

this.dgrid.Columns["colName"].ReadOnly = true; 

Se devi fare le singole celle all’interno della colonna, dovrai eseguire un ciclo e impostarle in questo modo:

 this.dgridvwMain.Rows[index].Cells["colName"].ReadOnly = true; 

È ansible utilizzare l’evento CellBeginEdit e impostare e.Cancel = True quando è necessario disabilitare la cella.

 Private Sub DataGridView_CellBeginEdit(sender As System.Object, e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles DataGridViewMsg.CellBeginEdit If DataGridViewMsg.Rows(e.RowIndex).Cells("disable").Value = "Y" Then e.Cancel = True End If End Sub 

Non ho provato questo.

Ma potresti impostare la proprietà readonly della cella su true (come da Rashmi), sull’evento RowEnter?

Immagino che l’evento RowEnter dovrebbe sparare quando ci si sposta da una riga all’altra (o dovrebbe essere quando si passa dalla cella A1 alla B3).

Questo aiuta affatto?

 this.dataGridViewEmpList.EditMode = DataGridViewEditMode.EditProgrammatically; 

Una volta che la colonna è di sola lettura (vedi la risposta di Rashmi) puoi gestire questo evento …

 private void dataGridView1_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == (char)Keys.Tab) { Boolean readOnly = (sender as DataGridView).SelectedCells[0].ReadOnly; return; } } 

Quale otterrà la proprietà di sola lettura della cella successiva.

Grazie

È ansible farlo utilizzando l’evento BeginningEdit per verificare se il controllo verifica se la cella soddisfa una condizione e annullare l’operazione in caso contrario:

Nell’esempio seguente, se la cella contiene già un valore, annulla l’operazione, considerandola come di sola lettura.

xaml :

  

c# :

 private void DataGrid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e) { string content = (e.EditingEventArgs.Source as TextBlock).Text; if (!(String.IsNullOrEmpty(content))) e.Cancel = true; } 

Non potresti usare una colonna modello invece di una colonna rilegata e quindi avere una condizione per la sola lettura del campo?

Quindi è ansible presentare un’etichetta per la sola lettura e una casella di testo per la modifica. Le etichette non interferirebbero con il tuo indice tab.

   < % if ( <%# Eval( "ReadOnlyFlag" ) %> ) { %> " /> < % } else { %> " /> < % } %>   

C’è un esempio molto bello qui:
http://blogs.msdn.com/netcfteam/archive/2006/04/25/583542.aspx

Hai solo bisogno di sovrascrivere Paint() , l’ho usato su un framework compatto per cambiare il backcolor a seconda del contenuto della cella, quindi sulla stessa nota non dovresti avere problemi a impostarli solo in lettura.