Error al detectar tecla pulsada en un datagridview

04/02/2008 - 21:12 por Duilio | Informe spam
Hola Lista tengo un problema con un datagridview, el problema es el
siguiente quiero interceptar la tecla pulsada cuando el foco este
dentro del datagridview, uso el evento keypress del data gridview y en
el pongo las siguiente linea
private void dataGridView1_KeyPress(object sender, KeyPressEventArgs
e)
{

if (e.KeyChar == Convert.ToChar(''))
{
e.Handled = true;
MessageBox.Show("aaaaaaaaaaaaaaaaaaaaaa");
}

}
Ademas he probado con una serie de opciones q encontre buscando por la
web y no hay caso no anda o sea no hace nada es como si no detectara
el evento. Hubo algunas que solo me detectaban las especiales como
Enter o esc ,pero cuando cambiava el codigo para q me interceptara las
teclas de las letras o numeros igual no andaba.
Bueno si alguno podria ayudarme desde ya muchas gracias
saludos
duilio

Preguntas similare

Leer las respuestas

#1 Luis Miguel Blanco
05/02/2008 - 08:23 | Informe spam
Hola Duilio

Hace un tiempo que respondí a una consulta similar a la que planteas. Te
adjunto el texto de la respuesta y el código de ejemplo que acompañé a la
misma, por si te sirviera para tu caso. Está en VB pero creo que lo puedes
adaptar sin problemas a C#.

Para resolver este problema puedes configurar el objeto Form que contiene tu
DataGridView, de forma que la detección de teclas pulsadas por el usuario sea
capturada en primer lugar por el formulario antes de que pase al control. De
esta manera compruebas si la tecla pulsada es una de las que necesitas
validar, y en caso afirmativo le "das paso" para que llegue a la celda en
edición o la rechazas. Te explico paso a paso:

En primer lugar declaramos una variable con ámbito a nivel de la clase del
formulario, que vamos a utilizar como indicador del momento en que
empecemos/abandonemos la edición de la celda.

A continuación, en el evento de carga del formulario, asignamos True a su
propiedad KeyPreview, de esta manera, podremos capturar las teclas pulsadas
en su evento KeyPress antes de que lleguen a cualquiera de los controles. A
efectos de visualización de los números con el formato que deseas, una vez
cargado el DataGridView con datos, podemos asignarle dicho formato a la
columna que te interese mediante su propiedad DefaultCellStyle.Format.

Mediante los eventos CellBeginEdit y CellEndEdit, activamos/desactivamos la
capacidad de que el formulario pueda capturar las teclas pulsadas por el
usuario, este último proceso lo desarrollaremos utilizando el evento KeyPress
del formulario, donde empleando el parámetro KeyPressEventArgs, obtenemos el
carácter pulsado, cuya validez comprobamos usando los métodos compartidos del
tipo Char, si el carácter no es uno de los que necesitamos, vaciamos la
propiedad KeyPressEventArgs.KeyChar y establecemos que nuestro código
controla el evento asignando True a la propiedad KeyPressEventArgs.Handled. A
continuación te adjunto un bloque de código con un ejemplo de lo que acabo de
comentarte.

'/////////////////////////////////////////////
Public Class Form1
Private bEditandoCelda As Boolean = False

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Me.KeyPreview = True
'
Me.DataGridView1.Columns("UnitPrice").DefaultCellStyle.Format = "#.##"
'
End Sub

