Title: El índice estaba fuera del intervalo. Debe ser un valor no negativo e inferior al tamaño de la colección
Tags: c#
Question: en esta ocacion tengo un caso peculiar, pues me sale el error que que menciono en el titulo.
Lo que pasa es que carga una lista de una base de datos y filtro mediante una caja de texto para que me muestro los registros de cada filtro, lo que pasa es que cuando selecciono un registro me sale ese error y muestra en una columna en especial el error, ya busque de todo y no encuentro la siolucion :( espero su ayuda:
A continuacion adjunto codigo:
-- Codigo que carga el Grid:
private void dgvProducto_CellClick_2(object sender, dataGridViewCellEventArgs e)
int fila = dgvProducto.CurrentRow.Index;
if (fila &gt; -1)
{
txtidProd.Text = dgvProducto.Rows[fila].Cells[0].Value.ToString();
txtProducto.Text = dgvProducto.Rows[fila].Cells[1].Value.ToString();
txtStock.Text = dgvProducto.Rows[fila].Cells[2].Value.ToString();
txtprecio.Text = dgvProducto.Rows[fila].Cells[3].Value.ToString();
dgvProducto.Visible = false;
}
ojo: el error esta en txtStock y no se porque ya que cuando muestra en el grid si existe esa columna . Mi codigo esta en c#
Comment: como esta definida la grilla? existe la celda 2?

Comment: Si existe, como digo todo los campos existen.Lo interesante es que cuando hay mas de una fila aparece ese error, osea si escojo la primera fila carga normal pero en las siguientes me genera el error


Here is another answer: Si usas el evento CellClick tiene el argumento para obtener la row seleccionada usando
private void dgvProducto_CellClick(object sender, DataGridViewCellEventArgs e)
var row = (DataGridViewRow)dgvProducto.Rows[e.RowIndex];
txtidProd.Text = row.Cells[0].Value.ToString();
txtProducto.Text = row.Cells[1].Value.ToString();
//resto
como veras se usa el e.RowIndex
Evalua usar el evento DataGridView.CellContentClick Event
Para obtener los datos por el nombre de la columna podrias localizar esta por el nombre sobre la coleccion de columnas y depsues con ese index accedes al dato de la celda
var stockindex = datagridview1.Columns["Stock"].Index;
txtStock.Text = row.Cells[stockindex].Value.ToString();
En este caso "Stock" deberia reemplazarlo por el nombre que lleve la columna
Comment for this answer: Compañero hice lo que sugerio en la primera instancia usando el e.RowIndex i me sale el error "Referencia a objeto no establecida como instancia de un objeto." y justo el error me sale en la misma ubicacion osea en txtStock :( aun no comprendo porque
Comment for this answer: entonces quiere decir que no tiene la cantidad de columnas que piensas tienes, si usas row.Cells.Count que valor obtienes ?
Comment for this answer: Utilize el  int fila=dgvProducto.Rows.Count; y me sale 5 osea si existe la fila de txtStock
Comment for this answer: Lo extraño es que el numero de filas que me sale no concuerdaº con el numero de columnas reales que tiene el grid ya que en el grid muestra 4 columnas y no 5 :(
Comment for this answer: como defines las columnas?, se crean dinamicamente cuando asignas el DataSource o las creas en tiempo de diseño, indicando el DataPropertyName para indicar el mapping del dato que se muestra
Comment for this answer: es un metodo de busquedad por filtrado lo utilizo en el envento TextChanged de una caja de texto el codigo es este
dgvProducto.DataSource = vent.Buscar(txtProducto.Text);
Comment for this answer: pero el filtro no tiene nada que ver con las columnas, puedes definir estas en diseño si lo necesitas
Comment for this answer: es que en el filtro carga automaticamente el grid, ya que en la base de datos uso un PA de Busqueda que filtra mediante una consulta el codigo es este:
Create Proc Buscar_Producto(@CADENA VARCHAR(25))
select p.Cod_Producto,p.Descripcion ,m.Descripcion as 'Marca',t.Descripcion as 'Tipo de Producto' from Producto p inner join Marca m on m.Cod_Marca=p.Cod_Marca inner join Tipo_Producto t on t.Cod_Tipo_Prod=p.Cod_Tipo_Prod WHERE p.Descripcion LIKE @CADENA+'%'
Comment for this answer: entonces las columnas se definen dinamicamente segun los datos que asignas, porque esa query que muestras no muestra stock ni precio, podrias intentar usando la opcion que mencione de linq para ver si lo encuentra basado en el name
Comment for this answer: Lo intentare... intentando...
Comment for this answer: No estara en una fila vacia leandro?
Comment for this answer: se podria validar si hay una seleccion valida de la row si se usa if(e.RowIndex > 0), aunque seria mejor usar el evento CellContentClick
Comment for this answer: me podrian ayudar a utilizar el LINQ es que no entiendo mucho de donde sale ese c.Name :(
Comment for this answer: Lo interesante es que cuando hay mas de una fila aparece ese error, osea si escojo la primera fila carga normal pero en las siguientes me genera el error
Comment for this answer: hay otra forma sin usar linq de acceder al index de la columna por el nombre:  var stockindex = datagridview1.Columns["Stock"].Index;  txtStock.Text = row.Cells[stockindex].Value.ToString();
Comment for this answer: la verdad esta raro lo que comentas, si pones un breakpoint y ejecutas paso a paso inspeccionando las variables, que valores va tomando?
Comment for this answer: ya lo hice desde un principio toma un valor nulo, lo estoy revisando  y como ven en mi codigo yo pongo cuatro valores, los primeros dos valores (que son el codigo y el nombre del producto)funciones correctamente, pero los que siguen tienen el error , ahora es raro porque yo tengo otra busquedad de la misma manera (osea con el mismo filtro) y me funciona muy bien
Comment for this answer: Logre darle solucion , pero no es la qeu esperaba y tampoco entiendo el porque , lo que hice es hacer lo que me indicaste var stockindex = datagridview1.Columns["Stock"].Index; txtStock.Text = row.Cells[stockindex].Value.ToString(); para el stock y precio que son los datos que arrojaban error no se porque solo esos dos me arrojan error pero tratare de averiguarlo , de todas maneras gracias
Comment for this answer: genial, bueno al menos hay una solucion, voy a editar la respuesta para poner esto como sugerencia

{'source': 'StackExchangeDataset', 'subset': 'es.stackoverflow.com', 'metadata': {'AnswerCount': 1, 'CommentCount': 2, 'ContentLicense': 'CC BY-SA 4.0', 'CreationDate': '2019:00:01/08/19', 'FavoriteCount': None, 'PostTypeId': 1, 'Tags': '<c#>', 'Title': 'El índice estaba fuera del intervalo. Debe ser un valor no negativo e inferior al tamaño de la colección', 'ViewCount': 2750, 'id': 227957, 'user_AboutMe': None, 'user_AccountId': 14829324.0, 'user_DisplayName': 'Jose Enrique Puente Arca', 'user_Reputation': 33.0, 'user_Views': 12.0, 'user_id': 108549.0}}