Foros del Web » Programación para mayores de 30 ;) » .NET »

Bloquear acceso a columnas en Datagridview c#

Estas en el tema de Bloquear acceso a columnas en Datagridview c# en el foro de .NET en Foros del Web. Hola, He buscado en absolutamente todo lado y no encuentro una respuesta correcta a lo siguiente: NECESITO bloquear el acceso a una columna del DataGridView ...
  #1 (permalink)  
Antiguo 12/08/2010, 09:42
 
Fecha de Ingreso: septiembre-2009
Ubicación: Cuenca
Mensajes: 57
Antigüedad: 15 años, 1 mes
Puntos: 3
Bloquear acceso a columnas en Datagridview c#

Hola,

He buscado en absolutamente todo lado y no encuentro una respuesta correcta a lo siguiente:

NECESITO bloquear el acceso a una columna del DataGridView que uso. Si estoy en la columna 3 y presiono Enter, Tab o la flecha derecha debe por lógica ir a la columna 4 PERO NO QUIERO que pase eso, sino que vaya a la 5. INCLUSO cuando haga click sería bueno que no acceda a la misma.

Ojo: No es suficiente la orden ReadOnly=true; eso solo evita que se pueda escribir, pero igual cuando me desplazo en la grilla tiene acceso a dicha columna

Esto es para evitar el uso excesivo del teclado en el desplazamiento de la grilla y me comprometo a publicar la respuesta si la encuentro en otro lugar , pero sinceramente me estoy cansando de buscarla . Por favor ayúdenme.

Gracias
  #2 (permalink)  
Antiguo 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

Etiquetas: bloquear, columnas, datagridview
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:07.