none
Validar celda con formato numérico decimal. RRS feed

  • Pregunta

  • Hola:

    Estoy intentando validar una celda con formato decimal y cuando le ingreso 15.15.15 (por ejemplo) me lo da como valido y me lo toma 151.515.  Yo lo que quiero es que ese formato no lo de como bien, ya que no cumple el formato de unidades, decenas y centenas.

    El código que uso para validar es el siguiente:

     decimal unidades = 0;
                            if (!decimal.TryParse(Convert.ToString(row.Cells["Unidades"].Value), out unidades))

    también he intentado validar con el siguiente código:

    if (string.IsNullOrEmpty(e.FormattedValue.ToString()) | !Information.IsNumeric(e.FormattedValue))

    El formato que he dado a la celda es "N2".

    ¿Cómo podría solucionar este problema?

    Un Saludo.

    lunes, 19 de diciembre de 2016 20:36

Respuestas

  • Hola:

    Al final he dado con la solución. Al ver que me lo valida como válido metiendo el número como 15.15.15, lo que he echo es que en el evento de "dgvLineas_CellEndEdit" he metido el siguiente código:

    private void dgvLineas_CellEndEdit(object sender, DataGridViewCellEventArgs e)
            {
                dgvLineas.Rows[e.RowIndex].ErrorText = string.Empty;
    
                DataGridViewCell cell = dgvLineas.Rows[e.RowIndex].Cells[e.ColumnIndex];
                switch (dgvLineas.Columns[e.ColumnIndex].Name)
                {
                    case "Unidades": 
                            cell.Value = string.Format("{0:N2}", Convert.ToDecimal(cell.Value));
                        break;
                    default:
                        break;
                }
            }

    Y entonces me pone el formato del número correctamente: "151.510,00"

    Un Saludo.

    • Marcado como respuesta elturle miércoles, 21 de diciembre de 2016 12:07
    miércoles, 21 de diciembre de 2016 12:07

Todas las respuestas

  • hola

    podrias usar el evento de validacion de la celda. usas pra esto el evento

    Evento DataGridView.CellValidating

    Cómo: Validar datos en el control DataGridView de formularios Windows Forms

    la idea es que el evento de validacion no pase hasta que el valor ingresado sea correcto

    Es correcto que uses el decimal.TryParse() ya que con este validas que el nro ingresado se puede convertir correctamente, pero lo usas dentro del evento CellValidating

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 20 de diciembre de 2016 4:19
  • Hola Leandro:

    En el evento cellvalidating es donde lo estoy usando, lo único es que me da por bueno el decimal 15.15.15, es decir que aunque no tenga bien puestos los puento de miles, lo da por bueno.

    Tambíen tengo el problema que una celda es un combobox y en este evento no puedo obtener el valor del compo, ya que me pone que es nulo.

    DataGridViewComboBoxCell combo = dgvLineas.Rows[e.RowIndex].Cells[e.ColumnIndex] as DataGridViewComboBoxCell;
    string _TIvaId = Convert.ToString(combo.Value);

    Por lo que no puedo validar la celda que tiene el combo....

    Un Saludo.

    martes, 20 de diciembre de 2016 10:39
  • elturle,

    Es claro que hay algo que no haces bien porque la cadena "15.15.15" no puede ser convertido correctamente a un tipo decimal, revisa el siguiente ejemplo:

    private void dgvLineas_CellValidating(object sender, ...
    {
    	DataGridView dgv = (DataGridView)sender;            
    
    	if (dgv.Columns[e.ColumnIndex].Name == "Unidades")
    	{
    		if (!string.IsNullOrEmpty(e.FormattedValue.ToString()))
    		{
    			decimal unidades = 0;
    			bool isDecimal = 
    				decimal.TryParse(e.FormattedValue.ToString(), out unidades);                    
    
    			dgv.Rows[e.RowIndex].ErrorText = !isDecimal ? "Valor no válido" : 
    				String.Empty;
    
    			e.Cancel = !isDecimal;
    		}
    	}
    }



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 20 de diciembre de 2016 19:11
  • Hola Willams:

    He copiado tu código en mi proyecto:

    switch (dgv.Columns[e.ColumnIndex].Name)
                    {
                        case "Unidades":
                            if (!string.IsNullOrEmpty(e.FormattedValue.ToString()))
                            {
                                decimal unidades = 0;
                                bool isDecimal =
                                    decimal.TryParse(e.FormattedValue.ToString(), out unidades);
    
                                dgv.Rows[e.RowIndex].ErrorText = !isDecimal ? "Valor no válido" :
                                    String.Empty;
    
                                e.Cancel = !isDecimal;
                            }
                            break;

    Pero cuando meto por ejemplo 5.5.5. no me da error:

    Pero sin embargo cuadno meto alguna letra si me da error:

    Por lo que no se porque me lo valida como número decimal.

    Un Saludo.

    martes, 20 de diciembre de 2016 20:26
  • elturle,

    Pienso que tiene que ver con la configuración del separador de miles y del separador decimal que tienes establecido en tu equipo o de manera puntual en tu aplicación. Tienes configurado el símbolo de punto (.) como el separador de miles y el símbolo de coma (,) como el separador decimal, por tanto, la cadena "5.5.5" es perfectamente convertida al número decimal 555, cosa muy distinta si intentarás escribir "5,5,5" al intentar convertir a un tipo decimal es de esperar que recibas una excepción de tipo InvalidCastException (o false si utilizas el método TryParse).

    Sin embargo, el separador de miles es sólo parte de un formato, no de la manera como se almacena un valor decimal donde lo único relevante es la separación entre la parte entera y decimal.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 20 de diciembre de 2016 20:51
  • Hola:

    He revisado la configuración del equipo y tengo como separador de miles "." y como separador de decimales "," por lo que está correcto. Y en la aplicación debe de estar igual, porque si meto dos "," da error.

    Seguiré mirando.....

    He probado con un nuevo proyecto en el que solamente meto el form el datagridview y el código en validating y me hace los mismo.

    Un Saludo y Gracias.


    • Editado elturle martes, 20 de diciembre de 2016 21:03 Ampliar
    martes, 20 de diciembre de 2016 21:00
  • Hola:

    Al final he dado con la solución. Al ver que me lo valida como válido metiendo el número como 15.15.15, lo que he echo es que en el evento de "dgvLineas_CellEndEdit" he metido el siguiente código:

    private void dgvLineas_CellEndEdit(object sender, DataGridViewCellEventArgs e)
            {
                dgvLineas.Rows[e.RowIndex].ErrorText = string.Empty;
    
                DataGridViewCell cell = dgvLineas.Rows[e.RowIndex].Cells[e.ColumnIndex];
                switch (dgvLineas.Columns[e.ColumnIndex].Name)
                {
                    case "Unidades": 
                            cell.Value = string.Format("{0:N2}", Convert.ToDecimal(cell.Value));
                        break;
                    default:
                        break;
                }
            }

    Y entonces me pone el formato del número correctamente: "151.510,00"

    Un Saludo.

    • Marcado como respuesta elturle miércoles, 21 de diciembre de 2016 12:07
    miércoles, 21 de diciembre de 2016 12:07