Ver Mensaje Individual
  #2 (permalink)  
Antiguo 12/08/2010, 12:13
pancho2413
 
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