C sharp - System.ArgumentOutOfRangeException: Index was out

 
Vista:

System.ArgumentOutOfRangeException: Index was out

Publicado por Maria (5 intervenciones) el 07/09/2006 14:36:18
Tengo un problema urgente y me preguntaba si podriais echarme una mano. Os lo hagradeceria muchisimo.
Tengo un programa en C# que tiene dos datagrid.
En el primero meto los datos que ha buscado el usuario. La busqueda se hace en una funcion que devuelve un arrayList con objetos y es asignado al datasource. Lo rellenamos y en el evento de currentcell le decimos que lo que seleccione pase a otro datagrid.
El otro datagrid no tiene evento alguno solo un campo editable para cambiar la cantidad.
Mi problema es que aleatoriamente y no siempre al hacer lo mismo me sale la siguiente excepcion.

System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index

Alguien podria decirme que es lo que esta pasando? siempre hay datos en las filas sobre las que pincho y cuando se digna a debugear el indice es correcto. Que hago mal o que esta pasando? o Como puedo capturar ese error?

Muchas gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:System.ArgumentOutOfRangeException: Index was o

Publicado por fisa (87 intervenciones) el 07/09/2006 17:37:13
por mas que haya filas en el datagrid, si no tenes seleccionada ninguna, el selectedindex es -1
Fijate si tenes alguna seleccionada, es comun que suceda por ejemplo que eliminas una fila, y entonces no te queda ninguna otra seleccionada
Asi y todo, estoy tirando ideas, porque mucha informacion no das como para entender bien lo que pasa, deberias poner el procedimiento para que lo veamos, y marcar en que linea te queda el error...

Espero haber sido de ayuda.
Suerte!

Bye!

Fisa
Correo: [email protected]
MSN: [email protected]
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:System.ArgumentOutOfRangeException: Index was o

Publicado por Maria (5 intervenciones) el 12/09/2006 16:42:50
Muchas gracias por responder.

Me explicare un poco mejor.
El primer datagrid lo relleno con un arraylist. Tengo una funcion que devuelve los objetos en un campo de tipo ArrayList y se los asigna al datagrid:
Pincho sobre un boton de busqueda:

data=ArticleManager.getStocks(" AND code LIKE '%" +this.spare_text_textBox.Text+"%'");
if(data.Count==0)
{
MessageBox.Show(Idioma.getValor("Combo_Empty"),"Gessat");
dataGrid1.DataSource= new ArrayList()
}

********************************************************************************
En el método de Currentcell el valor que pinche será añadido a otro Datagrid y si ya existia en el otro datagrid se sumara a la cantidad de piezas que se eligieron.

try
{
string qty = "1"; //Por defecto tiene que haber una pieza
Stock stock = (Stock)(((ArrayList)this.dataGrid1.DataSource)[this.dataGrid1.CurrentCell.RowNumber]);

ArrayList parts= (ArrayList)this.dgParts.DataSource;//recojo el objeto seleccionado
bool existe = false;
PartsAllocatedLocal local = null;

for(int i=0;i<parts.Count;i++)
{
local = (PartsAllocatedLocal)parts[i];
ArrayList prueba=new ArrayList();
if(stock.Code.Equals(local.Prod_code))
{
existe = true;
double add = Convert.ToDouble(qty)+Convert.ToDouble(local.Quantity);
local.Quantity = add.ToString();
local.Status = "U";
local.Charge = labour.Change_flag;

if(local.Replacement.Equals("Y"))//el 2º datagrid tiene 1 checkBox //siempre ira chequeado por defecto
{
local.Check=true;
}
else
{
local.Check=false;
}

dataBase.updatePartAllocated(local);
break;
}
}

if(!(existe)) /si la pieza ya estaba
{
User user= GestorUsuarios.getUsuario();
double price= 0.0;
if(this.labour.Ocf_spare_part.Equals("Y"))
{
try
{
//catalogue
string priceAux = dataBase.getPrice(stock.Code);
price = Convert.ToDouble((priceAux.Replace('.',',')));
//price = price*Convert.ToDouble(qty);
}
catch(Exception except)
{
price=0.0;
}
}//else price=0

local = new PartsAllocatedLocal(this.detailLocal.Formated_Callid,user.UserId,stock.Code,qty,"","",stock.Prod_desc,price.ToString().Replace(',','.'),"N","N",labour.Change_flag,"N","");
local.Replacement = "Y";

dataBase.insertPartAllocated(local);//insertamos la pieza
if(local.Price=="0")
{
local.Price="0.0";
}
parts.Add(local);
Stock vanStock = new Stock("",stock.Code,qty,stock.Prod_desc,"",this.detailLocal.Formated_Callid,"","","");

}

//this.dgParts.Refresh();
if (this.btnDelete.Enabled==false)
{
this.dgParts.DataSource = new ArrayList();
this.btnDelete.Enabled=true;
}
this.dgParts.DataSource = new ArrayList();
this.dgParts.Refresh();
this.dgParts.DataSource = parts;
this.dgParts.Refresh();
}
catch(System.Exception ex)
{
}

***************************************************************
El otro datagrid, dataparts no tiene codigo. Tiene un campo de tipo checked, la descripción, el código y la cantidad que es modificable.

Uno de los problemas es que cuando me da el error no siempre he hecho lo mismo y no para aunque hayas puesto puntos de ruptura.
Algunas veces casca al elegir uno de arriba o al cambiar la cantidad en el segundo o si le das varias veces otras no hace nada. También puse un try cash pero nada.

See the end of this message for details on invoking
just-in-time (JIT) debugging instead of this dialog box.

************** Exception Text **************
System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
at System.Collections.ArrayList.get_Item(Int32 index)
at System.Windows.Forms.CurrencyManager.CancelCurrentEdit()
at System.Windows.Forms.DataGrid.HandleEndCurrentEdit()
at System.Windows.Forms.DataGrid.OnLeave_Grid()
at System.Windows.Forms.Control.InvokeMarshaledCallbacks()

Un saludo y muchisimas gracias por tu ayuda
MAria
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:System.ArgumentOutOfRangeException: Index was o

Publicado por fisa (87 intervenciones) el 13/09/2006 14:17:56
El problema de que no haga nada cuando le haces clic varias veces es simple. Vos pusiste todo tu codigo en el evento CurrentCellChanged
Este evento solamente se ejecuta cuando cambias de celda seleccionada. Si haces varias veces clic en la misma fila, la celda actual no cambia, y por eso no se ejecuta el evento.
Tendrias que poner todo el codigo en el evento clic
Y el error de indices, despues de un rato de analizar tu codigo, se me ocurren dos posibilidades:

1) que se este ejecutando el evento en situaciones donde no hay una celda valida seleccionada, y por eso no encuentra fila a pasar al otro datagrid

2) que en algun caso extraño, alguna de las celdas del primer datagrid este vacia, entonces cuando obtiene el array de valores, no coincida despues con las posiciones y la cantidad de valores de las columnas del segundo datagrid, o algun problema de ese estilo...

Otra posibilidad no se me ocurre, ademas no lo puedo probar porque necesitaria las definiciones de un monton de clases, pero espero haber ayudado al menos en algo
Como siempre, cualquier duda, dispuesto a seguir ayudando

Suerte,
Bye!

Fisa
Correo: [email protected]
MSN: [email protected]
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar