Discussion:
Deteccion de teclas en DataGrid
(demasiado antiguo para responder)
Arturo
2006-08-08 13:31:41 UTC
Permalink
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!
SoftJaén
2006-08-08 17:00:16 UTC
Permalink
Post by Arturo
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.
Arturo
2006-08-09 14:46:28 UTC
Permalink
Invaluable ayuda la que me has proporcionado!!!
Me pongo manos a la obra.
Mil gracias.
Post by SoftJaén
Post by Arturo
Alguno sabe cómo detectar qué tecla se presionó dentro
de un DataGrid ?
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
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.
Arturo
2006-08-09 15:17:11 UTC
Permalink
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 ?
Post by SoftJaén
Post by Arturo
Alguno sabe cómo detectar qué tecla se presionó dentro
de un DataGrid ?
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
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.
SoftJaén
2006-08-10 15:17:59 UTC
Permalink
Post by Arturo
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.
Arturo
2006-08-10 19:42:54 UTC
Permalink
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.
Post by SoftJaén
Post by Arturo
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,
Post by SoftJaén
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.
SoftJaén
2006-08-11 07:49:11 UTC
Permalink
Post by Arturo
Lo que me queda por consultar es que si se trata de un bug de la versión que
Microsoft Developmet Environment 2002 Version 7.0.9500
Microsoft .NET Framework 1.0 Versión 1.0.3705
Hace ya tiempo que desinstalé la primera versión de Visual Basic .net, y no
te puedo indicar si se trata o no de un bug.

La prueba la realicé con Visual Basic 2003, y desde luego, te puedo asegurar
que el evento «Leave» se produce únicamente cuando el control DataGrid
pierde el foco.

--
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.
Arturo
2006-08-11 12:10:58 UTC
Permalink
Ok, te agradezco nuevamente por tu tiempo y no le doy más vuelta al asunto.
Debo actualizar mi producto primero y seguramente muchos de los problemas
que hoy tengo se solucionarán.
Post by SoftJaén
Post by Arturo
Lo que me queda por consultar es que si se trata de un bug de la versión
que
Post by Arturo
Microsoft Developmet Environment 2002 Version 7.0.9500
Microsoft .NET Framework 1.0 Versión 1.0.3705
Hace ya tiempo que desinstalé la primera versión de Visual Basic .net, y no
te puedo indicar si se trata o no de un bug.
La prueba la realicé con Visual Basic 2003, y desde luego, te puedo asegurar
que el evento «Leave» se produce únicamente cuando el control DataGrid
pierde el foco.
--
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.
Loading...