none
agregar filas a datagridview con datasource RRS feed

  • Pregunta

  • Hola.

    Paso parte de codigo donde tengo un DatagridView que se llena por datasource. Quiero agregar a ese dgv nuevas filas donde se daran de alta nuevos registros, leyendo un poco encontré ideas y quedó algo asi. El tema es que me da error (1)"Referencia a objeto no establecida como instancia de un objeto" (marcado en negrita). Que me está faltando? se puede hacer esto?

    Gracias

               dgv_materiales.DataSource = mat.ListarMateriales(); //funcion que llena el dgv

                DataTable dt = new DataTable();

                dt = dgv_materiales.DataSource as DataTable;

                DataRow dr = dt.NewRow(); (1)

                dt.Rows.Add();

                dgv_materiales.DataSource = dt;
                


    GigiK

    martes, 25 de febrero de 2020 11:31

Respuestas

  • El ejemplo seria aproximadamente asi:

    List<Material> lista = mat.ListarMateriales();
    lista.Add(new Material()); // fila en blanco
    dgv_materiales.DataSource = lista;
    

    • Marcado como respuesta NatiPK jueves, 27 de febrero de 2020 17:15
    jueves, 27 de febrero de 2020 14:42
    Moderador
  • Fíjate que la fila vacía no puede estar vacía "del todo" porque la columna en la que hay un combo forzosamente tiene que contener uno de los valores del combo. Asegúrate de que al hacer el "new" le pones en esa columna un valor que sea válido para el ValueMember. Por ejemplo, si quieres que el combo tome por defecto el primer valor y dicho valor resulta tener el Codigo 1, y la columna se llama UniMed, entonces la fila nueva podría ser así:

    list.Add(new Material {UniMed=1});

    Pero pon el valor y la columna correctos para tu programa, el 1 y el UniMed me los he inventado yo.

    • Marcado como respuesta NatiPK viernes, 28 de febrero de 2020 19:11
    jueves, 27 de febrero de 2020 20:43
    Moderador

Todas las respuestas

  • Casi seguro que el problema está en que dgv_materiales.DataSource no devuelve un DataTable. Tendrías que poner un punto de ruptura en el debugger y examinar qué es lo que en realidad te está devolviendo, posiblemente un DataView o algo por el estilo. Da igual que al llenarlo le asignes un DataTable; al leerlo te devuelve lo que use por dentro, no lo que le asignaste.

    Al no devolver un DataTable, la expresión dgv_materiales.DataSource as DataTable devuelve null, y entonces cuando accedes a dt.Rows da el error de "referencia no establecida" porque dt es null.

    martes, 25 de febrero de 2020 15:28
    Moderador
  • Pero entonces cual seria el error acá?

    que me falta en el código que agregué a la consulta?


    GigiK

    miércoles, 26 de febrero de 2020 10:45
  • Lo primero tienes que usar el debugger para averiguar lo que mencionábamos en la respuesta anterior (qué tipo de dato te esta devolviendo el DataSource). Una vez que tengamos esa información, entonces a la vista de la misma podremos saber que es lo que se necesitaría cambiar en el código.
    miércoles, 26 de febrero de 2020 11:39
    Moderador
  • Pero entonces cual seria el error acá?

    que me falta en el código que agregué a la consulta?


    GigiK

    hola

    No conviertas un datagridview a datatable, utiliza directamente el metodo (que imagino) que es objeto datatable..

    dt =  mat.ListarMateriales();

    suerte

    miércoles, 26 de febrero de 2020 12:51
  • Te paso el método que llena el datagridview, que por lo que lei si utilizo List no puedo convertir en datatable.

            public List<Material> ListarMateriales()
            {
                var bd = new ModeloConstructora();

                List<Material> listMat = new List<Material>();

                var mate = from m in bd.Materiales
                               where m is Material 
                               select m as Material;                            


                foreach(Material mat in mate)
                {
                    listMat.Add(mat);
                }

                return listMat;

            }

        Alguna solución para esto?

    La idea de convertirlo en datatable es para poder agregar nuevas filas para ingresar nuevos datos a la tabla en la base de datos sin tener que usar textbox y botones para agregar, la idea es que se haga todo desde el datagridview.

    Gracias


    GigiK

    miércoles, 26 de febrero de 2020 18:54
  • No, no puedes convertir un List en DataTable así por las buenas. Se puede hacer con un bucle y usando System.Reflection, pero requiere un par de docenas de líneas de código.

    Pero no es necesario. Puedes vincular el List al DataSource del DGV (como ya lo tienes). Y cuando quieras añadir una fila, simplemente la añades en el List que ya tenías (usando el método Add del List), y vuelves a asignar el mismo List (ahora con una fila más) al DataSource.

    miércoles, 26 de febrero de 2020 20:12
    Moderador
  • Muchas gracias por tu respuesta.

    Pero se puede agregar una fila en blanco a la lista y despues completarla en el datagridview?

    tenés algun ejemplo? 

    gracias


    GigiK

    jueves, 27 de febrero de 2020 9:50
  • El ejemplo seria aproximadamente asi:

    List<Material> lista = mat.ListarMateriales();
    lista.Add(new Material()); // fila en blanco
    dgv_materiales.DataSource = lista;
    

    • Marcado como respuesta NatiPK jueves, 27 de febrero de 2020 17:15
    jueves, 27 de febrero de 2020 14:42
    Moderador
  • Muchas gracias Alberto!

    Saludos


    GigiK

    jueves, 27 de febrero de 2020 17:17
  • Alberto me sirvio esto que me dijiste, pero tengo en ese DGV una columna que es combobox y al agregar la nueva fila me faltaria agregar esa columna, alguna solucion para esto?

    te paso como lleno esa columna

               

     //acá lleno el dgv
                this.dgv_materiales.AutoGenerateColumns = false;
                this.dgv_materiales.DataSource = Mate.ListarMateriales();

    //y acá lleno el combobox.

                DataGridViewComboBoxColumn columnaunimed = this.dgv_materiales.Columns["UnidadMedida"] as DataGridViewComboBoxColumn; 
                columnaunimed.DisplayMember = "UniMed_Descripcion";
                columnaunimed.ValueMember = "UniMed_Codigo";
                columnaunimed.DataSource = um.ListarUnidadesMedida();

    agregué un boton que agrega esa nueva fila y el cual contiene

    List<Material> list = Mate.ListarMateriales();

                list.Add(new Material());
                
                dgv_materiales.DataSource = list;

    pero al hacer esto me da error "El valor de DataGridViewComboBoxcell no es válido.


    


    GigiK

    jueves, 27 de febrero de 2020 18:34
  • Fíjate que la fila vacía no puede estar vacía "del todo" porque la columna en la que hay un combo forzosamente tiene que contener uno de los valores del combo. Asegúrate de que al hacer el "new" le pones en esa columna un valor que sea válido para el ValueMember. Por ejemplo, si quieres que el combo tome por defecto el primer valor y dicho valor resulta tener el Codigo 1, y la columna se llama UniMed, entonces la fila nueva podría ser así:

    list.Add(new Material {UniMed=1});

    Pero pon el valor y la columna correctos para tu programa, el 1 y el UniMed me los he inventado yo.

    • Marcado como respuesta NatiPK viernes, 28 de febrero de 2020 19:11
    jueves, 27 de febrero de 2020 20:43
    Moderador
  • Muchas gracias Alberto por tu gran ayuda y paciencia.

    Estoy comenzando con .net y la verdad estaba un poco perdida.

    Con esto ahora si ya funciona como necesito.

    Saludos


    GigiK

    viernes, 28 de febrero de 2020 19:12