none
Validar campo de datagrid vacío RRS feed

  • Pregunta

  • Hola. Tengo el siguiente problema espero me puedan apoyar:

    En una aplicación estoy recorriendo un GRID y debo eliminar registros si la celda 6 está vacía. entonces ejecuto el siguiente código pero me marca error:

    linea = 0;
                foreach (DataGridViewRow row in dataGridView1.Rows)
                {
                    
                    if(String.IsNullOrEmpty(dataGridView1.Rows[linea].Cells[6].Value.ToString()))
                    {
                        
                        dataGridView1.Rows.RemoveAt(linea);
                    }
                    linea = linea + 1;
                }

    Tambien he intentado con las siguientes validaciones pero en el IF es donde me marca error: Referencia a objeto no establecida como instancia de un objeto.

    if (Convert.ToString(dataGridView1.Rows[linea].Cells[6].Value.ToString().Trim()) == String.Empty)
    if (dataGridView1.Rows[linea].Cells[6].Value == null)

    Gracias por el apoyo

    Saludos cordiales chicos

    domingo, 14 de julio de 2019 5:36

Respuestas

  • Con cierta frecuencia aparecen preguntas en el foro en las que alguien dice "me marca error". Y siempre me pregunto: ¿qué trabajo les costaría decir "me marca el siguiente error: ..." y poner el detalle de cuál es el error? La diferencia es enorme de cara a que alguien pueda dar una respuesta, sabiendo de qué error se trata.

    Veo un par de fallos en el código, y ambos podrían producir un error. El primero es que usas un bucle foreach que recorre la colección de rows, y dentro del bucle ejecutas un RemoveAt que borra un row. Esto está prohibido. Dentro de un bucle foreach no se puede modificar la propia colección que está siendo recorrida por el bucle. Una alternativa sencilla es usar un "for" en lugar del "foreach". Para no tener que andar modificando la variable de control de bucle for cuando borras un registro, una solución sencilla es hacer el bucle "en marcha atrás" (desde el último registro hacia el primero).

    El segundo (potencial) problema está aquí:

    if(String.IsNullOrEmpty(dataGridView1.Rows[linea].Cells[6].Value.ToString()))

    y lo mismo en las otras variantes que has escrito de esa línea. Si alguno de los valores es null, se producirá el error de "referencia no establecida" al intentar acceder a los siguientes valores. Puedes usar los operadores "as", "??" y "?." (este último solo si es una versión moderna de C#) para evitar las referencias nulas:

    if(String.IsNullOrEmpty(dataGridView1.Rows[linea].Cells[6]?.Value as string))

    • Marcado como respuesta Elenita90 domingo, 14 de julio de 2019 16:53
    domingo, 14 de julio de 2019 7:17
    Moderador

Todas las respuestas

  • Con cierta frecuencia aparecen preguntas en el foro en las que alguien dice "me marca error". Y siempre me pregunto: ¿qué trabajo les costaría decir "me marca el siguiente error: ..." y poner el detalle de cuál es el error? La diferencia es enorme de cara a que alguien pueda dar una respuesta, sabiendo de qué error se trata.

    Veo un par de fallos en el código, y ambos podrían producir un error. El primero es que usas un bucle foreach que recorre la colección de rows, y dentro del bucle ejecutas un RemoveAt que borra un row. Esto está prohibido. Dentro de un bucle foreach no se puede modificar la propia colección que está siendo recorrida por el bucle. Una alternativa sencilla es usar un "for" en lugar del "foreach". Para no tener que andar modificando la variable de control de bucle for cuando borras un registro, una solución sencilla es hacer el bucle "en marcha atrás" (desde el último registro hacia el primero).

    El segundo (potencial) problema está aquí:

    if(String.IsNullOrEmpty(dataGridView1.Rows[linea].Cells[6].Value.ToString()))

    y lo mismo en las otras variantes que has escrito de esa línea. Si alguno de los valores es null, se producirá el error de "referencia no establecida" al intentar acceder a los siguientes valores. Puedes usar los operadores "as", "??" y "?." (este último solo si es una versión moderna de C#) para evitar las referencias nulas:

    if(String.IsNullOrEmpty(dataGridView1.Rows[linea].Cells[6]?.Value as string))

    • Marcado como respuesta Elenita90 domingo, 14 de julio de 2019 16:53
    domingo, 14 de julio de 2019 7:17
    Moderador
  • Gracias por tu ayuda Alberto. Coneste tipo de tripiezos y errores voy entendiendo cada vez más. Tengo poco en la programación y me está sirviendo en demasía lo que me comentan. Logré entender a lo que te refieres, sin embargo el último fragmento de código lo pude resolver de la manera en la que a continuación describo:

    for (int i = dataGridView1.Rows.Count; linea<i;linea++)
                {   
                   
                    if (dataGridView1.Rows[i-linea-1].Cells[6].Value.ToString()=="0")
                   
                    {
                   
                        dataGridView1.Rows.RemoveAt(i-linea-1);
                    }
                   
                }

    Si incluyo esta línea elimina todos los registros:

    if(String.IsNullOrEmpty(dataGridView1.Rows[linea].Cells[6]?.Value as string))

    Lo que tuve que hacer es que desde mi consulta aquellos registros que están en vacío o null lo force con un cero para que detecte los que tengan cero para que los elimine, sin mebargo buscaré como identificar aquellos que sean nulos o vacíos en el grid por que puede darse el caso que un producto tenga costo cero y me lo eliminaría; aunque puedo indicarle otro tipo de bandera para determinar si eliminarlo o no pero me inclino para que con base si es vacío o nulo lo elimine. Seguiré buscando sobre este último tema. gracias de nueva cuenta por tu gran apoyo.

    Saludos 

    • Propuesto como respuesta eRiver1 lunes, 15 de julio de 2019 3:27
    domingo, 14 de julio de 2019 17:03