Principales respuestas
Agregar fila desde boton en gridview

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
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
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
-
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 buttonSino 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
- Editado Leandro TuttiniMVP lunes, 20 de abril de 2020 4:11
- Marcado como respuesta Dannycv012 martes, 21 de abril de 2020 21:00
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 -
-
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 -
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
-
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
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
-
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
-
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 buttonSino 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
- Editado Leandro TuttiniMVP lunes, 20 de abril de 2020 4:11
- Marcado como respuesta Dannycv012 martes, 21 de abril de 2020 21:00
-
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