2009-06-03 32 views
10

Tengo un DataGridView vinculado que contiene una gran cantidad de datos. El problema es que algunas celdas deben ser ReadOnly y también cuando el usuario navega con TAB o ENTER entre celdas, las celdas ReadOnly deben ser anuladas. ¿Cuál es la mejor manera de hacer que algunas celdas específicas se lean solo inmediatamente después de la carga?Celdas de solo lectura de DataGridView

Looping a través de las células después de configurar DataSource no es una buena idea teniendo en cuenta que la cuadrícula tiene una gran cantidad de datos. Además, hacer que la celda ReadOnly en CellEnter no funcione porque cuando navego con la tecla TAB, tengo que saber si la siguiente celda es ReadOnly o no.

Respuesta

17

tratar de hacer que la columna en lugar de las células individuales de sólo lectura antes de enlace de datos:

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

Si lo que necesita hacer para que las células individuales dentro de la columna, entonces usted tendrá que bucle y ponerlos así:

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

no puedo, algunas de las células dentro de una columna no podía ser de sólo lectura y otros. Depende de algunos indicadores. –

+0

Para columnas individuales necesita hacer un bucle y configurarlo en verdadero. Llevará mucho tiempo, pero no creo que haya otra alternativa. –

+2

.ReadOnly = true - Sí, pero esto debe hacerse después de completar el enlace de datos. P.ej. en el controlador de eventos DataGridView.DataBindingComplete. – Boogier

0

Una vez que la columna es de solo lectura (véase la respuesta de Rashmi) que puede manejar este evento ...

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

     return; 
    } 

} 

que obtendrá la propiedad de solo lectura de la siguiente celda.

Gracias

+0

No puedo poner en Solo lectura una columna porque algunas de las celdas dentro de la misma Columna podrían ser Solo lectura y otras no. Depende de algunos indicadores. –

+0

Para ser más optimista no estoy 100% seguro de que la columna de ReadOnly incluso afectará el código que escribí. Podría valer la pena intentarlo ... –

1

no he probado esto.

Pero, podría establecer la propiedad readonly de la celda en true (según Rashmi), en el evento RowEnter?

Supongo que el evento RowEnter debe activarse cuando se mueve de una fila a otra (o cuando se cambia de la celda A1 a B3).

¿Eso ayuda en absoluto?

-2

Hay una muy buena muestra aquí:
http://blogs.msdn.com/netcfteam/archive/2006/04/25/583542.aspx

Sólo tiene que anular Paint(), he utilizado esto en marco compacto para cambiar el color de fondo en función de los contenidos de la celda de modo en la misma nota no deberías Tiene algún problema para configurarlos como de solo lectura.

+2

-1 Manera incorrecta de resolver el problema. – siride

+0

Las respuestas de solo enlace van en contra de las pautas de publicación. Una respuesta completa sería que el usuario no tiene que navegar a otra página para resolver el problema. – orgtigger

-1

¿No podría usar una columna de plantilla en lugar de una columna encuadernada y luego tener una condición para la legibilidad del campo?

Luego podría presentar una etiqueta para solo lectura y un cuadro de texto para editar. Las etiquetas no interferirían con su índice de pestañas.

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

ASP.NET no tiene "DataGridView" s ... El OP está pidiendo una respuesta de WinForms. –

4

Puede usar el evento CellBeginEdit y establecer e.Cancel = True cuando necesite deshabilitar la celda.

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; 
Cuestiones relacionadas