Deteccion de teclas en DataGrid

08/08/2006 - 15:31 por Arturo | Informe spam
Hola grupo.
Alguno sabe cómo detectar qué tecla se presionó dentro de un DataGrid ?
Los eventos KeyPress, KeyDown o KeyUp no se desencadenan cuando estoy con el
foco en las celdas del datagrid.
Gracias de antemano!

Preguntas similare

Leer las respuestas

#1 SoftJaén
08/08/2006 - 19:00 | Informe spam
"Arturo" preguntó:

Alguno sabe cómo detectar qué tecla se presionó dentro
de un DataGrid ?



Hola, Arturo:

Para conocer la tecla que se presionó dentro de un control DataGrid, puedes
reemplazar la función «ProcessCmdKey», de ésta manera la función será
llamada por cualquier control que te permita escribir texto, como por
ejemplo, un control TextBox. Si solamente deseas que sea llamada cuando se
pulse una tecla en el control DataGrid, declara una variable Boolean a nivel
de la propia clase Form, la cual deberá tener el valor True, cuando el foco
lo tenga el control DataGrid, y False, cuando el foco pase a otro control.

Inserta en la clase Form donde se encuentre el control DataGrid, el
siguiente código fuente:

Private IsDataGridFocused As Boolean

Protected Overrides Function ProcessCmdKey( _
ByRef msg As System.Windows.Forms.Message, _
ByVal keyData As System.Windows.Forms.Keys) As Boolean

' Si el control DataGrid no tiene el foco,
' abandonamos la función.
'
If Not IsDataGridFocused Then Return False

' La función procesará una tecla, reemplazando al
' método de la clase base.
'
Dim keyPressed As Keys = CType(msg.WParam.ToInt32(), Keys)

' Tecla presionada
'
MessageBox.Show(keyPressed.ToString)

Return MyBase.ProcessCmdKey(msg, keyData)

End Function

Para establecer el valor de la variable «IsDataGridFocused», puedes hacerlo
en los eventos «Enter» (True) y «Leave» (False) del control DataGrid.

Un saludo

Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.
Respuesta Responder a este mensaje
#2 Arturo
09/08/2006 - 16:46 | Informe spam
Invaluable ayuda la que me has proporcionado!!!
Me pongo manos a la obra.
Mil gracias.

"SoftJaén" escribió en el mensaje
news:
"Arturo" preguntó:

> Alguno sabe cómo detectar qué tecla se presionó dentro
> de un DataGrid ?

Hola, Arturo:

Para conocer la tecla que se presionó dentro de un control DataGrid,


puedes
reemplazar la función «ProcessCmdKey», de ésta manera la función será
llamada por cualquier control que te permita escribir texto, como por
ejemplo, un control TextBox. Si solamente deseas que sea llamada cuando se
pulse una tecla en el control DataGrid, declara una variable Boolean a


nivel
de la propia clase Form, la cual deberá tener el valor True, cuando el


foco
lo tenga el control DataGrid, y False, cuando el foco pase a otro control.

Inserta en la clase Form donde se encuentre el control DataGrid, el
siguiente código fuente:

Private IsDataGridFocused As Boolean

Protected Overrides Function ProcessCmdKey( _
ByRef msg As System.Windows.Forms.Message, _
ByVal keyData As System.Windows.Forms.Keys) As Boolean

' Si el control DataGrid no tiene el foco,
' abandonamos la función.
'
If Not IsDataGridFocused Then Return False

' La función procesará una tecla, reemplazando al
' método de la clase base.
'
Dim keyPressed As Keys = CType(msg.WParam.ToInt32(), Keys)

' Tecla presionada
'
MessageBox.Show(keyPressed.ToString)

Return MyBase.ProcessCmdKey(msg, keyData)

End Function

Para establecer el valor de la variable «IsDataGridFocused», puedes


hacerlo
en los eventos «Enter» (True) y «Leave» (False) del control DataGrid.

Un saludo

Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado


o
sugerido en el presente mensaje.




Respuesta Responder a este mensaje
#3 Arturo
09/08/2006 - 17:17 | Informe spam
Enrique, he probado la función que me indicaste y funciona a la perfección,
pero me surge otro problema que ya lo consulte hace ya un tiempo al foro y
recibí un "es raro" como respuesta y es que cada vez que presiono una tecla
de desplazamiento (Right, Up,Left o Down o Tab) se provoca el evento leave
del datagrid pero el foco inmediatamente es tomado ("succionado") nuevamente
por la celda correspondiente del DataGrid sin provocarse el evento enter.
Esto hace que mi variable IsDatGridFocused se torne inmanejable ya que se
setea en False con el evento leave y nunca vuelve a tomar el valor True a
menos que haga perder el foco con el mouse.
Cuál puede ser el problema ?

