2009-06-03 30 views
10

Ho un DataGridView associato 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?DataGridView celle di sola lettura

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 sapere già se la cella successiva è ReadOnly o no.

risposta

17

cercare di rendere la colonna piuttosto che singole celle di sola lettura prima di binding dei dati:

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

Se avete bisogno di fare per le cellule individuali all'interno della colonna, allora si dovrà loop e impostarli come questo:

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

non posso, alcune delle cellule all'interno di una colonna non potevo essere di sola lettura e gli altri. Dipende da alcune bandiere. –

+0

Per le singole colonne è necessario eseguire il ciclo e impostarlo su true. Ci vorrà molto tempo, ma non penso ci sia altra alternativa. –

+2

.ReadOnly = true - yes, ma questo deve essere eseguito al termine dell'associazione dati. Per esempio. nel gestore di eventi DataGridView.DataBindingComplete. – Boogier

0

Una volta che la colonna è di sola lettura (si veda la risposta di Rashmi) è possibile 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

+0

Non riesco a mettere su ReadOnly una colonna perché alcune delle celle all'interno della stessa colonna potrebbero essere ReadOnly e altre no. Dipende da alcune bandiere. –

+0

Per essere hounest non sono sicuro al 100% che la colonna di ReadOnly abbia effetto anche sul codice che ho scritto. Potrebbe valerne la pena provarlo ... –

1

Non l'ho provato.

Tuttavia, è possibile impostare la proprietà readonly della cella su true (come da Rashmi), sull'evento RowEnter?

Immagino che l'evento RowEnter debba essere attivato quando ci si sposta da una riga all'altra (oppure dovrebbe essere quando si passa dalla cella A1 alla B3).

Questo aiuta?

-2

C'è un bel campione qui:
http://blogs.msdn.com/netcfteam/archive/2006/04/25/583542.aspx

Hai solo bisogno di ignorare Paint(), ho usato questo su compact framework per cambiare il colore di sfondo in base al contenuto delle celle così sulla stessa nota si shouldn' Ho qualche problema a impostarli solo in lettura.

+2

-1 Modo sbagliato per risolvere il problema. – siride

+0

Link solo le risposte sono contro le linee guida di pubblicazione. Una risposta completa sarebbe l'utente non deve Navigare in un'altra pagina per risolvere il problema. – orgtigger

-1

Non potresti utilizzare una colonna modello invece di una colonna rilegata e quindi una condizione per la readonlyness del campo?

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

<asp:TemplateColumn> 
    <ItemTemplate> 
<% 
    if (<%# Eval("ReadOnlyFlag") %>) 
    { 
%> 
    <asp:Label Text="<%# Eval("BoundColumn") %>" /> 
<% 
    } 
    else 
    { 
%> 
    <asp:Textbox Text="<%# Eval("BoundColumn") %>" /> 
<% 
    } 
%> 
    </ItemTemplate> 
</asp:TemplateColumn> 
+2

ASP.NET non ha "DataGridView" s ... L'OP sta chiedendo una risposta WinForms. –

4

È possibile 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 
1
this.dataGridViewEmpList.EditMode = DataGridViewEditMode.EditProgrammatically;