none
Agregar fila desde boton en gridview RRS feed

  • Pregunta

  • Amigos buenas tardes ,    otra vez yo por acá  quisiera preguntarles algo ,  estoy tratando de realizar lo siguiente , tengo un gridview el cual lo cargo con un list  ,  en este grid tengo una columna con un boton agregar , resulta que si una de las filas tiene una cantidad de  lote menor  a la cantidad solicitada debo hacer click en el boton  agregar para cree una fila nueva debajo de la ya mencionada para seleccionar otro lote. espero me puedan ayudar, comparto un poco de mi código pero no funciona.

     protected void btnImgAgregar_Click(object sender, ImageClickEventArgs e)
            {
                List<Productos> lista = new List<Productos>();

                foreach (GridViewRow row in dgvRemision.Rows)
                {
                   Productos Productos = new Productos();

                 Productos.Codigo = row.Cells[0].ToString();
                 Productos.Referencia = row.Cells[1].ToString();
                 Productos.Descrip = row.Cells[2].ToString();
             Productos.Existen = Convert.ToDecimal(row.Cells[3].Text);
               TextBox txtMonto = row.Cells[4].FindControl("txtMonto") as TextBox;
              Productos.Monto = Convert.ToDecimal(txtMonto.Text);
                   
               lista.Add(Productos);
               }

             dgvRemision.DataSource = lista;
             dgvRemision.DataBind();
            }


    Daniel

    sábado, 18 de abril de 2020 20:24

Respuestas

  • hola

    >>cuando voy a la columna agregar donde esta el boton agregar

    porque columna? un boton de agregar debe estar por fuera del grid

    >>pero si quiero ir ala fila 2 y agregar una fila nueva   lo hace pero tambien me trae las otras creadas antes de la fila 1

    Si usas

         foreach (GridViewRow row in dgvRemision.Rows)

    estas iterando todas las filas, cuando no deberias usar ningun foreach sino determinar que la fila que lanza la accion

    Ademas usas un evento generico Click del boton, eso no es corrrecto, deberias usar el

    GridView.RowCommand Event

    definiendo un CommandName = "Add" (o el command que mas guste) en el boton que tiene en la columna

    En ese evento podrias usar el CommandArgument para conocer el Index de la row que lanzo la accion

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Dannycv012 martes, 21 de abril de 2020 21:00
    domingo, 19 de abril de 2020 18:00
  • hola

    No leiste la documentacion, alli dice

    The ButtonField class automatically populates the CommandArgument property with the appropriate index value.
    For other command buttons, you must manually set the CommandArgument property of the command button

    Sino usaste un ButtonField debes tu mismo asignar el CommandArgument

    En un ejemplo mas abajo uso

    
    
    
    CommandArgument="<%# ((GridViewRow)Container).RowIndex %>"

     como propiedad del boton

    Ademas, ojo porque esto

      List<Productos> Lista = new List<Productos>();

    esta mal

    Si creas una nueva lista cada vez que se lanza la accion, solo tendras el ultimo item

    Deberias poner la lista en Session para conservarla he ir agregando a esta

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina




    lunes, 20 de abril de 2020 4:09

