none
Caracter numérico después de separador decimal RRS feed

  • 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

    sábado, 10 de octubre de 2015 18:07

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
    sábado, 10 de octubre de 2015 20:28

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
    sábado, 10 de octubre de 2015 20:28
  • Hola:

    Funciona perfectamente.

    Muchas gracias.

    Gemma

    sábado, 10 de octubre de 2015 21:50