"SoftJaén" escribió en el mensaje
news:
"Arturo" preguntó:

> Alguno sabe cómo detectar qué tecla se presionó dentro
> de un DataGrid ?

Hola, Arturo:

Para conocer la tecla que se presionó dentro de un control DataGrid,


puedes
reemplazar la función «ProcessCmdKey», de ésta manera la función será
llamada por cualquier control que te permita escribir texto, como por
ejemplo, un control TextBox. Si solamente deseas que sea llamada cuando se
pulse una tecla en el control DataGrid, declara una variable Boolean a


nivel
de la propia clase Form, la cual deberá tener el valor True, cuando el


foco
lo tenga el control DataGrid, y False, cuando el foco pase a otro control.

Inserta en la clase Form donde se encuentre el control DataGrid, el
siguiente código fuente:

Private IsDataGridFocused As Boolean

Protected Overrides Function ProcessCmdKey( _
ByRef msg As System.Windows.Forms.Message, _
ByVal keyData As System.Windows.Forms.Keys) As Boolean

' Si el control DataGrid no tiene el foco,
' abandonamos la función.
'
If Not IsDataGridFocused Then Return False

' La función procesará una tecla, reemplazando al
' método de la clase base.
'
Dim keyPressed As Keys = CType(msg.WParam.ToInt32(), Keys)

' Tecla presionada
'
MessageBox.Show(keyPressed.ToString)

Return MyBase.ProcessCmdKey(msg, keyData)

End Function

Para establecer el valor de la variable «IsDataGridFocused», puedes


hacerlo
en los eventos «Enter» (True) y «Leave» (False) del control DataGrid.

Un saludo

Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado


o
sugerido en el presente mensaje.




Respuesta Responder a este mensaje
#4 SoftJaén
10/08/2006 - 17:17 | Informe spam
"Arturo" escribió:

Enrique, he probado la función que me indicaste y funciona a la
perfección, pero me surge otro problema que ya lo consulte
hace ya un tiempo al foro y recibí un "es raro" como respuesta
y es que cada vez que presiono una tecla de desplazamiento
(Right, Up,Left o Down o Tab) se provoca el evento leave
del datagrid pero el foco inmediatamente es tomado ("succionado")
nuevamente por la celda correspondiente del DataGrid sin provocarse
el evento enter. Esto hace que mi variable IsDatGridFocused se
torne inmanejable ya que se setea en False con el evento leave y
nunca vuelve a tomar el valor True a menos que haga perder el
foco con el mouse. Cuál puede ser el problema ?



Pues no quiero decírtelo, pero no me va a quedar más remedio que decirte que
"es raro". :-)

Acabo de realizar una prueba, utilizando todas las teclas de desplazamiento,
y el evento «Leave» sólo se produce cuando el control DataGrid pierde el
foco. Para comprobarlo, en dicho evento he establecido un punto de
interrupción, y el código solamente se detiene cuando el DataGrid pierde el
foco. Ignoro lo que te puede estar pasando.


Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.
Respuesta Responder a este mensaje
#5 Arturo
10/08/2006 - 21:42 | Informe spam
Lo que me queda por consultar es que si se trata de un bug de la versión que
estoy utilizando, ésta es:
Microsoft Developmet Environment 2002 Version 7.0.9500
Microsoft .NET Framework 1.0 Versión 1.0.3705
Muchas Gracias por tu ayuda.

"SoftJaén" escribió en el mensaje
news:#
"Arturo" escribió:

> Enrique, he probado la función que me indicaste y funciona a la
> perfección, pero me surge otro problema que ya lo consulte
> hace ya un tiempo al foro y recibí un "es raro" como respuesta
> y es que cada vez que presiono una tecla de desplazamiento
> (Right, Up,Left o Down o Tab) se provoca el evento leave
> del datagrid pero el foco inmediatamente es tomado ("succionado")
> nuevamente por la celda correspondiente del DataGrid sin provocarse
> el evento enter. Esto hace que mi variable IsDatGridFocused se
> torne inmanejable ya que se setea en False con el evento leave y
> nunca vuelve a tomar el valor True a menos que haga perder el
> foco con el mouse. Cuál puede ser el problema ?

Pues no quiero decírtelo, pero no me va a quedar más remedio que decirte


que
"es raro". :-)

Acabo de realizar una prueba, utilizando todas las teclas de


desplazamiento,
y el evento «Leave» sólo se produce cuando el control DataGrid pierde el
foco. Para comprobarlo, en dicho evento he establecido un punto de
interrupción, y el código solamente se detiene cuando el DataGrid pierde


el
foco. Ignoro lo que te puede estar pasando.


Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado


o
sugerido en el presente mensaje.



Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida