none
Controlar error en Datagridview System.FormatException RRS feed

  • Pregunta

  • Hola amigos del foro: Estoy trabajando con VS2012 cargando una tabla con los valores de ciertas cuentas contables. En la primera columna, va el número de la cuenta contable, valor numérico entero. Cuando digíto en esa celda la cuenta contable y doy Enter, me trae a la pantalla ciertos registros para trabajar con ellos. Pues bien, si yo me he equivocado de cuenta contable y con el bckspc bórro los números que había escrito, al llegar al último me aparece el error System.FormatException: Input String was not in a correct format. Curiosamente esto no me ocurría en VS2005, para controlar este mensaje lo trato de manejar desde el evento DataError, pero no he podido hacer que me acepte la celda en blanco y poder escribir el número correcto. El otro problema es que para poder salir de la celda tengo que obligatoriamente escribir el número 0 (cero).

    ¿Cómo hacer que me acepte los valores en blanco?

    Saludos y gracias.

    lunes, 20 de febrero de 2017 15:32

Respuestas

  • Hola Carlos Cuenta,

    ¿Qué eventos estás utilizando, el CellEndEdit o CellValueChanged o CellValidating, etc? Puedes mostrar el código de ello.

    Lo que pasa es que seguro estás convirtiendo el .Value de tu celda a un valor entero (Convert.ToInt32(...)) por lo que al borrar el campo este toma como valor vacío (string.empty) y este no puede ser convertido a un valor int.

    Tendrías que validar si el valor se puede convertir a un valor numérico o no.

     Dim miNumero As Integer = 0
    
     Integer.TryParse(celda.Value.ToString(), miNumero)
    
     MessageBox.Show(miNumero.ToString())

    Dónde : Si el valor de la celda puede ser convertido a un valor numérico lo convierte, caso contrario mostrará 0.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta Carlos Cuenta jueves, 23 de febrero de 2017 4:18
    jueves, 23 de febrero de 2017 2:12

Todas las respuestas

  • Hola Carlos Cuenta,

    ¿Estás usando un DataTable ?

    En caso sea correcto, si tu DataColumn es de tipo 'int' (typeof(int)) es lógico que no acepte valores string (string.empty que es el valor vacío) el mínimo valor positivo sería 0.

    Puedes hacer uso del método TryParse, ahí validas si el valor puede ser convertido a int, en caso no se pueda asignarías el valor DBNull.Value (celda sin valor).

    Método Int32.TryParse (String, Int32)

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    lunes, 20 de febrero de 2017 15:52
  • Carlos Cuenta,

    ¿Haces uso de algún método para convertir el texto de la celda a un valor numérico?, de ser así es de esperar que se produzca una excepción de tipo FormatException por intentar convertir un carácter de espacio en blanco a un valor numérico, es la misma excepción que se produciría si intentas convertir a un valor numérico -por ejemplo- una cadena que contiene la palabra "Hola".

    Dim Texto As String = ""
    Dim ValorNumerico As Integer = Convert.ToInt32(Texto)
    'Resultado: La cadena de entrada no tiene el formato correcto
    
    Dim Texto As String = "Hola"
    Dim ValorNumerico As Integer = Convert.ToInt32(Texto)
    'Resultado: La cadena de entrada no tiene el formato correcto


    En cualquier caso, siempre que tengas que trabajar con valores que ingresa el usuario y que corresponden a representaciones de número debes de asegurarte que el valor contiene un formato correcto, caso contrario volverás a verte a la cara con la misma excepción. Para controlar la excepción puedes utilizar el método TryParse:

    Dim Resultado As Integer = 0
    
    Int32.TryParse(DataGridView1(0, 0).Value.ToString(), Resultado)
    
    Dim ValorNumerico As Integer = Resultado
    'Resultado: 0

    Sí el intento de conversión produce una excepción la variable Resultado contendrá 0, caso contrario contendrá el valor numérico correspondiente a la conversión.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    lunes, 20 de febrero de 2017 15:59
  • Hola Carlos Cuenta, una consulta que base de datos utilizas?

    Comentas que antes en la versión VS2005 no tenías este error de código , podrías postear parte de tu código, te has fijado también si las opciones de compilación de un visual a otro han cambiado? de x86 a x64


    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala. Solo dejo en el foro mis post si fueron útiles , de lo contrario y por mantener el orden los borro. Saludos. Lima-Perú.


    • Editado Augusto1982 lunes, 20 de febrero de 2017 16:49
    lunes, 20 de febrero de 2017 16:48
  • Hola a todos por responder, estuve fuera y no pude revisar mi correo. Enlazo mi datagridview por medio del dgv.Datasource=Tabla. y no estoy asignando ninguna variable a mi celda, mas bien, estoy escribiendo sobre sa celda misma y es cuando los números que he escrito los borro con el backspace al borrar el último dígito inmediatamente aparece el error de formato.
    jueves, 23 de febrero de 2017 1:07
  • Hola Carlos Cuenta,

    ¿Qué eventos estás utilizando, el CellEndEdit o CellValueChanged o CellValidating, etc? Puedes mostrar el código de ello.

    Lo que pasa es que seguro estás convirtiendo el .Value de tu celda a un valor entero (Convert.ToInt32(...)) por lo que al borrar el campo este toma como valor vacío (string.empty) y este no puede ser convertido a un valor int.

    Tendrías que validar si el valor se puede convertir a un valor numérico o no.

     Dim miNumero As Integer = 0
    
     Integer.TryParse(celda.Value.ToString(), miNumero)
    
     MessageBox.Show(miNumero.ToString())

    Dónde : Si el valor de la celda puede ser convertido a un valor numérico lo convierte, caso contrario mostrará 0.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta Carlos Cuenta jueves, 23 de febrero de 2017 4:18
    jueves, 23 de febrero de 2017 2:12