12/08/2010, 12:13
|
| | Fecha de Ingreso: septiembre-2009 Ubicación: Cuenca
Mensajes: 57
Antigüedad: 15 años, 1 mes Puntos: 3 | |
Respuesta: Bloquear acceso a columnas en Datagridview c# Aquí publico la respuesta que he creado. Realmente es fácil. Solamente crear una clase y pegar el código que aquí está funcionando, lo garantizo. Nada más adaptarlo a la o las columnas que no se quiera tener acceso y listo.
Bueno. Esto es en tan solo 2 pasos:
El primero: Creamos una nueva clase que herede de DataGridView y ponemos el siguiente código. Ojo, lean los comentarios:
-------------------
Class MiGrilla: DataGridView
{
[System.Security.Permissions.SecurityPermission(Sys tem.Security.Permissions.SecurityAction.LinkDemand ,
Flags = System.Security.Permissions.SecurityPermissionFlag .UnmanagedCode)]
[System.Security.Permissions.UIPermission(System.Se curity.Permissions.SecurityAction.LinkDemand,
Window = System.Security.Permissions.UIPermissionWindow.All Windows)]
protected override bool ProcessDataGridViewKey(KeyEventArgs e)
{
//Suponiendo que la columna que quiero que se salte es la quinta,
//su índice dentro de la matriz será ColumnIndex=4 a evitar
//Entonces pregunto si el enfoque está en una columna anterior
//y si presionó alguna tecla que quiero controlar
if (this.CurrentCell.ColumnIndex == 3 && (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Right || e.KeyCode == Keys.Tab))
{
//esto simula como si presionase dos veces tab
this.ProcessTabKey(e.KeyData);
return this.ProcessTabKey(e.KeyData);
}
//ahora en caso que esté en la sexta columna y presione la flecha
//izquierda, debe saltarse a la cuarta columna
else if (this.CurrentCell.ColumnIndex == 5 && (e.KeyCode == Keys.Left))
{
//hace como si presionase la flecha izquierda dos veces seguidas
this.ProcessLeftKey(e.KeyData);
return this.ProcessLeftKey(e.KeyData);
}
else if (e.KeyCode == Keys.Enter)
return this.ProcessTabKey(e.KeyData);
return base.ProcessDataGridViewKey(e);
}
//este procedimiento es también útil, tiene la misma funcionalidad
//Ojo que no es código duplicado, si no lo usan no funcionará por
//sugerencia de Microsoft
protected override bool ProcessDialogKey(Keys keyData)
{
// Extrae el código de la tecla del valor de la tecla
Keys key = (keyData & Keys.KeyCode);
if (this.CurrentCell.ColumnIndex == 3 && (key == Keys.Enter || key == Keys.Right || key == Keys.Tab))
{
this.ProcessTabKey(keyData);
return this.ProcessTabKey(keyData);
}
else if (this.CurrentCell.ColumnIndex == 5 && (key == Keys.Left))
{
this.ProcessLeftKey(keyData);
return this.ProcessLeftKey(keyData);
}
else if (key == Keys.Enter)
return this.ProcessTabKey(keyData);
return base.ProcessDialogKey(keyData);
}
}
Segundo y último paso:
En el explorador de soluciones seleccionar el archivo Designer.cs del formulario que contiene la grilla. Por ejemplo, de VentanaGrilla.cs, entrar a VentanaGrilla.Designer.cs. Aquí hay que cambiar tan solo 2 líneas de código. Busquen la declaración de la grilla y cámbienla, luego dentro del constructor también cambien su referencia. Algo así:
Si está:
private System.Windows.Forms.DataGridView Grilla;
private void InitializeComponent()
{
this.Grilla = new System.Windows.Forms.DataGridViewDataGridViewPerso nalizada();
}
Deben cambiarlo por la grilla personalizada. Así:
private MiGrilla Grilla;
private void InitializeComponent()
{
this.Grilla = new OjoNombreDeNameSpace.MiGrilla ();
}
----------------------------
OPINEN y dejen sugerencias. Sobre todo si tienen algún método mejor. Se los agradecería
Última edición por pancho2413; 12/08/2010 a las 15:47
Razón: Faltó publicar la respuesta
|