DATASET DATAGRID ITEMINDEX DATASETINDEX

Discussion in 'ASP .Net Web Controls' started by Jose Fernandez, May 25, 2005.

  1. Hola
    Tengo un nuevo problema.

    Tengo un datagrid (dg) que lo "filleo" con un Datatable(Tables[1]) de un
    Dataset (Ds).

    dg.DataSource=Ds.Tables[1];

    El datagrid tiene activado los eventos Delete, Update, Edit.

    Eso va bien.

    Ahora. esta es la situacion. Ese dataset tiene 3 records. Cuando borro en el
    dataset(mediante el metodo dg_DeleteCommand(object Source, EventArgs e))
    cualquier record que no sea el ultimo, luego recibo el siguiente error si
    trato de Editar o Insertar o cualquier accion con un nuevo registro en el
    datagrid. El error que recido es el siguiente

    System.Data.DeletedRowInaccessibleException: Deleted row information cannot
    be accessed.

    El error me da pienso porque en el Dataset se mantiene ese row ocupado
    aunque marcado como Deleted en el RowState property y cuando trato de tomar
    el valor del supuesto Item, encuentra que no es el index en el dataset que
    devuelve el datagrid.

    Algo curioso es que en el evento Delete_Command yo tenia previamente este
    codigo y no me daba problemas

    DataRow oRow= oDs.Tables[1].Rows[e.Item.ItemIndex];
    oDs.Tables[1].Rows.Remove(oRow);
    ActualizarGrilla(SubCategorias,1);

    PERO con este metodo, el dataset no reconoce cambios (ds.HasChanges()
    premanece FALSE) y yo necesito que si lo reconozca. Solo con el metodo
    siguiente me cambia la propiedad HasChange a TRUE

    DataRow oRow= oDs.Tables[1].Rows[e.Item.ItemIndex];
    oRow.Delete();
    ActualizarGrilla(SubCategorias,1);

    Encontre que hay dos propiedades en e.item. Una es ItemIndex y la otra es
    DataSetIndex. Tenia esperanzas que DataSetIndex me devolviera el indice en
    el dataset justo como lo habia traido de la base de datos.. pero no.
    ALGUIEN CONOCE las diferencias entre uno y otro? Yo no se las veo, pero las
    debe tener.
    Alguien sabe como se puede resolver este problema?
    Saludos
    Jose Fernandez, May 25, 2005
    #1
    1. Advertising

  2. Hola Jose!

    La diferencia entre Remove y Delete es la siguiente (sacado de la
    documentación del VS -> DataRow(Clase) ):
    "Puede eliminar un DataRow de DataRowCollection llamando al método Remove de
    DataRowCollection, o bien llamando al método Delete del objeto DataRow. El
    método Remove quita de la colección la fila. En cambio, Delete marca el
    DataRow que se va a quitar. La eliminación real se produce cuando se llama
    al método AcceptChanges. Al llamar a Delete, se puede comprobar mediante
    programación qué filas están marcadas para eliminación antes de
    eliminarlas."

    Creo que tu problema es que cuando en tu segundo código utilizas
    oRow.Delete() y llamas a ActualizarGrilla() no utlizas AcceptChanges lo que
    provoca que el Row siga ahí. No puedes utlizar Remove, porque este método lo
    que hace es eliminar el registro del DataTable pero no del origen de datos.

    Espero que te sirva, un saludo!

    "Jose Fernandez" <> escribió en el mensaje
    news:...
    > Hola
    > Tengo un nuevo problema.
    >
    > Tengo un datagrid (dg) que lo "filleo" con un Datatable(Tables[1]) de un
    > Dataset (Ds).
    >
    > dg.DataSource=Ds.Tables[1];
    >
    > El datagrid tiene activado los eventos Delete, Update, Edit.
    >
    > Eso va bien.
    >
    > Ahora. esta es la situacion. Ese dataset tiene 3 records. Cuando borro en

    el
    > dataset(mediante el metodo dg_DeleteCommand(object Source, EventArgs e))
    > cualquier record que no sea el ultimo, luego recibo el siguiente error si
    > trato de Editar o Insertar o cualquier accion con un nuevo registro en el
    > datagrid. El error que recido es el siguiente
    >
    > System.Data.DeletedRowInaccessibleException: Deleted row information

    cannot
    > be accessed.
    >
    > El error me da pienso porque en el Dataset se mantiene ese row ocupado
    > aunque marcado como Deleted en el RowState property y cuando trato de

    tomar
    > el valor del supuesto Item, encuentra que no es el index en el dataset que
    > devuelve el datagrid.
    >
    > Algo curioso es que en el evento Delete_Command yo tenia previamente este
    > codigo y no me daba problemas
    >
    > DataRow oRow= oDs.Tables[1].Rows[e.Item.ItemIndex];
    > oDs.Tables[1].Rows.Remove(oRow);
    > ActualizarGrilla(SubCategorias,1);
    >
    > PERO con este metodo, el dataset no reconoce cambios (ds.HasChanges()
    > premanece FALSE) y yo necesito que si lo reconozca. Solo con el metodo
    > siguiente me cambia la propiedad HasChange a TRUE
    >
    > DataRow oRow= oDs.Tables[1].Rows[e.Item.ItemIndex];
    > oRow.Delete();
    > ActualizarGrilla(SubCategorias,1);
    >
    > Encontre que hay dos propiedades en e.item. Una es ItemIndex y la otra es
    > DataSetIndex. Tenia esperanzas que DataSetIndex me devolviera el indice en
    > el dataset justo como lo habia traido de la base de datos.. pero no.
    > ALGUIEN CONOCE las diferencias entre uno y otro? Yo no se las veo, pero

    las
    > debe tener.
    > Alguien sabe como se puede resolver este problema?
    > Saludos
    >
    >
    Jose Antonio Torralba, May 28, 2005
    #2
    1. Advertising

  3. Creo que lo unico que me queda es en el evento DELETE del datagrid ir
    llenando un array con los items que voy borrando y despues quitarlos de la
    base de datos. podria hacer esto directamente en el evento pero no quiero
    hacer cambios en la base de datos hasta que el usuario no haya terminado de
    trabajar con el dataset.

    gracias por la respuesta.

    "Jose Antonio Torralba gmail.com>" <joseatorralba<ARROBA> wrote in message
    news:Ow8gd%...
    > Hola Jose!
    >
    > La diferencia entre Remove y Delete es la siguiente (sacado de la
    > documentación del VS -> DataRow(Clase) ):
    > "Puede eliminar un DataRow de DataRowCollection llamando al método Remove
    > de
    > DataRowCollection, o bien llamando al método Delete del objeto DataRow. El
    > método Remove quita de la colección la fila. En cambio, Delete marca el
    > DataRow que se va a quitar. La eliminación real se produce cuando se llama
    > al método AcceptChanges. Al llamar a Delete, se puede comprobar mediante
    > programación qué filas están marcadas para eliminación antes de
    > eliminarlas."
    >
    > Creo que tu problema es que cuando en tu segundo código utilizas
    > oRow.Delete() y llamas a ActualizarGrilla() no utlizas AcceptChanges lo
    > que
    > provoca que el Row siga ahí. No puedes utlizar Remove, porque este método
    > lo
    > que hace es eliminar el registro del DataTable pero no del origen de
    > datos.
    >
    > Espero que te sirva, un saludo!
    >
    > "Jose Fernandez" <> escribió en el mensaje
    > news:...
    >> Hola
    >> Tengo un nuevo problema.
    >>
    >> Tengo un datagrid (dg) que lo "filleo" con un Datatable(Tables[1]) de un
    >> Dataset (Ds).
    >>
    >> dg.DataSource=Ds.Tables[1];
    >>
    >> El datagrid tiene activado los eventos Delete, Update, Edit.
    >>
    >> Eso va bien.
    >>
    >> Ahora. esta es la situacion. Ese dataset tiene 3 records. Cuando borro en

    > el
    >> dataset(mediante el metodo dg_DeleteCommand(object Source, EventArgs e))
    >> cualquier record que no sea el ultimo, luego recibo el siguiente error si
    >> trato de Editar o Insertar o cualquier accion con un nuevo registro en el
    >> datagrid. El error que recido es el siguiente
    >>
    >> System.Data.DeletedRowInaccessibleException: Deleted row information

    > cannot
    >> be accessed.
    >>
    >> El error me da pienso porque en el Dataset se mantiene ese row ocupado
    >> aunque marcado como Deleted en el RowState property y cuando trato de

    > tomar
    >> el valor del supuesto Item, encuentra que no es el index en el dataset
    >> que
    >> devuelve el datagrid.
    >>
    >> Algo curioso es que en el evento Delete_Command yo tenia previamente este
    >> codigo y no me daba problemas
    >>
    >> DataRow oRow= oDs.Tables[1].Rows[e.Item.ItemIndex];
    >> oDs.Tables[1].Rows.Remove(oRow);
    >> ActualizarGrilla(SubCategorias,1);
    >>
    >> PERO con este metodo, el dataset no reconoce cambios (ds.HasChanges()
    >> premanece FALSE) y yo necesito que si lo reconozca. Solo con el metodo
    >> siguiente me cambia la propiedad HasChange a TRUE
    >>
    >> DataRow oRow= oDs.Tables[1].Rows[e.Item.ItemIndex];
    >> oRow.Delete();
    >> ActualizarGrilla(SubCategorias,1);
    >>
    >> Encontre que hay dos propiedades en e.item. Una es ItemIndex y la otra es
    >> DataSetIndex. Tenia esperanzas que DataSetIndex me devolviera el indice
    >> en
    >> el dataset justo como lo habia traido de la base de datos.. pero no.
    >> ALGUIEN CONOCE las diferencias entre uno y otro? Yo no se las veo, pero

    > las
    >> debe tener.
    >> Alguien sabe como se puede resolver este problema?
    >> Saludos
    >>
    >>

    >
    >
    Jose Fernandez, May 30, 2005
    #3
  4. No es necesario que utilices un array para almacenar los items borrados ya
    que el propio DataSet guarda versiones de la filas, es decir, cuando
    eliminas una el DataSet la marca como Deleted. Además el comportamiento de
    quieres (no guardar la info en BD hasta que el usuario termine con el
    dataset) lo puedes implementar con AcceptChanges y RejectChanges.

    Un saludo!

    "Jose Fernandez" <> escribió en el mensaje
    news:...
    > Creo que lo unico que me queda es en el evento DELETE del datagrid ir
    > llenando un array con los items que voy borrando y despues quitarlos de la
    > base de datos. podria hacer esto directamente en el evento pero no quiero
    > hacer cambios en la base de datos hasta que el usuario no haya terminado

    de
    > trabajar con el dataset.
    >
    > gracias por la respuesta.
    >
    > "Jose Antonio Torralba gmail.com>" <joseatorralba<ARROBA> wrote in message
    > news:Ow8gd%...
    > > Hola Jose!
    > >
    > > La diferencia entre Remove y Delete es la siguiente (sacado de la
    > > documentación del VS -> DataRow(Clase) ):
    > > "Puede eliminar un DataRow de DataRowCollection llamando al método

    Remove
    > > de
    > > DataRowCollection, o bien llamando al método Delete del objeto DataRow.

    El
    > > método Remove quita de la colección la fila. En cambio, Delete marca el
    > > DataRow que se va a quitar. La eliminación real se produce cuando se

    llama
    > > al método AcceptChanges. Al llamar a Delete, se puede comprobar mediante
    > > programación qué filas están marcadas para eliminación antes de
    > > eliminarlas."
    > >
    > > Creo que tu problema es que cuando en tu segundo código utilizas
    > > oRow.Delete() y llamas a ActualizarGrilla() no utlizas AcceptChanges lo
    > > que
    > > provoca que el Row siga ahí. No puedes utlizar Remove, porque este

    método
    > > lo
    > > que hace es eliminar el registro del DataTable pero no del origen de
    > > datos.
    > >
    > > Espero que te sirva, un saludo!
    > >
    > > "Jose Fernandez" <> escribió en el mensaje
    > > news:...
    > >> Hola
    > >> Tengo un nuevo problema.
    > >>
    > >> Tengo un datagrid (dg) que lo "filleo" con un Datatable(Tables[1]) de

    un
    > >> Dataset (Ds).
    > >>
    > >> dg.DataSource=Ds.Tables[1];
    > >>
    > >> El datagrid tiene activado los eventos Delete, Update, Edit.
    > >>
    > >> Eso va bien.
    > >>
    > >> Ahora. esta es la situacion. Ese dataset tiene 3 records. Cuando borro

    en
    > > el
    > >> dataset(mediante el metodo dg_DeleteCommand(object Source, EventArgs

    e))
    > >> cualquier record que no sea el ultimo, luego recibo el siguiente error

    si
    > >> trato de Editar o Insertar o cualquier accion con un nuevo registro en

    el
    > >> datagrid. El error que recido es el siguiente
    > >>
    > >> System.Data.DeletedRowInaccessibleException: Deleted row information

    > > cannot
    > >> be accessed.
    > >>
    > >> El error me da pienso porque en el Dataset se mantiene ese row ocupado
    > >> aunque marcado como Deleted en el RowState property y cuando trato de

    > > tomar
    > >> el valor del supuesto Item, encuentra que no es el index en el dataset
    > >> que
    > >> devuelve el datagrid.
    > >>
    > >> Algo curioso es que en el evento Delete_Command yo tenia previamente

    este
    > >> codigo y no me daba problemas
    > >>
    > >> DataRow oRow= oDs.Tables[1].Rows[e.Item.ItemIndex];
    > >> oDs.Tables[1].Rows.Remove(oRow);
    > >> ActualizarGrilla(SubCategorias,1);
    > >>
    > >> PERO con este metodo, el dataset no reconoce cambios (ds.HasChanges()
    > >> premanece FALSE) y yo necesito que si lo reconozca. Solo con el metodo
    > >> siguiente me cambia la propiedad HasChange a TRUE
    > >>
    > >> DataRow oRow= oDs.Tables[1].Rows[e.Item.ItemIndex];
    > >> oRow.Delete();
    > >> ActualizarGrilla(SubCategorias,1);
    > >>
    > >> Encontre que hay dos propiedades en e.item. Una es ItemIndex y la otra

    es
    > >> DataSetIndex. Tenia esperanzas que DataSetIndex me devolviera el indice
    > >> en
    > >> el dataset justo como lo habia traido de la base de datos.. pero no.
    > >> ALGUIEN CONOCE las diferencias entre uno y otro? Yo no se las veo, pero

    > > las
    > >> debe tener.
    > >> Alguien sabe como se puede resolver este problema?
    > >> Saludos
    > >>
    > >>

    > >
    > >

    >
    >
    Jose Antonio Torralba, May 31, 2005
    #4
  5. No No.
    El DELETE no me resuelve el problema pues si el cliente me borra un registro
    intermedio mediante DELETE, ya despues cuando trata de modificar cualquier
    registro que tomo el index en el datagrid da error pues en el dataset existe
    ese index marcado como deleted pero existe. por lo que da error.
    con el RemoveAt me lo borra completo del dataset y despues no se definir
    quien fue borrado.
    AcceptChanges me borra los rows marcados como deleted y despues no tengo
    modo de saber a la hora de actualizar la database.
    no veo otra alternativa que esa.
    Saludos

    "Jose Antonio Torralba gmail.com>" <joseatorralba<ARROBA> wrote in message
    news:%23dG$...
    > No es necesario que utilices un array para almacenar los items borrados ya
    > que el propio DataSet guarda versiones de la filas, es decir, cuando
    > eliminas una el DataSet la marca como Deleted. Además el comportamiento de
    > quieres (no guardar la info en BD hasta que el usuario termine con el
    > dataset) lo puedes implementar con AcceptChanges y RejectChanges.
    >
    > Un saludo!
    >
    > "Jose Fernandez" <> escribió en el mensaje
    > news:...
    >> Creo que lo unico que me queda es en el evento DELETE del datagrid ir
    >> llenando un array con los items que voy borrando y despues quitarlos de
    >> la
    >> base de datos. podria hacer esto directamente en el evento pero no quiero
    >> hacer cambios en la base de datos hasta que el usuario no haya terminado

    > de
    >> trabajar con el dataset.
    >>
    >> gracias por la respuesta.
    >>
    >> "Jose Antonio Torralba gmail.com>" <joseatorralba<ARROBA> wrote in
    >> message
    >> news:Ow8gd%...
    >> > Hola Jose!
    >> >
    >> > La diferencia entre Remove y Delete es la siguiente (sacado de la
    >> > documentación del VS -> DataRow(Clase) ):
    >> > "Puede eliminar un DataRow de DataRowCollection llamando al método

    > Remove
    >> > de
    >> > DataRowCollection, o bien llamando al método Delete del objeto DataRow.

    > El
    >> > método Remove quita de la colección la fila. En cambio, Delete marca el
    >> > DataRow que se va a quitar. La eliminación real se produce cuando se

    > llama
    >> > al método AcceptChanges. Al llamar a Delete, se puede comprobar
    >> > mediante
    >> > programación qué filas están marcadas para eliminación antes de
    >> > eliminarlas."
    >> >
    >> > Creo que tu problema es que cuando en tu segundo código utilizas
    >> > oRow.Delete() y llamas a ActualizarGrilla() no utlizas AcceptChanges lo
    >> > que
    >> > provoca que el Row siga ahí. No puedes utlizar Remove, porque este

    > método
    >> > lo
    >> > que hace es eliminar el registro del DataTable pero no del origen de
    >> > datos.
    >> >
    >> > Espero que te sirva, un saludo!
    >> >
    >> > "Jose Fernandez" <> escribió en el mensaje
    >> > news:...
    >> >> Hola
    >> >> Tengo un nuevo problema.
    >> >>
    >> >> Tengo un datagrid (dg) que lo "filleo" con un Datatable(Tables[1]) de

    > un
    >> >> Dataset (Ds).
    >> >>
    >> >> dg.DataSource=Ds.Tables[1];
    >> >>
    >> >> El datagrid tiene activado los eventos Delete, Update, Edit.
    >> >>
    >> >> Eso va bien.
    >> >>
    >> >> Ahora. esta es la situacion. Ese dataset tiene 3 records. Cuando borro

    > en
    >> > el
    >> >> dataset(mediante el metodo dg_DeleteCommand(object Source, EventArgs

    > e))
    >> >> cualquier record que no sea el ultimo, luego recibo el siguiente error

    > si
    >> >> trato de Editar o Insertar o cualquier accion con un nuevo registro en

    > el
    >> >> datagrid. El error que recido es el siguiente
    >> >>
    >> >> System.Data.DeletedRowInaccessibleException: Deleted row information
    >> > cannot
    >> >> be accessed.
    >> >>
    >> >> El error me da pienso porque en el Dataset se mantiene ese row
    >> >> ocupado
    >> >> aunque marcado como Deleted en el RowState property y cuando trato de
    >> > tomar
    >> >> el valor del supuesto Item, encuentra que no es el index en el dataset
    >> >> que
    >> >> devuelve el datagrid.
    >> >>
    >> >> Algo curioso es que en el evento Delete_Command yo tenia previamente

    > este
    >> >> codigo y no me daba problemas
    >> >>
    >> >> DataRow oRow= oDs.Tables[1].Rows[e.Item.ItemIndex];
    >> >> oDs.Tables[1].Rows.Remove(oRow);
    >> >> ActualizarGrilla(SubCategorias,1);
    >> >>
    >> >> PERO con este metodo, el dataset no reconoce cambios (ds.HasChanges()
    >> >> premanece FALSE) y yo necesito que si lo reconozca. Solo con el metodo
    >> >> siguiente me cambia la propiedad HasChange a TRUE
    >> >>
    >> >> DataRow oRow= oDs.Tables[1].Rows[e.Item.ItemIndex];
    >> >> oRow.Delete();
    >> >> ActualizarGrilla(SubCategorias,1);
    >> >>
    >> >> Encontre que hay dos propiedades en e.item. Una es ItemIndex y la otra

    > es
    >> >> DataSetIndex. Tenia esperanzas que DataSetIndex me devolviera el
    >> >> indice
    >> >> en
    >> >> el dataset justo como lo habia traido de la base de datos.. pero no.
    >> >> ALGUIEN CONOCE las diferencias entre uno y otro? Yo no se las veo,
    >> >> pero
    >> > las
    >> >> debe tener.
    >> >> Alguien sabe como se puede resolver este problema?
    >> >> Saludos
    >> >>
    >> >>
    >> >
    >> >

    >>
    >>

    >
    >
    Jose Fernandez, Jun 1, 2005
    #5
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. DataGrid change ItemIndex

    , Jan 5, 2006, in forum: ASP .Net
    Replies:
    1
    Views:
    487
    S. Justin Gengo
    Jan 6, 2006
  2. Rod
    Replies:
    2
    Views:
    856
  3. Alan Eilers

    ItemIndex is -1 in ItemCommand after selecting page in DataGrid

    Alan Eilers, May 12, 2004, in forum: ASP .Net Datagrid Control
    Replies:
    1
    Views:
    235
    Scott Mitchell [MVP]
    May 13, 2004
  4. Scott M.

    e.Item.ItemIndex and e.Item.DataSetIndex

    Scott M., Nov 1, 2004, in forum: ASP .Net Datagrid Control
    Replies:
    7
    Views:
    257
    Steven Cheng[MSFT]
    Apr 13, 2005
  5. susie
    Replies:
    0
    Views:
    148
    susie
    Sep 29, 2003
Loading...

Share This Page