Así que tenia la intención de regular el ingreso de valores en esta celda a fin de solo aceptar números, o el punto decimal; es un problema cuya respuesta es muy simple en un TextBox, solo nos montamos en el evento KeyPress:
Private sub txt_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) handless Txt.Keypress
if chr.isdigit(e.keychar) then
else
e.handler = true
endif
end sub
Así que se me ocurrió que la solución seria igual de simple, sin embargo, al momento de tratar de implementarlo pude darme cuenta que el objeto “Cell” del control DataGridView no posee el evento KeyPress, existe solamente para el control en si, pero su función no es la misma puesto que solo se dispara cuando se presiona una tecla si el foco esta en el DataGridView y no cuando estamos capturando un valor en una celda del mismo control.
Así pues luego de mucha investigación di con la solución, aclaro desde ahora, no es la única, pero si la mas simple y mejor estructurada, por cierto, no recuerdo el nombre de la persona que publico esta solución en el foro de Msdn, pero se lo agradezco; ya no volví a encontrar el post.
Update (01/Ago/08)–> Gracias a Kyha que me proporcionó la dirección, el post en el foro de Msdn es:
http://forums.microsoft.com/MSDN-ES/ShowPost.aspx?PostID=2030266&SiteID=11
Primero, declaramos un método, o función, que se encargara de hacer la validación de la tecla pulsada en base al parámetro que recibe
Private Sub Valid(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)
If chr.IsDigit(e.KeyChar) then
e.Handled = False
Else
e.Handled = True
End If
End Sub
Ahora procedemos a modificar el evento EditingControlShowing, que es cuando una celda del DataGridView pasa del modo normal al de edición, precisamente usamos este evento porque a través de el podemos obtener la tecla que se ha pulsado, en este caso
Update(01/Ago/08)–> Gracias al comentario de Kyha, pude ver que este método tenía un pequeño bug, es necesario primero observar si ya hemos asignado el evento a la celda en cuestión, de ser así es necesario eliminarlo, esto con la finalidad de evitar que realice el mismo proceso varias veces, a consecuencia de varias reasignaciones, quedaría entonces
Private Sub DG_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DGCot.EditingControlShowing
RemoveHandler e.Control.KeyPress, AddressOf Valid
AddHandler e.Control.KeyPress, AddressOf Valid
End Sub
Podemos notar que utilizamos el método AddHandler, este nos permite asociar el evento que ocurre al presionar una tecla (e.Control.KeyPress) con la función que anteriormente explicamos (Valid), con esto conseguimos que cada vez que se presione una tecla al ingresar un valor en la celda, se ejecute nuestra función de validación y solo se acepten números
Simple, no
Desde aquí, un gran saludo a Kyha y muchas gracias por tus aportes
esta bonito este codigo pero genera un error que los datos introducidos no se pueden borrar con la tecla de la flechita si no que hay que seleccionar todo y precionar la tecla supr
Saludos Emerson:
Cierto, pero es debido a que en la validación solo estoy aceptando que se presionen teclas correspondientes a números, exactamente en esta condición:
"If chr.IsDigit(e.KeyChar) then"Para corregirlo solo seria cuestión de modificar un poco la condición a fin de que valide el uso de BackSpace, pero necesitamos usarlo convirtiéndolo a su valor ascii, es decir, terminaríamos con una condición así:
"If chr.IsDigit(e.KeyChar) or ( asc(e.KeyChar)= 8 ) then"Sera lo mismo si deseas incluir otras teclas, solo cambiara el valor ascii.
Nos vemos
Hola Emerson:
He encontrado tu blog por casualidad haber si me puedes ayudar.Encontre en el foro de msdn este mismo código.
Mi duda seria como se podria implementar para poder elegir la columna que quieres validar,ya que este código es para todo el grid.
Lo he estado intentando pero no me sale.Haber si a ti se te ocurre algo
Gracias
Hola de nuevo
Primero : Perdon por mi ignoracia, y si no era el mejor lugar para de jar una duda.
Ya encontre la solución ,es muy sencilla.En el metodo Valid. delante de todo ,Poner.
‘Obtendremos la celda actual ,es decir la celda que estamos editando
Dim drwFila As DataGridViewCell = grid1.CurrentCell()
‘Ponemos nuestra condicion
If drwFila.ColumnIndex > 3 Then
Perdon y gracias
Saludos Kyha
No hay porque disculparse, la idea es aprender cada vez más entre todos, yo soy quien debería hacerlo dado que tarde en darme cuenta de tu entrada y no pude responderte antes.
Tu solución es muy buena, , y abusando un poco, tendrás aun la liga del msdn donde encontraste el código, me gustaría ponerlo como referencia
Nos vemos, muchas gracias por tu comentario
Hola Emerson
No pensaba que me ibas a contestar.
No tenia la liga del msdn,pero te la he buscado:
http://forums.microsoft.com/MSDN-ES/ShowPost.aspx?PostID=2030266&SiteID=11
Por cierto no tardastes casi nada en contestarme es que cuando me surge alguna duda tengo que sacarla, no soy de las q
(Perdon me fallo un dedo y aprete donde no debia)
decia que no me gusta esperar a que otros me las resuelvan.Si yo no hacer nada.
Gracias por contestar.
Perdon otra vez cybk ,me acabo de dar cuenta que te cambie de nombre.
Creo que desde que soy programadora mi cerebro no va del todo bien.
He hecho una modificación para que ademas me cuente el numero de numero que introduzco para limitar el tamaño.Funciona si es el primera celda que se pone en edicion, la segunda me hace 2 pasadas al metodo valid ,la tercera 3 pasadas, y asi sucesivamente.
No se porque lo hace, ademas solo me muestra una vez ese numero.
Si tienes alguna idea me lo dices , si encuentro la solucion te paso el codigo.
Gracias por todo y perdon por cambiarte el nombre y molestarte
Hola cybk
He intentadoo solucionarlo con es código,pero no lo he conseguido.Al final lo he podido solucionar utilizando el codigo de mrchuseau que puso en el foro del web.Desde aqui le doy las gracias.
http://www.forosdelweb.com/f29/accionar-evento-keypress-datagrid-272840/
Hola por decima vez prometo no dejar mas mensajes.Estudiando el codigo nuevo he comprendido lo que le pasaba al otro.
El problema estaba en que el evento DG_EditingControlShowing solo se ejecuta la primera vez que entra en una celda en modo de edicion.
Lo que no entiendo es porque hay que quitar el evento y volverlo a poner.
Pongo el cambio entero de este evento :
Private Sub DG_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DGCot.EditingControlShowing
RemoveHandler e.Control.KeyPress, AddressOf Validar
AddHandler e.Control.KeyPress, AddressOf Valid
End Sub
Saludos Kyha
No le prestes atención al cambio de nombre ^_^
Te agradezco el link, la verdad yo no había podido encontrarlo de nuevo, por cierto, estoy de acuerdo contigo, a veces nos enfrascamos tanto en el problema que tratamos de resolver en nuestro programa, que nos volvemos un tanto distraídos (un mucho en mi caso
)
El evento AddHAndler lo que hace es “montar” el método designado por nosotros para que ocurra siempre que se dispara el evento donde lo llamamos, en este caso, hará que se ejecute el método “Valid” cuando ocurra el evento “DG_EditingControlShowing”; aunque hasta que no leí tus comentarios, no sabía que esta asignación se mantendría durante todo el tiempo de ejecución.
El hecho de que sea necesario primero eliminar el método es para evitar que si una celda ya lo tiene asignado como su evento, se le asigne de nuevo, lo que ocasionaría que se ejecute más de una vez, como lo observaste; agradezco mucho tu aportación, si no te molesta, lo colocaré en el post para que pueda ser visto más rápidamente por los demás visitantes
Por cierto, dentro de las propiedades de las columnas, en la subsección de comportamiento, viene una llamada MaxInputLength, que permite especificar el número de caracteres que puede escribirse en esa columna, creo que te podría servir
Nos vemos, y por cierto, espero que eso de “es la última vez que escribo” solo sea una broma
Gracias cybk.
Agradezco un monton tu ayuda.Llevo un par de meses inscrita en un foro y aun no me ha ayudado nadie,suelo contestarme yo misma.
No encuentro la propiedad maxInputLenght.
He encontrado un parecida que seria haciendo lo siguiente:
Dim columnas As DataGridTextBoxColumn = Nothing
columnas.TextBox.MaxLength = 10
Pero mi duda esta como puedo decirle ¿que columnas es la que tiene ese tamaño?
Pos si no te cansa ver mi nick muchas veces seguire pasandome por aqui.
Nos vemos.
Si estas usando VS2005, se encuentra en el panel de propiedades, pero ya sabes, solo es accesible luego de haber seleccionado el datagridview y asociado a un origen de datos o agregado manualmente las columnas
Gasto el VS2008 y mis columnas las creo en ejecución.
Bueno Kyha:
Lo que necesitas es desde un principio declarar las columnas de tu DataGridView como de tipo DataGridViewTextBoxColumn, de esta manera la propiedad MaxInputLength estará a tu disposición
Nos vemos, ya sabes, cualquier cosa no dudes en escribir
Gracias cybk, eres genial.
Nos vemos .
No tienes nada que agradecer
Nos vemos
Hola cbyk .
he vuelto a leer tu articulo y he leido que me dabas las gracias, a mi que lo unico que hice fue buscar la solucion a un problema y probandolo varias veces vi lo que fallaba.
Las gracias te las doy yo por explicarme porque se hacian asi las cosas.
Nos vemos.
Buenas
Por no tocar el codigo, pues pensaba que funcionaba bien,me dado cuenta de que no es asi.Lo sigo utilizando para que ademas de que ponga las letras en mayusculas , solo se puedan escribir un numero especifico de caracteres.
Aqui vuelve a estar el rpoblema yo escribo el numero maximo de caracteres en una celda,sin salir de ella los borro , vuelvo a escribir el numero maximo de caracteres y ya no son los que yo me declare,si no que son más.
¿Alguna idea?
He encontrado el error.No tiene nada que ver con el código
El problema esta en la tecla borrar que si borro de seguido no me cuenta todos los caracteres borrados.
Creo que voy hacerte caso ,ahora tengo que tocar el codigo de una forma o de otra y me voy a curar el salud.
Nos vemos
Saludos Kyha, disculpa la demora en responder
Que dios los Bendiga.
El código en C# es mas o menos así:
private void Valid (object sender, KeyPressEventArgs e){
if (!char.IsDigit(e.KeyChar))
e.Handled = true;
}
private void dtgFac_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
e.Control.KeyPress -= new KeyPressEventHandler(Valid);
e.Control.KeyPress += new KeyPressEventHandler(Valid);
}
Muchas gracias por tu aportacion, me resulto de gran ayuda.
Felicitaciones!!
muy bien mantrax gracias
Saludos..
Tengo un problema:
En el evento de keypress en un datagrid no ingresa sino hasta que presiono enter. Es la unica forma en que entra al evento keypres del datagrid.
Que tendria que hacer para que en una columna determinada en lugar de digitarse el punto se digito la coma.
O talvez tendria una mejor opcion para que en una columna se ingrese el tipo moneda.
Solicito sus extraordinarios conocimientos.
Les agradezco de antemano.
Que tal Casper
Una de las formas que he utilizado para acceder a un evento keypress en una celda es tal y como lo expresaba en el post, la coma puedes hacerlo, agregando en el if su valor en ascii, te quedaría así
If chr.IsDigit(e.KeyChar) or ( asc(e.KeyChar)= 44 )
Donde ‘44′ es el valor ascii de la coma, ahora que si lo único que necesitas es darle un formato de tipo moneda a una columna en particular, primero necesitas declarar una variable de tipo DatagridviewStyle, digamos algo como
Dim DgStyle As New DataGridViewCellStyle
DgStyle.Format = “c2″
DGColumn.DefaultCellStyle= DgStyle
Donde “C2″ es una manera de representar el formato Currency y dgcolumn es el nombre de la columna a la que le deseas dar formato en el Datagridview.
También, si tus columnas no son creadas en tiempo de ejecución, puedes usar el asistente de Visual studio
muy buen ejemplo me parece muy chido y practico
muy chido ejemplo me parece muy practico y super bueno. saludos
Muchas gracias al autor del post y a mantrax por sus aportaciones son de gran ayuda
Suuuuuper!!!
Gracias MANTRAX!!! eres la neta!!!