Private Sub DataGridView1_CellBeginEdit(ByVal sender As System.Object,
ByVal e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles
DataGridView1.CellBeginEdit
If Me.DataGridView1.Columns(e.ColumnIndex).Name = "UnitPrice" Then
bEditandoCelda = True
End If
End Sub

Private Sub Form1_KeyPress(ByVal sender As System.Object, ByVal e As
System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress
If bEditandoCelda Then
If Char.IsDigit(e.KeyChar) Or Char.IsPunctuation(e.KeyChar) Or
Char.IsControl(e.KeyChar) Then
Return
End If

e.KeyChar = ""
e.Handled = True
End If
End Sub

Private Sub DataGridView1_CellEndEdit(ByVal sender As System.Object, ByVal
e As System.Windows.Forms.DataGridViewCellEventArgs) Handles
DataGridView1.CellEndEdit
If Me.DataGridView1.Columns(e.ColumnIndex).Name = "UnitPrice" Then
bEditandoCelda = False
End If
End Sub
End Class
'/////////////////////////////////////////////

Aparte de esto, otro compañero de los foros, SoftJaen, también aportó una
solución, cuyo enlace te acompaño igualmente.

http://mvp-access.com/softjaen/vb20...dgv001.htm

Espero que cualquiera de estas propuestas te sirva para resolver el problema.

Un saludo
Luis Miguel Blanco
http://www.dotnetmania.com
http://geeks.ms/blogs/lmblanco/


"Duilio" wrote:

Hola Lista tengo un problema con un datagridview, el problema es el
siguiente quiero interceptar la tecla pulsada cuando el foco este
dentro del datagridview, uso el evento keypress del data gridview y en
el pongo las siguiente linea
private void dataGridView1_KeyPress(object sender, KeyPressEventArgs
e)
{

if (e.KeyChar == Convert.ToChar(''))
{
e.Handled = true;
MessageBox.Show("aaaaaaaaaaaaaaaaaaaaaa");
}

}
Ademas he probado con una serie de opciones q encontre buscando por la
web y no hay caso no anda o sea no hace nada es como si no detectara
el evento. Hubo algunas que solo me detectaban las especiales como
Enter o esc ,pero cuando cambiava el codigo para q me interceptara las
teclas de las letras o numeros igual no andaba.
Bueno si alguno podria ayudarme desde ya muchas gracias
saludos
duilio


Respuesta Responder a este mensaje
#2 Duilio
06/02/2008 - 13:41 | Informe spam
On 5 feb, 04:23, Luis Miguel Blanco
wrote:
Hola Duilio

Hace un tiempo que respondí a una consulta similar a la que planteas. Te
adjunto el texto de la respuesta y el código de ejemplo que acompañé a la
misma, por si te sirviera para tu caso. Está en VB pero creo que lo puedes
adaptar sin problemas a C#.

Para resolver este problema puedes configurar el objeto Form que contiene tu
DataGridView, de forma que la detección de teclas pulsadas por el usuario sea
capturada en primer lugar por el formulario antes de que pase al control. De
esta manera compruebas si la tecla pulsada es una de las que necesitas
validar, y en caso afirmativo le "das paso" para que llegue a la celda en
edición o la rechazas. Te explico paso a paso:

En primer lugar declaramos una variable con ámbito a nivel de la clase del
formulario, que vamos a utilizar como indicador del momento en que
empecemos/abandonemos la edición de la celda.

A continuación, en el evento de carga del formulario, asignamos True a su
propiedad KeyPreview, de esta manera, podremos capturar las teclas pulsadas
en su evento KeyPress antes de que lleguen a cualquiera de los controles. A
efectos de visualización de los números con el formato que deseas, una vez
cargado el DataGridView con datos, podemos asignarle dicho formato a la
columna que te interese mediante su propiedad DefaultCellStyle.Format.

Mediante los eventos CellBeginEdit y CellEndEdit, activamos/desactivamos la
capacidad de que el formulario pueda capturar las teclas pulsadas por el
usuario, este último proceso lo desarrollaremos utilizando el evento KeyPress
del formulario, donde empleando el parámetro KeyPressEventArgs, obtenemos el
carácter pulsado, cuya validez comprobamos usando los métodos compartidos del
tipo Char, si el carácter no es uno de los que necesitamos, vaciamos la
propiedad KeyPressEventArgs.KeyChar y establecemos que nuestro código
controla el evento asignando True a la propiedad KeyPressEventArgs.Handled. A
continuación te adjunto un bloque de código con un ejemplo de lo que acabo de
comentarte.

'/////////////////////////////////////////////
Public Class Form1
Private bEditandoCelda As Boolean = False

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Me.KeyPreview = True
'
Me.DataGridView1.Columns("UnitPrice").DefaultCellStyle.Format = "#.##"
'
End Sub

Private Sub DataGridView1_CellBeginEdit(ByVal sender As System.Object,
ByVal e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles
DataGridView1.CellBeginEdit
If Me.DataGridView1.Columns(e.ColumnIndex).Name = "UnitPrice" Then
bEditandoCelda = True
End If
End Sub

Private Sub Form1_KeyPress(ByVal sender As System.Object, ByVal e As
System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress
If bEditandoCelda Then
If Char.IsDigit(e.KeyChar) Or Char.IsPunctuation(e.KeyChar) Or
Char.IsControl(e.KeyChar) Then
Return
End If

e.KeyChar = ""
e.Handled = True
End If
End Sub

Private Sub DataGridView1_CellEndEdit(ByVal sender As System.Object, ByVal
e As System.Windows.Forms.DataGridViewCellEventArgs) Handles
DataGridView1.CellEndEdit
If Me.DataGridView1.Columns(e.ColumnIndex).Name = "UnitPrice" Then
bEditandoCelda = False
End If
End Sub
End Class
'/////////////////////////////////////////////

Aparte de esto, otro compañero de los foros, SoftJaen, también aportó una
solución, cuyo enlace te acompaño igualmente.

http://mvp-access.com/softjaen/vb20...dgv001.htm

Espero que cualquiera de estas propuestas te sirva para resolver el problema.

Un saludo
Luis Miguel Blancohttp://www.dotnetmania.comhttp://geeks.ms/blogs/lmblanco/

"Duilio" wrote:
> Hola Lista tengo un problema con un datagridview, el problema es el
> siguiente quiero interceptar la tecla pulsada cuando el foco este
> dentro del datagridview, uso el evento keypress del data gridview y en
> el pongo las siguiente linea
> private void dataGridView1_KeyPress(object sender, KeyPressEventArgs
> e)
> {

> if (e.KeyChar == Convert.ToChar(''))
> {
> e.Handled = true;
> MessageBox.Show("aaaaaaaaaaaaaaaaaaaaaa");
> }

> }
> Ademas he probado con una serie de opciones q encontre buscando por la
> web y no hay caso no anda o sea no hace nada es como si no detectara
> el evento. Hubo algunas que solo me detectaban las especiales como
> Enter o esc ,pero cuando cambiava el codigo para q me interceptara las
> teclas de las letras o numeros igual no andaba.
> Bueno si alguno podria ayudarme desde ya muchas gracias
> saludos
> duilio



Muchisimas gracias Luis por tu respuesta me sirvio no solo para
resolver el problema q comente anteriormente sino que me ayudo en
otros problemitas q tenia , ademas la calidad de la respuesta es
exelente,
otra ves muchas gracias
Saludos
Duilio
Respuesta Responder a este mensaje
#3 Luis Miguel Blanco
06/02/2008 - 18:55 | Informe spam
Hola Duilio

Estupendo, me alegra mucho de que la respuesta te sirviera para solucionar
más de un problema 8-)

Un saludo
Luis Miguel Blanco
http://www.dotnetmania.com
http://geeks.ms/blogs/lmblanco/

Muchisimas gracias Luis por tu respuesta me sirvio no solo para
resolver el problema q comente anteriormente sino que me ayudo en
otros problemitas q tenia , ademas la calidad de la respuesta es
exelente,
otra ves muchas gracias
Saludos
Duilio

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida