2010-12-01 668 views
27

A quien pueda interesar, he buscado una cantidad considerable de tiempo, para trabajar de una forma de salir de este errorerror: Suprimido información de la fila no se puede acceder a través de la fila

"Deleted row information cannot be accessed through the row"

entiendo que una vez que una fila se ha eliminado de una tabla de datos a la que no se puede acceder de forma típica y esta es la razón por la que recibo este error. El gran problema es que no estoy seguro de qué hacer para obtener el resultado deseado, que describiré a continuación.

Básicamente cuando se elimina una fila en "dg1", la fila debajo de ella ocupa el lugar de la fila eliminada (obviamente) y así hereda el índice de filas eliminadas. El propósito de este método es reemplazar y restablecer el índice de filas (al tomarlo del valor correspondiente en el conjunto de datos) que tomó las filas eliminadas y, como tal, el valor del índice.

Ahora mismo estoy usando una etiqueta (lblText) para intentar obtener una respuesta del proceso, pero se bloquea cuando la última instrucción anidada intenta comparar valores.

Aquí está el código:

void dg1_Click(object sender, EventArgs e) 
    { 
     rowIndex = dg1.CurrentRow.Index; //gets the current rows 
     string value = Convert.ToString(dg1.Rows[rowIndex].Cells[0].Value); 

     if (ds.Tables[0].Rows[rowIndex].RowState.ToString() == "Deleted") 
     { 

      for (int i = 0; i < dg1.Rows.Count; i++) 
      { 

       if (Convert.ToString(ds.Tables[0].Rows[i][0].ToString()) == value) 
       //^**where the error is occurring** 
       { 
        lblTest.Text = "Aha!"; 
        //when working, will place index of compared dataset value into         rowState, which is displaying the current index of the row I am focussed on in 'dg1' 
       } 
      } 
     } 

Gracias de antemano por la ayuda, realmente hice de búsqueda, y si es fácil de averiguar a través de una simple búsqueda en Google y luego permitir que me odian repetible en mí porque lo intenté

  • gc

Respuesta

31

El valor actual para la columna de datos en la instrucción if interna no estará disponible para las filas eliminadas. Para recuperar un valor para las filas eliminadas, especifique que desea el valor original. Esto debería solucionar el error:

if (Convert.ToString(ds.Tables[0].Rows[i][0, DataRowVersion.Original].ToString()) == value) 
+0

¿Por qué usas 'Convert.ToString' cuando ya has usado' .ToString() '? Esto parece redundante. –

+0

@druciferre - Estoy de acuerdo que es redundante. Copié el código original del OP y lo modifiqué para usar el valor original del DataRow. – firedfly

0

después de eliminar la fila, volver a enlazar su rejilla con la tabla de datos, sin necesidad de reiniciar manualmente el índice, Handels DataTable TI.

por lo que solo necesita volver a enlazar el origen de datos de la grilla.

+0

Siento que debería haber aclarado, no estoy tratando de actualizar el origen de datos en absoluto, estoy tratando de hacerlo de modo que, independientemente de la ubicación de las filas de la cuadrícula de datos, la cuadrícula de datos será siempre muestran el índice de esa información tal como está en el conjunto de datos. es decir, la fila 2 de la cuadrícula de datos arroja un índice de 1 pero en el conjunto de datos, el índice de esa fila es 2. sin comprometer la eliminación en la base de datos, necesito tomar el índice de esa fila del conjunto de datos y colocarlo en el datagrid así que la fila correspondiente en dg (fila con la misma información) muestra un índice de 2. – zillaofthegods

+0

tal vez estoy confundido por su explicación, todavía me estoy acostumbrando a la lógica del acceso a la base de datos C#. – zillaofthegods

12

En su "estrellarse si", se puede comprobar si se suprime la línea antes de acceder a su valores:

if (ds.Tables[0].Rows[i].RowState != DataRowState.Deleted && 
    Convert.ToString(ds.Tables[0].Rows[i][0].ToString()) == value) 
{ 
    // blaaaaa 
} 

Además, no estoy seguro de por qué toString() RowState en lugar de compararlo con DataRowState.Deleted.

36

También puede usar el método AcceptChanges() de DataSet para aplicar las eliminaciones completamente.

ds.Tables[0].Rows[0].Delete(); 
ds.AcceptChanges(); 
Cuestiones relacionadas