Todas las respuestas

  • hola

    >>tengo un gridview el cual lo cargo con un list

    de dodne salen los datos de ese list ?

    lo pregunto porque la idea es que lo conserves en Session y puedas recuperarlo para agregar el nuevo item y entonces despues lo asignas el DataSource del grid

    Si haces un "new" de una lista vacia volcando los datos del grid es mucho trabajo, conserva la lista original en el objeto Session y vas agregando en esta los nuevos items

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    sábado, 18 de abril de 2020 20:37
  • Leadro como me indicas funciona , pero si yo voy a otra fila  con referencia diferente y le doy click al boton agregar  me agrega una nueva fila  mas las que ya se habian creado anterioromente. 

    Daniel

    sábado, 18 de abril de 2020 21:28
  • hola

    >>si yo voy a otra fila  con referencia diferente y le doy click al boton agregar  me agrega una nueva fila

    No entendi, a que fila vas y que tiene que ver esa referencia

    Se supone que agregas una fila nueva en base a datos externos al grid, no se que tiene que ver esa fila de referencia

    Si estas editando entonces cuando confirmes debas buscar la entidad en base a un id o codigo en la lista que tengas en Session y aplicar los cambios en esa instancia existente, no se usa el "new" porque ahi creas un nueva

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    sábado, 18 de abril de 2020 21:52
  • osea si necesito crear una nueva , pero cuando voy a la columna agregar donde esta el boton agregar y hago click en la fila 1  me crea una nueva debajo de la fila 1  con los mismos datos hasta ahi muy bien , pero si quiero ir ala fila 2 y agregar una fila nueva   lo hace pero tambien me trae las otras creadas antes de la fila 1 

    Daniel

    sábado, 18 de abril de 2020 22:15
  • hola

    >>cuando voy a la columna agregar donde esta el boton agregar

    porque columna? un boton de agregar debe estar por fuera del grid

    >>pero si quiero ir ala fila 2 y agregar una fila nueva   lo hace pero tambien me trae las otras creadas antes de la fila 1

    Si usas

         foreach (GridViewRow row in dgvRemision.Rows)

    estas iterando todas las filas, cuando no deberias usar ningun foreach sino determinar que la fila que lanza la accion

    Ademas usas un evento generico Click del boton, eso no es corrrecto, deberias usar el

    GridView.RowCommand Event

    definiendo un CommandName = "Add" (o el command que mas guste) en el boton que tiene en la columna

    En ese evento podrias usar el CommandArgument para conocer el Index de la row que lanzo la accion

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Dannycv012 martes, 21 de abril de 2020 21:00
    domingo, 19 de abril de 2020 18:00
  • Leandro he seguido la documentación que compartiste , trato de conservar la session  que tiene los datos en el grid  , pero cuando lanzo el evento del botón  que esta en el grid  para agregar  una nueva fila  este  lo hace pero en el footer y no debajo de la fila seleccionada y siempre carga es el primer item sea cual sea la fila que selecciones . que puedo estar haciendo mal, me podrías  corregir.

     protected void dgvRemision_RowCommand(object sender, GridViewCommandEventArgs e)
            {
               List<Productos> Lista = (List<Productos>)Session["Producto"];

                
             if (e.CommandName == "agregar")
                {
                    int index;
                    bool bIsConverted = int.TryParse(e.CommandArgument.ToString(), out index);


                    GridViewRow row = dgvRemision.Rows[index];


                    Productos Productos = new Productos();


                    Productos.Codigo = row.Cells[0].Text;
                    Productos.Referencia = row.Cells[1].Text;
                    Productos.Descrip = row.Cells[2].Text;
                    Productos.Existen = Convert.ToDecimal(row.Cells[3].Text);
                    TextBox txtMonto = row.Cells[7].FindControl("txtMonto") as TextBox;
                    Productos.Monto = Convert.ToDecimal(txtMonto.Text);

                    Lista.Add(Productos);
                    dgvRemision.DataSource = Lista;
                    dgvRemision.DataBind();



                }

            }


    Daniel


    • Editado Dannycv012 lunes, 20 de abril de 2020 4:19
    lunes, 20 de abril de 2020 1:02
  • hola

    No leiste la documentacion, alli dice

    The ButtonField class automatically populates the CommandArgument property with the appropriate index value.
    For other command buttons, you must manually set the CommandArgument property of the command button

    Sino usaste un ButtonField debes tu mismo asignar el CommandArgument

    En un ejemplo mas abajo uso

    
    
    
    CommandArgument="<%# ((GridViewRow)Container).RowIndex %>"

     como propiedad del boton

    Ademas, ojo porque esto

      List<Productos> Lista = new List<Productos>();

    esta mal

    Si creas una nueva lista cada vez que se lanza la accion, solo tendras el ultimo item

    Deberias poner la lista en Session para conservarla he ir agregando a esta

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina




    lunes, 20 de abril de 2020 4:09
  • Leandro ya me  funciona bien  , no me duplica las filas , solo la  seleccionada , pero resulta que si yo selecciono x fila esta debe cargar una nueva fila debajo de la que lanzo el indice  y no al final del grid , no se si me entiendes lo que debo hacer , en tu experiencia como podria realizar este proceso.

    Daniel

    lunes, 20 de abril de 2020 19:33