Principales respuestas
Caracter numérico después de separador decimal

Pregunta
-
Hola a todos;
Tengo un datagridview en el que por ejemplo, le pongo en una celda con edición esto: ,23 , la primera vez coloco el punto o la coma y me coge perfectamente el valor 0,23 tal como indica la instrucción, ahora bien, cada siguiente vez que en ese datagridview quiero insertar otro valor decimal, me pone siempre un cero delante : 0,023, la tercera vez que inserte otro valor decimal, me lo pone como: 0,0023 y cada vez me va añadiendo un 0 y no veo porqué.
Os pongo el código que debe ser una tontería pero yo no se verla.
Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing ' referencia a la celda Dim validar As TextBox = CType(e.Control, TextBox) ' agregar el controlador de eventos para el KeyPress AddHandler validar.KeyPress, AddressOf cellTextBox_KeyPress ' Referenciamos el control TextBox subyacente en la celda actual. ' Dim cellTextBox As DataGridViewTextBoxEditingControl = _ TryCast(e.Control, DataGridViewTextBoxEditingControl) ' Obtenemos el valor actual de la celda. ' ' MessageBox.Show(cellTextBox.Text) ' Obtenemos el estilo de la celda actual ' Dim style As DataGridViewCellStyle = e.CellStyle ' Mientras se edita la celda, aumentaremos la fuente ' y rellenaremos el color de fondo de la celda actual. ' With style .Font = New Font(style.Font.FontFamily, 10, FontStyle.Bold) .BackColor = Color.Beige End With End Sub Private Sub cellTextBox_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs) Handles cellTextBox.KeyPress ' Referenciamos el control TextBox subyacente. ' Dim tb As TextBox = TryCast(sender, TextBox) ' Si la conversión ha fallado, abandonamos el procedimiento. ' If (tb Is Nothing) Then e.Handled = True Return End If Dim isDecimal, isSign, isMinus, isValidChar As Boolean Dim decimalSeparator As String = Nothing Select Case e.KeyChar Case "."c, ","c ' Obtenemos el carácter separador decimal existente ' actualmente en la configuración regional de Windows. ' decimalSeparator = _ Threading.Thread.CurrentThread. _ CurrentCulture.NumberFormat.NumberDecimalSeparator ' Hacemos que el carácter tecleado coincida con el ' carácter separador existentente en la configuración ' regional. ' e.KeyChar = decimalSeparator.Chars(0) ' Si el primer carácter que se teclea es el separador decimal, ' o si bien, existe un signo en el primer carácter, envío la ' combinación '0,'. ' If (((tb.TextLength = 0) OrElse (tb.SelectionLength = tb.TextLength)) OrElse _ ((tb.TextLength = 1) AndAlso ((tb.Text.Contains("-")) OrElse _ (Text.Contains("+"))))) Then ' NOTA: Envío la combinación "0," mediante el método Send, ' para que en el código cliente se desencadenen los ' eventos de teclado. ' SendKeys.Send("{0}") SendKeys.Send("{" & decimalSeparator & "}") e.Handled = True Return End If ' Es un carácter válido. ' isDecimal = True isValidChar = True Case "-"c, "+"c ' Signos negativo y positivo ' Es un carácter válido. ' isMinus = True isValidChar = True Case Else ' Sólo se admitirán números y la tecla de retroceso. ' Dim isDigit As Boolean = Char.IsDigit(e.KeyChar) Dim isControl As Boolean = Char.IsControl(e.KeyChar) If ((isDigit) OrElse (isControl)) Then isValidChar = True Else e.Handled = True Return End If End Select ' Si es un carácter válido, y el texto del control ' se encuentra totalmente seleccionado, elimino ' el valor actual del control. ' If ((isValidChar) And (tb.SelectionLength = tb.TextLength)) Then tb.Text = String.Empty End If If (isSign) Then ' Admitimos los caracteres positivo y negativo, siempre y cuando ' sea el primer carácter del texto, y no exista ya ningún otro ' signo escrito en el control. ' If ((tb.SelectionStart <> 0) OrElse _ (tb.Text.IndexOf("-") >= 0) OrElse _ (tb.Text.IndexOf("+") >= 0)) Then e.Handled = True Return End If End If If (isDecimal) Then ' Si en el control hay ya escrito un separador decimal, ' deshechamos insertar otro separador más. ' If (tb.Text.IndexOf(decimalSeparator) >= 0) Then e.Handled = True Return End If End If End Sub
Un saludo.
Gemma
Respuestas
-
Mira la Nota en la documentación del evento
' referencia a la celda Dim validar As TextBox = CType(e.Control, TextBox) ' agregar el controlador de eventos para el KeyPress RemoveHandler validar.KeyPress, AddressOf cellTextBox_KeyPress AddHandler validar.KeyPress, AddressOf cellTextBox_KeyPress
- Propuesto como respuesta Asier Villanueva sábado, 10 de octubre de 2015 20:57
- Marcado como respuesta gemma_campillo sábado, 10 de octubre de 2015 21:50
Todas las respuestas
-
Mira la Nota en la documentación del evento
' referencia a la celda Dim validar As TextBox = CType(e.Control, TextBox) ' agregar el controlador de eventos para el KeyPress RemoveHandler validar.KeyPress, AddressOf cellTextBox_KeyPress AddHandler validar.KeyPress, AddressOf cellTextBox_KeyPress
- Propuesto como respuesta Asier Villanueva sábado, 10 de octubre de 2015 20:57
- Marcado como respuesta gemma_campillo sábado, 10 de octubre de 2015 21:50
-