none
Dudas sobre como controlar los datos introducidos en un datagridview

    Pregunta

  • Buenas , tengo un datagridview para introducir las linias de un albaran , algunas celdas deben ser de tipo númerico  y otras alfanumericas , por lo tanto lo que he estado probando es que en el evento CellClick del datagridview compruebo la columna donde estoy y miro de que tipo debe ser , un ejemplo seria esto  .

    Funciona correctamente mientros edito la fila en questión , en el campo UDS si detecte que no es correcto pone un "1" no es lo más correcto igual lo correcto seria controlar si solo quiero números solo dejar introducir números y el símbolo decimal.

    Y el problema lo tengo cuando le doy a una columna del grid para que ordene por este campo da un error en el catch que no se como arreglarlo.

    Las columnas del datagridvew las creo mediante una consulta SQL no estan definidas en el diseño del datagridview

            private void dgvAlbaranLinias_CellClick(object sender, DataGridViewCellEventArgs e)
            {
    
                
                if (dgvAlbaranLinias.Columns[e.ColumnIndex].Name == "Uds")
                {
                    try
                    {
                        int aux = Convert.ToInt32(dgvAlbaranLinias.Rows[e.RowIndex].Cells["Uds"].Value.ToString());
                    }
                    catch
                    {
                        dgvAlbaranLinias.Rows[e.RowIndex].Cells["Uds"].Value = 1;
                    }
    
                }

    El error que me da en el catch al hacer click sobre la columna es

    Excepción no controlada del tipo 'System.ArgumentOutOfRangeException' en mscorlib.dll
    
    Información adicional: El índice estaba fuera del intervalo. Debe ser un valor no negativo e inferior al tamaño de la colección.

    Gracias.
    Edgar,


    • Editado golfgti6 viernes, 11 de marzo de 2016 18:02
    viernes, 11 de marzo de 2016 18:00

Respuestas

  • El error te da porque en tu código no controlas que la celda pulsada pueda ser la de la cabecera (rowIndex -1), y al intentar asignar el valor a la propiedad Value de esta celda se produce el error.

            private void dgvAlbaranLinias_CellClick(object sender, DataGridViewCellEventArgs e)
            {
                if (e.RowIndex >= 0 &&
                    dgvAlbaranLinias.Columns[e.ColumnIndex].Name == "Uds")
                {
                    try
                    {
                        int aux = Convert.ToInt32(dgvAlbaranLinias.Rows[e.RowIndex].Cells["Uds"].Value.ToString());
                    }
                    catch
                    {
                        dgvAlbaranLinias.Rows[e.RowIndex].Cells["Uds"].Value = 1;
                    }
    
                }
            }
    

    En cualquier caso para manejar números en el DataGridView es mejor que te crees tipos de columna específicos.

    En mi blog puedes ver un par de ejemplos:

    DataGridView. Columna que acepta sólo números.

    DataGridView. Columna para números con decimales


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    sábado, 12 de marzo de 2016 8:09

Todas las respuestas

  • Hace mucho que abandoné la programación de Windows Forms pero voy a tratar de ayudarle.

    En lo personal yo modelaría mis datos con una clase y ligaría el DGV a una colección de objetos de esa clase.  El DGV automáticamente tratará de convertir el valor que se digita en la celda al tipo de datos de la propiedad a la cual corresponde la columna.  Esto creo que le ahorrará tiempo y esfuerzo.

    Un ejemplo rápido:

    //Esta clase representa una fila en el DGV.
    public class Dato
    {
        public int ID { get; private set; }
        public string Nombre { get; set; }
        public DateTime CreadoEn { get; set; }
    }
    
    //Luego en el formulario creamos una colección de objetos tipo Dato y la vinculamos al DGV.
    BindingList<Dato> datos = new BindingList<Dato>();
    //Llenar aquí con datos de base de datos.
    ...
    //Luego asignar al DGV.
    dgvGrilla.DataSource = datos;

    Jose R. MCP
    Code Samples

    viernes, 11 de marzo de 2016 21:37
    Moderador
  • El error te da porque en tu código no controlas que la celda pulsada pueda ser la de la cabecera (rowIndex -1), y al intentar asignar el valor a la propiedad Value de esta celda se produce el error.

            private void dgvAlbaranLinias_CellClick(object sender, DataGridViewCellEventArgs e)
            {
                if (e.RowIndex >= 0 &&
                    dgvAlbaranLinias.Columns[e.ColumnIndex].Name == "Uds")
                {
                    try
                    {
                        int aux = Convert.ToInt32(dgvAlbaranLinias.Rows[e.RowIndex].Cells["Uds"].Value.ToString());
                    }
                    catch
                    {
                        dgvAlbaranLinias.Rows[e.RowIndex].Cells["Uds"].Value = 1;
                    }
    
                }
            }
    

    En cualquier caso para manejar números en el DataGridView es mejor que te crees tipos de columna específicos.

    En mi blog puedes ver un par de ejemplos:

    DataGridView. Columna que acepta sólo números.

    DataGridView. Columna para números con decimales


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    sábado, 12 de marzo de 2016 8:09