none
Celdas de datagridview retornan NULL RRS feed

  • Pregunta

  • Hola, tengo un problema el cual intento obtener los valores de distintas filas de un datagridview mediante este codigo.

     foreach (DataGridViewRow row in dgv.Rows)
                    {
                        for (int i = 1; i < row.Cells.Count - 1; i++)
                        {
                            try
                            {
                                valorcol = Convert.ToString(row.Cells[i].Value);
                            }
                            catch (Exception)
                            {
                                
                                
                            }
                            
                           
                            }
                        }
                       

                    }

    El metodo .Value SIEMPRE  me devuelve NULL y tengo el datagridview rellenado con datos. Me gustaria saber porque me esta devolviendo NULL, si en todas las filas y columnas tengo valores

    domingo, 3 de junio de 2018 20:30

Todas las respuestas

  • No puedo reproducir su problema.

    En un proyecto de Windows Forms, agregué un DGV y configuré 3 columnas.  En el evento Load del formulario, agrego dos filas así:

            private void Form1_Load(object sender, EventArgs e)
            {
                dgv.Rows.Add("ABC", "DEF", "GHI");
                dgv.Rows.Add("JKL", "MNO", "PQR");
            }
    

    Luego en el clic de un botón, ejecuto el bucle igualito al suyo, excepto por el try..catch.

            private void button1_Click(object sender, EventArgs e)
            {
                foreach (DataGridViewRow row in dgv.Rows)
                {
                    for(int i = 1; i <row.Cells.Count - 1; ++i)
                    {
                        string valor = Convert.ToString(row.Cells[i].Value);
                        Debug.Print($"Valor:  {valor}");
                    }
                }
            }
    

    El bucle funciona.  Esta es la salida en la ventana de depuración:

    Valor:  DEF
    Valor:  MNO
    Valor:  <--- Corresponde a la fila de nuevo registro, por eso en blanco.

    Nótese cómo los valores de la primera y última columna no se muestran.  Esto debido a que usted, por alguna razón que desconozco, ha decidido quitar la primera y última columna del bucle.  Recordemos que las colecciones en .Net inician en el índice cero, pero su bucle interno inicializa la variable "i" a partir de 1, no de 0.  Además, la condición de salida del bucle FOR indica que debe salirse tan pronto como "i" sea igual a la cuenta de columnas menos 1, lo que excluye la última columna.

    En resumen, el bucle interno (el FOR i) no correrá si el DGV tiene 2 columnas o menos.


    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    domingo, 3 de junio de 2018 21:15
    Moderador
  • Lo probé con pequeñas modificaciones y funciona

        private void Controlar()
        {
          string valorcol = "";
    
          foreach (DataGridViewRow row in dgv.Rows)
          {
            for (int i = 0; i < row.Cells.Count; i++)
            {                      
              valorcol += row.Cells[i].OwningColumn.Name + ": "+ Convert.ToString(row.Cells[i].Value) + " -- ";         
            }
            valorcol += Environment.NewLine;
          }
          MessageBox.Show(valorcol);
        }


    • Editado AntiWork domingo, 3 de junio de 2018 21:26
    domingo, 3 de junio de 2018 21:24
  • Gracias por responder, me sigue sin andar.( tengo 8 columnas)

    Me olvide de aclarar que uso un metodo el cual lo primero que hace es esto: (el valor sigue dando null)

    public virtual void GetAll(string marca, Int64 anio, DataGridView dgv)
    {

    foreach (DataGridViewRow row in dgv.Rows)
                    {
                        for (int i = 0; i < row.Cells.Count ; i++)
                        {
                            try
                            {
                                valorcol = Convert.ToString(row.Cells[i].Value);
                            }
                            catch (Exception)
                            {
                                
                                
                            }

                        }

                    }

    }

    Esto hago en el boton

     clsAuto exp = new clsAuto();

    DatosdAuto d = new DatosdAuto();

    exp.GetAll(Convert.ToString(txtMarca.Text), Convert.ToInt64(txtAnio.Text),d.dataGridView1);

    Supongo que no le cambia nada, solo le paso el datagrid de la instancia del formulario.

    Podra ser que el datagridview de la instancia "d" este vacio? Si es asi, como hago para pasarle al metodo GetAll el datagridview que esta en otro formulario ?

    domingo, 3 de junio de 2018 21:40
  • No veo donde defines la variable "valorcol"
    domingo, 3 de junio de 2018 21:55
  • Antes del foreach asi:

    string valorcol = "";

    domingo, 3 de junio de 2018 22:01
  • Borrá por ahora el try catch para que te permita depurar y poné un punto de interrupción en valorcol para si llega hasta ahí y que valores tienen los objetos. Así:

     for (int i = 0; i < row.Cells.Count ; i++)
     {
        valorcol = Convert.ToString(row.Cells[i].Value);
     }

    domingo, 3 de junio de 2018 22:06
  • Ya lo borre, y con el punto de interrupcion con cualquier valor de "i" me sigue dando NULL la celda
    domingo, 3 de junio de 2018 22:09
  • Y row.Cells.Count te da la cantidad de columnas que hay?
    domingo, 3 de junio de 2018 22:12
  •  

    Me olvide de aclarar que uso un metodo el cual lo primero que hace es esto: (el valor sigue dando null)

    Supongo que no le cambia nada, solo le paso el datagrid de la instancia del formulario.

    Podra ser que el datagridview de la instancia "d" este vacio? Si es asi, como hago para pasarle al metodo GetAll el datagridview que esta en otro formulario ?

    Quizas el problema sea eso. Aclará bien el formulario desde el que arranca el programa, donde esta el DGV y desde donde invocás el método
    domingo, 3 de junio de 2018 22:20
  • Para hacer ese tipo de referencia (d.dataGridView1) d tendría que ser la instancia del formulario en el cual se encuentra el dataGridView1. Además, dataGridView1 tiene que tener la propiedad Modifiers en un valor que no sea Private (ej: Modifiers=Public)
    domingo, 3 de junio de 2018 22:27
  • El problema es que el DGV está en blanco.  Según veo en su código , usted instancia d y lo utiliza inmediatamente.  Esto quiere decir que ha creado una nueva copia del formulario (y no lo ha presentado con .Show()) y asume que tiene los datos del formulario que sí se ha presentado al usuario.  Su código está corriendo sobre un DGV que no tiene dato alguno.

    Tiene que mantener una referencia al formulario que sí se ha presentado ante el usuario en alguna parte, aunque sea por medio de Application.OpenForms en el peor de los casos.


    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    lunes, 4 de junio de 2018 2:24
    Moderador
  • hola

    Que seria DatosdAuto ? es la instancia del form? porque no deberias crear una nueva instancia sino usar la existente

    si estas queriendo acceder a otro form deberias pasar la instancia no crear una nueva

    Comunicar Formularios

    de esta forma accederas a esa instancia del form y por consiguiente al grid y sus rows y columnas

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 4 de junio de 2018 15:59